AS集成FFmpeg
项目简介:
该项目通过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显 示;
编译
流程
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
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 】
注意:
- 权限 root 必须是root (root # 没有root $)
- 手动创建输出的文件夹 /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
- 创建Project Native C++
2.将arm文件下相应文件导入
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} )
- 修改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 <jni.h>
#include <string>
extern "C"{
#include <libavutil/avutil.h>
}
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
帮助文档
致谢:
如果您觉得我的此项目对您有些帮助,您的star就是对我最大的鼓励!