这个月要负责一个项目,使用FFMPEG渲染视频,主要是Android端的,由于性能要求,要使用硬解码,但网上大多数教程都是没有libstagefright的,所以个人觉得,生成的so库文件也是没有开启libstagefright硬解码,于是自己去编译一次,期间遇到的所有坑,都记录下来,为了不再重蹈覆辙!

  1. 编译环境:Ubuntu14.04+NDK-r9+FFMPEG2.8.6 (环境需各位自行下载配置,下载最新版的应该也没问题)
  2. 编译libstagefright还要安装git
    sudo apt-get install git
  3. Ubuntu的安装和配置就不说了,NDK的配置也略过了(不配置也行,解压就OK了),解压FFMPEG这个应该也没问题,路径可以随便设置,记住就好
  4. 下载update-cm-7.0.3-N1-signed.zip,并放到FFMPEG文件夹的上一层目录,不用解压
  5. 修改FFMPEG目录下的configure文件,将enabled libstagefright_h264  && require_cpp libstagefright_h264 改为 enabled libstagefright && require_cpp libstagefright_h264,否则会出现ERROR: libstagefright_h264 not found
  6. 还是修改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)'
  7. 在解压后的FFMPEG目录添加 *.sh 脚本文件,命名也是随便,本例就命名为“config_android.sh”,并把以下脚本复制到config_android.sh中
     #!/bin/bash
    export NDK=/opt/android/android-ndk-r9
    SYSROOT=$NDK/platforms/android-/arch-arm/
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 git clone --depth= --branch gingerbread-release https://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base
    git clone --depth= --branch gingerbread-release https://github.com/CyanogenMod/android_system_core.git ../android-source/system/core # Libraries from any froyo/gingerbread device/emulator should work
    # fine, since the symbols used should be available on most of them.
    if [ ! -d "../android-libs" ]; then
    if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then
    wget http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip -P../
    fi
    unzip ../update-cm-7.0.-N1-signed.zip system/lib/* -d../
    mv ../system/lib ../android-libs
    rmdir ../system
    fi function build_one
    {
    ./configure \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --enable-libstagefright-h264 \
    --disable-doc \
    --disable-ffserver \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --target-os=linux \
    --arch=arm \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS $EXTRA_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS $EXTRA_LDFLAGS" \
    --extra-cxxflags="$EXTRA_CXXFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    } ANDROID_SOURCE=../android-source
    ANDROID_LIBS=../android-libs
    ABI="armeabi-v7a" EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI/include"
    EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon" EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -lstagefright -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared" EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti" CPU=armeabi-v7a
    PREFIX=$(pwd)/android/$CPU
    ADDI_CFLAGS="-marm"
    build_one
    make clean
    make -j4 || exit 1
  8. 修改FFMPEG目录下的libavcodec/libstagefright.cpp
    !mate
    替换为
    mate != NULL
  9. 给build_android.sh 和 configure 增加可执行权限:

    chmod+x ./build_android.shchmod+x ./configure
  10. 最后编译:
    sudo ./config_android.sh
    sudo make install
  11. 编译完成后,会在FFMPEG中生成一个android目录,里面包含库文件和头文件等。

教程经过亲自实践,有任何问题,一起讨论,有任何错误,请指出。

参考资料:

  ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

  ffmpeg编译android 硬解码支持库 libstagefright

Linux下使用NDK编译FFMPEG(libstagefright)的更多相关文章

  1. FFmpeg编译:Linux下使用NDK编译FFmpeg

    环境: Ubuntu 1.下载并解压FFmpeg3.4.zip(略) 2.将编译脚本放入到FFmpeg解压后的目录. 3.执行编译脚本: ./linux_build_android.sh linux_ ...

  2. Linux下NDK编译FFMPEG包含neon参数

    FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstag ...

  3. NDK编译FFMpeg[Linux]

    最近在研究视频直播相关的技术,了解到了FFmpeg,就在网上查看如何将FFmpeg移植到Android中,查了几天,看的东西不少,就是没有一个可以完全移植成功的,最后通过产看各种资料,结合网上的资料, ...

  4. ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. anroid ndk编译ffmpeg 引用librtmp libx264

    Ffmpeg 无处不在,自然android系统少不了它,折腾了不少时间完成 ndk编译ffmpeg,生成so库中引用了外部库librtmp,libx264.条条大路通罗马, 也许还有别的更好的方法去完 ...

  6. 用Android NDK编译FFmpeg

    附(2018-01-06):     有一个将x264及lame等库集成进去了且基于android的ffmpeg的编译方法,地址参见:       https://github.com/writing ...

  7. 64位 CentOS NDK 编译 FFMPEG

    64位 CentOS NDK 编译 FFMPEG 一.           参考文章: http://www.cnblogs.com/baopu/p/4733029.html http://www.c ...

  8. windows 7下mingw+msys编译ffmpeg

      windows 7下mingw+msys编译ffmpeg   1-->下载安装MingW,mingw-get-inst-20120426.exe  http://sourceforge.ne ...

  9. windows下用vs2010编译ffmpeg

    转载自;http://q1q2q3q4q5q6ln.blog.163.com/blog/static/500794332014666536283/ (注意:请务必先阅读:七,后记补充:) ffmpeg ...

随机推荐

  1. 如何安装node.js支持插件

    在eclipse插件中,node.js插件中比较知名的是nodeclipse. 从HBuilder6.3起,工具-插件安装,可直接选择nodeclipse插件安装.安装完毕后重启HBuilder新建n ...

  2. Hibernate总结(二)

    在上一篇Hibernate总结(一)简单总结了一级缓存,快照,增删改查的简单使用,这一篇总结两张表的级联操作. 级联涉及到三种情况,many-many,1-many,many-1. 首先是1-many ...

  3. No.016:3Sum Closest

    问题: Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  4. Spark集群 + Akka + Kafka + Scala 开发(2) : 开发一个Spark应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境,我们已经部署好了一个Spark的开发环境. 本文的目标是写一个Spark应用,并可以在集群中测试. ...

  5. 高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布

    HP-Socket 是一套通用的高性能 Windows Socket 组件包,包含服务端组件(IOCP 模型)和客户端组件(Event Select 模型),广泛适用于 Windows 平台的 TCP ...

  6. 获取spring容器要小心的坑

    情景: 今天想把一个web应用中的上传路劲更改一下 于是就在配置文件作了如下变动: <bean id="uploadServelt" class="com.xxxx ...

  7. Oracle EBS Form Builder使用Java beans创建窗体

    最近有个项目,需要研究一下Oracle的E-Business Sutie(EBS),对于以前没接触此套件的我来说,简直太痛苦了.在网上找了一堆资料,试着进行Form二次开发,也遇到各类奇葩问题.目前遇 ...

  8. babel 无法解析jsx (webpack react )

    webpack.config.js的配置如下图: 报错: 修改webpack.config.js文件,如下即可:

  9. 【移动适配】一个像素的border怎么实现

    一个像素里复杂纷扰的世界 文 | 啃先生 Mar.3rd.2016  首发于微信公众号(啃先生) 上一篇发了<[移动适配]移动Web怎么做屏幕适配> 壹 | Fisrt 在CSS的世界里P ...

  10. Eclipse OSGi调试过程

    当你在开发的插件直接运行的时候,看起来正常的.但导出放到eclipse时候,又发觉不对劲,插件运行有问题.这个时候需要去OSGi的控制台调试插件,这一篇文章将讲述怎么简单调试eclipse插件(插件已 ...