热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中使用ffmpeg,个人学习记录

前言:要使用ffmpeg就是用它的各种库,这里用动态so库,使用centos7编译。1.租一台云服务器,部署centos72

前言:要使用ffmpeg就是用它的各种库,这里用动态so库,使用centos7编译。
1.租一台云服务器,部署centos7
2.wget xxxxffmpeg安装包地址 //这里我使用3.3的
3.tar -xzf xxx安装包 //解压
4.mkdir ndkbuild 并进入此目录 /
5.wget 下载ndk包 //这里选择14b的
6.unzip 安装包
7.cd 退到根目录后:vim ~/.bashrc 进入后改为:

export NDKROOT=/root/ndkbuild/android-ndk-r14b//配置你的安装路径
export PATH=$NDKROOT:$PATH//配置路径

保存退出:wq!
8 :source ~/.bashrc //执行后修改环境变量
9.进入ffmpeg包目录,新建vim android_build.sh,并写入

#!/bin/bashecho "进入FFmpeg编译脚本"export NDK=/root/ndkbuild/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-21/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PREFIX=android-buildCOMMON_OPTIONS="\--prefix=android/ \--target-os=android \--enable-shared \--enable-runtime-cpudetect \--enable-small \--disable-static \--disable-debug \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \--disable-doc \--disable-symver \--disable-asm \--disable-stripping \--disable-armv5te \"function build_android {echo "开始编译FFmpeg..."# armeabiecho "开始编译FFmpeg(armeabi)"./configure \--libdir=${PREFIX}/libs/armeabi \--incdir=${PREFIX}/include/armeabi \--pkgconfigdir=${PREFIX}/pkgconfig/armeabi \--arch=arm \--cpu=armv6 \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--sysroot=$SYSROOT \--extra-ldexeflags=-pie \${COMMON_OPTIONS}make cleanmake -j8 && make installecho "结束编译FFmpeg(armeabi)"# armeabi-v7aecho "开始编译FFmpeg(armeabi-v7a)"./configure \--libdir=${PREFIX}/libs/armeabi-v7a \--incdir=${PREFIX}/include/armeabi-v7a \--pkgconfigdir=${PREFIX}/pkgconfig/armeabi-v7a \--arch=arm \--cpu=armv7-a \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--sysroot=$SYSROOT \--extra-cflags="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \--extra-ldexeflags=-pie \${COMMON_OPTIONS}make cleanmake -j8 && make installecho "结束编译FFmpeg(armeabi-v7a)"# arm64-v8aecho "开始编译FFmpeg(arm64-v8a)"./configure \--libdir=${PREFIX}/libs/arm64-v8a \--incdir=${PREFIX}/include/arm64-v8a \--pkgconfigdir=${PREFIX}/pkgconfig/arm64-v8a \--arch=aarch64 \--cpu=armv8-a \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--sysroot=$SYSROOT \--extra-ldexeflags=-pie \${COMMON_OPTIONS} make cleanmake -j8 && make installecho "结束编译FFmpeg(arm64-v8a)"# x86_64echo "开始编译FFmpeg(x86_64)"./configure \--libdir=${PREFIX}/libs/x86_64 \--incdir=${PREFIX}/include/x86_64 \--pkgconfigdir=${PREFIX}/pkgconfig/x86_64 \--arch=x86_64 \--cpu=x86_64 \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--sysroot=$SYSROOT \--extra-ldexeflags=-pie \${COMMON_OPTIONS}make cleanmake -j8 && make installecho "结束编译FFmpeg(x86_64)"echo "编译结束"};
build_android

10.给android_build.sh修改权限,添加执行权限
chmod +x android_build.sh
11.修改ffmpeg包目录下的configure文件
将:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替换为:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

最后在ffmpeg包目录下执行sh文件

./android_build.sh

编译后ffmpeg包下会多一个android-build目录,里面就是include目录下得到各种架构的头文件和libs目录下的各种架构的so动态库

二:将ffmpeg动态库移植到安卓工程中
1.新建一个ndk项目
2.将CmakeLists.txt文件移动到和gradle文件同目录下(即app目录下)
3.将CmakeLists .txt文件修改为:


cmake_minimum_required(VERSION 3.4.1)add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/native-lib.cpp)find_library( log-liblog )include_directories(libs/include)
set(DIR ../../../../libs)
add_library(avcodecSHAREDIMPORTED)
set_target_properties(avcodecPROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libavcodec.so)add_library(avdeviceSHAREDIMPORTED)
set_target_properties(avdevicePROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libavdevice.so)
add_library(avformatSHAREDIMPORTED)
set_target_properties(avformatPROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libavformat.so)
add_library(avutilSHAREDIMPORTED)
set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libavutil.so)
add_library(swresampleSHAREDIMPORTED)
set_target_properties(swresamplePROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libswresample.so)
add_library(swscaleSHAREDIMPORTED)
set_target_properties(swscalePROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libswscale.so)
add_library(avfilterSHAREDIMPORTED)
set_target_properties(avfilterPROPERTIES IMPORTED_LOCATION${DIR}/armeabi-v7a/libavfilter.so)
target_link_libraries( native-libavfilteravcodecavdeviceavformatavutilswresampleswscale${log-lib}android)

4.修改gradle文件,:

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"sourceSets {main {jniLibs.srcDirs = ['libs']jni.srcDirs = []}}externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}ndk {abiFilters 'armeabi-v7a'}

5.在libs文件下新建armeabi-v7a目录,将编译后的armeabi-v7a目录下的so库复制到armeabi-v7a目录下
6.在libs文件下新建include目录,将编译后include\armeabi-v7a目录的文件全部复制到include目录下
整体项目结构如图:
在这里插入图片描述
到此就可以了,后面就是写代码实现视频播放了,发现播放好慢,后面看看别人写的模仿学习吧,毕竟刚学,哈哈。
参考1
参考2


推荐阅读
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统
    本文详细介绍了在VMware虚拟机中部署带有中文图形界面的CentOS 7 Linux系统的步骤。首先,通过“文件”菜单选择“新建虚拟机”并进入自定义设置。接着,在硬盘兼容性选项中选择默认设置。为了更好地进行Linux操作系统的安装练习,建议选择稍后安装操作系统,并在虚拟机安装完成后,根据实际需求删除不必要的硬件组件。此外,本文还提供了详细的配置参数和注意事项,帮助用户顺利完成整个部署过程。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
author-avatar
潇潇沐林风_921
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有