# FFmpegBuild **Repository Path**: LinHaitao/ffmpeg-build ## Basic Information - **Project Name**: FFmpegBuild - **Description**: FFmpeg集成编译 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-09-11 - **Last Updated**: 2024-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: ffmpeg ## README # AS集成FFmpeg 项目简介: ==== ![Image text](https://img.shields.io/badge/%E7%8A%B6%E6%80%81-%E7%BB%B4%E6%8A%A4%E4%B8%AD-green.svg) ![Image text](https://img.shields.io/badge/%E7%89%88%E6%9C%AC-1.0.0-brightgreen.svg) ![Image text](https://img.shields.io/badge/%E7%BC%96%E8%AF%91%E6%83%85%E5%86%B5-%E6%AD%A3%E5%B8%B8%E7%BC%96%E8%AF%91-green.svg) ![Image text](https://img.shields.io/badge/as%E7%89%88%E6%9C%AC-4.1.1-brightgreen) ![Image text](https://img.shields.io/badge/Gradle%E7%89%88%E6%9C%AC-gradle-6.5-bin-brightgreen) ![Image text](https://img.shields.io/badge/Gradle插件%E7%89%88%E6%9C%AC-4.0.0-brightgreen) ![Image text](https://img.shields.io/badge/FFmpeg%E7%89%88%E6%9C%AC-4.0.2-brightgreen) ![Image text](https://img.shields.io/badge/NDK%E7%89%88%E6%9C%AC-22.1.7171670-brightgreen)![Image text](https://img.shields.io/badge/LinuxNDK%E7%89%88%E6%9C%AC-r17c-brightgreen) 该项目通过Linux系统编译FFmpeg,并集成到Android Studio项目中。 # FFmpeg简介 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL 或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编 解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责 维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务 器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 多媒体视频处理工具 FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等 。 libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和 读取音视频帧等功能; libavcodec:用于各种类型声音/图像编解码; libavutil:包含一些公共的工具函 数; libswscale:用于视频场景比例缩放、色彩映射转换; libpostproc:用于后期效果处理; ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等; ffsever:一个 HTTP 多媒体即时广播串流服务器; ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显 示; [ffmpeg官网]( http://www.ffmpeg.org/about.html) # 编译 ## 流程 ![](./app/preview/procedure.png) [NDK 下载](https://developer.android.google.cn/ndk/downloads/older_releases) [Android NDK r17c](https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip) ## Linux系统FFmpeg编译 **下载NDK r17c** wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip **解压zip** unzip android-ndk-r17c-linux-x86_64 [FFmpeg各版本下载](http://www.ffmpeg.org/releases/) **下载FFmpeg** wget http://www.ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2 **解压FFmpeg** tar -xjf ffmpeg-4.0.2.tar.bz2【错误写法,可能导致下一步失败】 tar -jxvf ffmpeg-4.2.2.tar.bz2 **编译** ./configure 【报错,需要关闭 asm 汇编相关】 ./configure --disable-x86asm 【生成 Makefile 已经帮你关闭 asm 】 注意: 1. 权限 root 必须是root (root # 没有root $) 2. 手动创建输出的文件夹 /android/arm **在ffmpeg-4.0.2目录下添加文件 build_android.sh** ``` #!/bin/bash # 首先定义一个NDK目录的变量 NDK_ROOT NDK_ROOT=/root/study/ndk/android-ndk-r17c # 此变量执行ndk中的交叉编译gcc所在目录 TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 #从as的 externalNativeBuild/xxx/build.ninja, 反正下面的配置,可以压制警告的意思 FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC" INCLUDES=" -isystem $NDK_ROOT/sources/android/support/include" # 1.定义编译后,所存放的目录 PREFIX=./android/arm # 2.--enable-small 优化大小 非常重要,必须优化才行的哦 # 3.--disable-programs 不编译ffmpeg程序(命令行工具),我们是需要获取静态、动态库 # 4.--disable-avdevice 关闭avdevice模块,此模块在android中无用 # 5.--disable-encoders 关闭所有编码器(播放不需要编码) # 6.--disable-muxers 关闭所有复用器(封装器),不需要生成mp4这样的文件,所有关闭 # 7.--disable-filters 关闭所有滤镜 # 8.--enable-cross-compile 开启交叉编译(ffmpeg是跨平台的,注意:并不是所有库都有这么happy的选项) # 9.--cross-prefix 看右边的值就知道是干嘛的,gcc的前缀.. # 10.disable-shared / enable-static 这个不写也可以,默认就是这样的,(代表关闭动态库,开启静态库) # 11.--sysroot # 12.--extra-cflags 会传给gcc的参数 # 13.--arch --target-os ./configure \ --prefix=$PREFIX \ --enable-small \ --disable-programs \ --disable-avdevice \ --disable-encoders \ --disable-muxers \ --disable-filters \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --disable-shared \ --enable-static \ --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ --extra-cflags="$FLAGS $INCLUDES" \ --extra-cflags="-isysroot $NDK_ROOT/sysroot/" \ --arch=arm \ --target-os=android make clean make install ``` sh build_android.sh 结果:在arm文件下生成文件 include lib share ## AS 集成FFmpeg **当前配置:** **AS 4.1.1** **NDK** **22.1.7171670** **SDK 30.0.3** **minSDKVersion 19** 1. 创建Project Native C++ ![](./app/preview/c++.png) 2.将arm文件下相应文件导入 ![](./app/preview/include.png) 3.修改CMakeLists.txt文件 ``` project("ndkdemo") 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). native-lib.cpp ) #引入头文件 FFmpeg include_directories(${CMAKE_SOURCE_DIR}/include) #引入库文件FFmpeg set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}") find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log ) target_link_libraries( # Specifies the target library. native-lib #顺序 avformat avcodec avfilter avutil swresample swscale #忽略顺序问题 # -Wl,--start-group # avformat avcodec avfilter avutil swresample swscale # -Wl,--end-group # Links the target library to the log library # included in the NDK. ${log-lib} ) ``` 1. 修改build.gradle ``` defaultConfig { applicationId "com.example.ndkdemo" minSdkVersion 19 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "" abiFilters 'armeabi-v7a' } } ndk{ abiFilters 'armeabi-v7a' } } ``` 4.修改native-lib.cpp ``` #include #include extern "C"{ #include } extern "C" JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */) { std::string hello = "当前的FFmpeg的版本是:"; hello.append(av_version_info()); return env->NewStringUTF(hello.c_str()); } ``` 5.run 结果 当前的FFmpeg的版本是:4.0.2 ## 文件 需要.sh文件和编译后文件的可自取 链接:https://pan.baidu.com/s/1-0RLKoZybKx4x4ts8Z9xOw 提取码:ysri # 相关问题以及解决方案 ## XXX:未找到命令 ### wget ``` yum -y install wget ``` ### unzip ``` yum list | grep zip/unzip yum install zip (提示输入y) yum install unzip ( 提示输入y) ``` ### vim ``` rpm -qa|grep vim yum -y install vim-enhanced ``` ## tar (child): bzip2:无法 exec: 没有那个文件或目录 ``` yum -y install bzip2 ``` ## gcc is unable to create an executable file. ``` gcc is unable to create an executable file. If gcc is a cross-compiler, use the --enable-cross-compile option. Only do this if you know what cross compiling means. C compiler test failed. If you think configure made a mistake, make sure you are using the latest version from Git. If the latest version fails, report the problem to the ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net. Include the log file "ffbuild/config.log" produced by configure as this will help solve the problem. ``` 原因:linux系统没有安装gcc编译器 ``` yum install gcc ``` # 帮助文档 [帮助文档](https://www.yuque.com/linhaitao-215ba/tp4l95/qggwdb) [项目代码](https://gitee.com/LinHaitao/ffmpeg-build) 关于我: ==== [![Wercker](https://img.shields.io/badge/%E5%85%B3%E4%BA%8E%E6%88%91-CSDN-brightgreen.svg)](https://blog.csdn.net/weixin_45583281?spm=1000.2115.3001.5343&type=blog) 致谢: ==== 如果您觉得我的此项目对您有些帮助,您的star就是对我最大的鼓励!