美文网首页
FFmpeg:一、FFmpeg的编译

FFmpeg:一、FFmpeg的编译

作者: re冷星 | 来源:发表于2016-09-20 10:37 被阅读998次

首先致敬雷神
感谢他为音视频方向做的贡献,愿天堂没有代码。

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

我这一块是初学者,主要记录自己学习的过程,方便以后再做这一块的时候不用到处找资料。

这一篇主要讲FFmpeg在linux环境下编译。

一些所需要的文件链接:http://pan.baidu.com/s/1o7YqeUm 密码:aqig

  1. 首先上传ffmpeg-2.6.9.zip到相关目录并解压。


    FFmpeg文件夹
  2. 复制build_android.sh 到解压后的文件夹
    这是一个shell脚本,执行这个文件就会执行里面的东西,这个文件里面的内容暂时还没有去研究,直接拿过来用了。这个是别人写的。

  3. 复制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文件夹下。至于为什么要这样,我也不知道,我是实验出来的结果。

lib文件夹
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");
}

其他没有什么特别要强调的。
这篇大概就说这些。

相关文章

网友评论

      本文标题:FFmpeg:一、FFmpeg的编译

      本文链接:https://www.haomeiwen.com/subject/wptoettx.html