ffmpeg编译android 硬解码支持库 libstagefright(1)—— git-hub&nb

原文:http://blog.sina.com.cn/s/blog_4868f98601016qd3.html


最经一直在搞andoid下ffmpeg视频优化 ,前文已经说了neon优化的方法 ,性能大大提升。 不过再快终究是软解码 ,和硬解码还是不能比,我们的目标是更快更快更快!那么要让ffmpeg支持硬解码就必须用android的媒体库 

  libstagefright
    下载libstagefright的花就要到ffmpeg 目录的tools 目录下面, 这里有个  build-libstagefright.sh , 其内容如下:
     
#!/bin/bash
#在这里添加你的NDK目录
if [ "$NDK" = "" ]; then
    echo NDK variable notset, assuming ${HOME}/android-ndk
    exportNDK=${HOME}/android-ndk
fi

echo "Fetching Android system headers"
git clone --depth=1 --branchgingerbread-releasegit://github.com/CyanogenMod/android_frameworks_base.git../android-source/frameworks/base
git clone --depth=1 --branchgingerbread-releasegit://github.com/CyanogenMod/android_system_core.git../android-source/system/core

echo "Fetching Android libraries for linking"
# Libraries from any froyo/gingerbread device/emulator shouldwork
# fine, since the symbols used should be available on most ofthem.
if [ ! -d "../android-libs" ]; then
    if [ ! -f"../update-cm-7.0.3-N1-signed.zip" ]; then
        wgethttp://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip-P../
    fi
    unzip../update-cm-7.0.3-N1-signed.zip system/lib/* -d../
    mv ../system/lib../android-libs
    rmdir ../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.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH
ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
ABI="armeabi-v7a"

rm -rf ../build/stagefright
mkdir -p ../build/stagefright

DEST=../build/stagefright
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi---arch=arm --cpu=armv7-a"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --disable-avdevice --disable-decoder=h264--disable-decoder=h264_vdpau --enable-libstagefright-h264"

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++/include-I$NDK/sources/cxx-stl/gnu-libstdc++/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++/libs/$ABI"
EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions-fno-rtti"
DEST="$DEST/$ABI"
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,说明这个脚本要移动到上级目录去执行,也就是ffmpeg目录下。而不是仅仅把 ./configure 修改为../configure ,不然找不到头文件什么的,我之前说错了sorry 
./configure $FLAGS--extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS"--extra-cxxflags="$EXTRA_CXXFLAGS" | tee$DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
make clean
make -j4 || exit 1

你会发现这里面绿色的两行是要用git工具的。 git是啥? github 专用的下载工具,功能和svn类似。
这个东西用apt-get install 的方法居然装不上,后来用新立德软件管理器安装成功了,oh-yeah! 
但是接下来遇到一个问题: 我们公司是有代理网关的, 通过网关要用户密码。 而git始终没有办法通过代理网关。
网上提供的方法多半是装一个connect 工具, 进行端口转换。我觉得太麻烦了。经过一番折腾之后惊奇的发现,把  git://github.com/CyanogenMod/...修改为  https://github.com/CyanogenMod/ 就能下载了! !
还在被代理困扰的孩纸们可以试试 

脚本最后执行了make。是会编译的,而且在编译之前会先执行configure配置(原先的配置项会保留,同时会追加编译stagefright 需要的参数)

 
 不过我现在在预编译时候出错:configure 执行报错,
END /tmp/ffconf.rwJcAHAu.cpp
arm-linux-androideabi-g++--sysroot=/opt/android-ndk-r8c/platforms/android-9/arch-arm-D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE-D_POSIX_C_SOURCE=200112 -D_XOP
EN_SOURCE=600 -DPIC-I../android-source/frameworks/base/include-I../android-source/system/core/include-I../android-source/frameworks/base/media/libstagefright-I../android-sou
rce/frameworks/base/include/media/stagefright/openmax-I/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/include-I/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/libs/arme
abi-v7a/include -march=armv7-a -mfloat-abi=softfp -mfpu=neon-march=armv7-a -std=c99 -fomit-frame-pointer -fPIC -marm-Wno-multichar -fno-exceptions -fno-rtti -D__STDC_CONSTANT_
MACROS -c -o /tmp/ffconf.VAwd3um2.o/tmp/ffconf.rwJcAHAu.cpp
cc1plus: warning: command line option "-std=c99" is valid forC/ObjC but not for C++
In file included from../android-source/frameworks/base/include/binder/IBinder.h:23,
                  from../android-source/frameworks/base/include/binder/ProcessState.h:20,
                  from/tmp/ffconf.rwJcAHAu.cpp:1:
../android-source/frameworks/base/include/utils/Vector.h:20:15:error: new: No such file or directory
出错的这个文件引用的是这个头:
#ifndef ANDROID_VECTOR_H
#define ANDROID_VECTOR_H
#include<new>
#include <stdint.h>
#include <sys/types.h>
#include <utils/Log.h>
#include<utils/VectorImpl.h>
#include<utils/TypeHelpers.h>



今天又看了一下: 找到原因了:
注意看一下之前的build脚本中,有这样一段:
-I/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include
而实际上,你会发现头文件所在的实际路径是这样的:
  /opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/ 4.4.3/include
所以要把所有这些路径修正一下 ,成功编译出.a 文件了。


不过在链接这些.a文件的时,又出现这样的报错:
。。。
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functionStagefright_decode_frame(AVCodecContext*, void*, int*,AVPacket*):/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.4.3/include/bits/stl_tree.h:274:error: undefined reference to'std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)'
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functionStagefright_decode_frame(AVCodecContext*, void*, int*,AVPacket*):/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.4.3/include/bits/stl_tree.h:923:error: undefined reference to'std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*,std::_Rb_tree_node_base*,std::_Rb_tree_node_base&)'
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functionStagefright_decode_frame(AVCodecContext*, void*, int*,AVPacket*):/opt/android-ndk-r8c/sources/cxx-stl/gnu-libstdc++/4.4.3/include/bits/stl_tree.h:274:error: undefined reference to'std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)'
。。。
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functiondecode_thread(void*):libavcodec/libstagefright.cpp:180: error:undefined reference to 'android::MetaData::findInt32(unsigned int,int*)'
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functiondecode_thread(void*):libavcodec/libstagefright.cpp:215: error:undefined reference to 'android::MediaBuffer::data() const'
/opt/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld:jni/libavcodec.a(libstagefright.o): in functiondecode_thread(void*):libavcodec/libstagefright.cpp:222: error:undefined reference to 'android::MediaBuffer::meta_data()'

。。。
怀疑是有些库没有链接进去导致的。尚未看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg是一个开源的跨平台音视频处理工具,它可以用于录制、转换和流媒体处理等多种音视频操作。编译安装FFmpeg支持解码需要以下步骤: 1. 下载源代码:首先,你需要从FFmpeg官方网站(https://ffmpeg.org/)下载最新的源代码压缩包。 2. 安装依赖:在编译之前,需要确保系统中已经安装了一些必要依赖,如编工具(gcc、make等)、多媒体libx264libx265等)和开发包(libx264-dev、libx265-dev等)。你可以使用包管理工具(如apt、yum等)来安装这些依赖。 3. 解压源代码:将下载的源代码压缩解压到一个目录中。 4. 配置编译选:进入解压后的源代码目录,执行以下命令来配置译选项: ``` ./configure --enable-gpl --enable-libx264 --enable-libx265 --enable-nonfree ``` 这里的`--enable-gpl`表示启用GPL许可证,`--enable-libx264`和`--enable-libx265`表示启用x264和x265编码,`--enable-nonfree`表示启用非自由许可证。 5. 编译和安装:配置完成后,执行以下命令进行编译和安装: ``` make sudo make install ``` 这会将编译后的二进制文件安装到系统中。 6. 验证安装:执行以下命令来验证FFmpeg是否成功安装: ``` ffmpeg -version ``` 如果成功安装,将显示FFmpeg的版本信息。 至此,你已经成功编译安装了支持解码FFmpeg。你可以使用FFmpeg命令行工具来进行各种音视频处理操作,如转码、剪辑、合并等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值