ffmpeg for android stagefirght 硬件加速的编译方法
2013-07-01 17:44
1151 查看
[align=center][/align] 我觉得一篇文章的前言太重要了。读完前言基本上就知道作者接下来要讲什么 前言:android 的视频解码方面的开发在 4.1 后才友好的对外开放。硬件加速各种不兼容,格式, 单高通的方案 就分2.1 2.3 4.0 4.2 需要在不同的源代码(一个版本的代码几十个G)环境下编译,单单这一点就搞死了许多小团队 小公司。(MX PLAY 巨牛叉) 再这之前最好的方案还是ffmpeg 不过也局限在720P 20fps HP 3M码流以下。 处于对性能的追求才有下面的文章。 通过stagefright框架 ffmpeg去寻找android下面的openmax 硬解码组件。 编译环境:ubuntu 10.04 git1.8 ffmpeg0.11.2 ndk-r8d ffmpeg0.11.2 网上下载 5.7MB NDK-r8d android官网下载 编译后动态库的大小为36.2 MB 编译的方法如下: 修改FFMPEG/tools下面的build_stagefirght.sh 如下 #!/bin/bash NDK=/mnt/android/android-ndk/android-ndk-r8d WORKSPACE=/mnt/android/forffmpeg if [ "$NDK" = "" ]; then echo NDK variable not set, assuming ${HOME}/android-ndk export NDK=${HOME}/android-ndk fi echo "Fetching Android system headers" #git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git $WORKSPACE/android-source/frameworks/base #git clone --depth=1 --branch cm-10.1 git://github.com/CyanogenMod/android_frameworks_av.git $WORKSPACE/android-source/frameworks/av #git clone --depth=1 --branch cm-10.1 git://github.com/CyanogenMod/android_frameworks_native.git $WORKSPACE/android-source/frameworks/native #git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_hardware_libhardware.git $WORKSPACE/android-source/hardware/libhardware #git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git $WORKSPACE/android-source/system/core #echo "Fetching Android libraries for linking" # Libraries from any froyo/gingerbread device/emulator should work # fine, since the symbols used should be available on most of them. #if [ ! -d "$WORKSPACE/android-libs" ]; then # if [ ! -f "$WORKSPACE/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 $WORKSPACE/update-cm-7.0.3-N1-signed.zip system/lib/* -d../ # mv $WORKSPACE/system/lib $WORKSPACE/android-libs # rmdir $WORKSPACE/system #fi SYSROOT=$NDK/platforms/android-9/arch-arm # Expand the prebuilt/* path into the correct one #TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/*-x86` TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86 export PATH=$TOOLCHAIN/bin:$PATH ANDROID_SOURCE=$WORKSPACE/android-source ANDROID_LIBS=$WORKSPACE/android-libs ABI="armeabi-v7a" CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm rm -rf ../build/stagefright mkdir -p ../build/stagefright DEST=../build/stagefright DEST="$DEST/$ABI" FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a --cc=$CC --nm=$NM" FLAGS="$FLAGS --sysroot=$SYSROOT" FLAGS="$FLAGS --disable-avdevice --disable-encoders --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264 --enable-asm --enable-neon" #FLAGS="$FLAGS --disable-shared --enable-static --disable-avdevice --disable-parsers --enable-parser=h264 --disable-filters --disable-decoders --disable-demuxers --disable-network --disable-protocols --disable-swscale --disable-swresample --enable-avformat --enable-avcodec --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-devices --disable-postproc --disable-avfilter --disable-swscale-alpha --disable-bsfs --disable-encoders --disable-muxers --disable-indevs --disable-debug --disable-doc --enable-zlib --enable-pic --disable-optimizations --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264 --enable-asm --enable-neon" #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.6/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI/include" #EXTRA_CFLAGS="/ffmpeg-0.11.2/build/stagefright/armeabi-v7a/include" EXTRA_CFLAGS="-I$DEST/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/native/include/media/openmax" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/av/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/system/core/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/hardware/libhardware/include" #EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/stlport/stlport" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8" EXTRA_CFLAGS="$EXTRA_CFLAGS -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -D_STLP_USE_NEWALLOC" 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.6/libs/$ABI" EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti" FLAGS="$FLAGS --prefix=$DEST" #mkdir -p $DEST echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt ../configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt #[ $PIPESTATUS == 0 ] || exit 1 echo "prebuild finish" make clean make -j4 install $TOOLCHAIN/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o $TOOLCHAIN/bin/arm-linux-androideabi-ld -rpath-link=$TOOLCHAIN/usr/lib -L$TOOLCHAIN/usr/lib -L$ANDROID_LIBS -soname libffmpeg-neon.so -shared -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $DEST/libffmpeg-neon.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a -lc -lm -lz -ldl -llog -lstdc++ -lmedia -lutils -lstagefright -lbinder --dynamic-linker=/system/bin/linker $NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a 上面的脚本不能直接复制粘贴用 需要修改如下 NDK的路径 改为自己NDK的路径 编译stagefight 需要依赖android的系统源代码和库 所以上面脚本注释掉的下载部分需要根据脚本上的地址手动下载。并解压到脚本中制定的目录下 (需要稍微懂一点shell )脚本上的下载地址经过本人亲自测试可用 ; 其他的部分不需要修改; 如果想加快编译速度 修改这句 make -j4 install 数字部分对应你的机器的CPU核心数 我的是I3 处理器 。 需要注意一点的是 编译出.a库 再编译.so库 如果出现的编译引用错误 试着把用到模板库由stlport 改为stlc++ 即libstlport_static.a改为 libgnustl_static.a #EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/stlport/stlport" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/include" EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/$ABI/include" 下一篇 如何在android使用硬件加速解码视频 |
相关文章推荐
- FFmpeg for Android 编译方法 (Linux环境)
- ffmpeg 编译好的库文件和可执行程序----for android
- FFmpeg3.2最新版编译Mediacodec For Android脚本
- ffmpeg编译android 硬解码支持库 libstagefright
- ffmpeg的编译大全(包括 ffmpeg for android)
- Compile FFmpeg for Android(编译用于android的FFmpeg库)
- 站在巨人的肩膀上--傻瓜式编译ffmpeg for android
- [原]ffmpeg编译android 硬解码支持库 libstagefright
- android源码编译出现No private recovery resources for TARGET_DEVICE解决方法
- android源码编译出现No private recovery resources for TARGET_DEVICE解决方法
- android studio DEX 方法超过64K限制和gradle编译OOM问题解决,异常名:Error:Execution failed for task ':app:dexDebug'. >
- android源码编译出现No private recovery resources for TARGET_DEVICE解决方法
- ffmpeg neon优化必看!!android下编译ffmpeg with neon的正确方法(已验证)
- ffmpeg for android 独立ndk以及android项目下编译 --ubuntu
- ffmpeg for android 独立ndk以及android项目下编译 --ubuntu
- windows10下编译ffmpeg for android
- FFmpeg 1.2 for Android 编译动态库
- 站在巨人的肩膀上--傻瓜式编译ffmpeg for android
- 在CentOS中编译FFmpeg for Android静态库(含fdk aac,x264)
- android源码编译出现No private recovery resources for TARGET_DEVICE解决方法