|
我觉得一篇文章的
前言太重要了。读完前言基本上就知道作者接下来要讲什么
前言: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"
|
ffmpeg for android stagefirght 硬件加速的编译方法
最新推荐文章于 2026-04-24 04:06:01 发布
本文详细介绍了如何在Android环境下,利用FFmpeg结合Stagefright实现硬件加速编译的过程,涉及到关键步骤配置、库文件整合以及流媒体处理的优化,旨在提升多媒体处理性能。

5189

被折叠的 条评论
为什么被折叠?



