您的位置:首页 > 移动开发 > Android开发

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使用硬件加速解码视频

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: