ffmpeg for android stagefirght 硬件加速的编译方法

本文详细介绍了如何在Android环境下,利用FFmpeg结合Stagefright实现硬件加速编译的过程,涉及到关键步骤配置、库文件整合以及流媒体处理的优化,旨在提升多媒体处理性能。
我觉得一篇文章的 前言太重要了。读完前言基本上就知道作者接下来要讲什么
前言: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
#    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使用硬件加速解码视频


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值