首先致敬雷神
感谢他为音视频方向做的贡献,愿天堂没有代码。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
我这一块是初学者,主要记录自己学习的过程,方便以后再做这一块的时候不用到处找资料。
这一篇主要讲FFmpeg在linux环境下编译。
一些所需要的文件链接:http://pan.baidu.com/s/1o7YqeUm 密码:aqig
-
首先上传ffmpeg-2.6.9.zip到相关目录并解压。
复制build_android.sh 到解压后的文件夹
这是一个shell脚本,执行这个文件就会执行里面的东西,这个文件里面的内容暂时还没有去研究,直接拿过来用了。这个是别人写的。-
复制configure 到解压后的文件夹
这个是FFmpeg的配置文件,主要是要修改些东西,原本生成的.so文件是带版本号的,如.so.56这种,这种Android不能用,就要改生成的名字。
大致位置在2780行这里,代码如下#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)' #relengxing SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)'
这一个脚本是编译全部库的,裁剪还有一些配置都可以在脚本中设置,只是这一块我还不会。以后有机会再研究研究。大家尽量多参考参考雷神的文章。
然后直接运行脚本就可以了。 ./build_android.sh 然后就可以去喝杯茶了,大概30分钟后见。
编译成功后会生成一个android的文件夹,把这个文件夹复制到我们windows的系统上来
然后就可以放如Android工程了,我这里是放在app的同级目录arm下的
如果还不会AS NDK配置环境的可以参考这篇:Android Studio 2.2NDK开发环境配置
注意
注意
注意
重要的事说三遍
如下图所示,lib文件要再往下移一级,放在armeabi文件夹下。至于为什么要这样,我也不知道,我是实验出来的结果。
add_library(avcodec SHARED IMPORTED )
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libavcodec-56.so)
add_library(avdevice SHARED IMPORTED )
set_target_properties(avdevice PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libavdevice-56.so)
add_library(avfilter SHARED IMPORTED )
set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libavfilter-5.so)
add_library(avformat SHARED IMPORTED )
set_target_properties(avformat PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libavformat-56.so)
add_library(avutil SHARED IMPORTED )
set_target_properties(avutil PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libavutil-54.so)
add_library(postproc SHARED IMPORTED )
set_target_properties(postproc PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libpostproc-53.so)
add_library(swresample SHARED IMPORTED )
set_target_properties(swresample PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libswresample-1.so)
add_library(swscale SHARED IMPORTED )
set_target_properties(swscale PROPERTIES IMPORTED_LOCATION
${lib_DIR}/lib/${ANDROID_ABI}/libswscale-3.so)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
add_library( # Sets the name of the library.
native
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
# Associated headers in the same location as their source
# file are automatically included.
src/main/cpp/native.c )
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
log android
avcodec avdevice avfilter avformat avutil postproc swresample swscale yuv
)
这里强调一下${ANDROID_ABI},我第一次配置的时候.so就在arm/lib下,然后我是这样写的
set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION ${lib_DIR}/lib/libavcodec-56.so)
但是就是报错了,我也不知道为什么,最后就改成了把.so放在arm/lib/armeabi下和下面这行,然后就编译通过了。
set_target_properties(avdevice PROPERTIES IMPORTED_LOCATION ${lib_DIR}/lib/${ANDROID_ABI}/libavdevice-56.so)
然后就是注意加载的顺序
static {
System.loadLibrary("avutil-54");
System.loadLibrary("swresample-1");
System.loadLibrary("avcodec-56");
System.loadLibrary("avformat-56");
System.loadLibrary("swscale-3");
System.loadLibrary("postproc-53");
System.loadLibrary("avfilter-5");
System.loadLibrary("avdevice-56");
System.loadLibrary("native");
}
其他没有什么特别要强调的。
这篇大概就说这些。