[原]ffmpeg编译android 硬解码支持库 libstagefright

最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来。

编译环境:Ubuntu 14.04 + Android NDK + FFmpeg源码。

第一步:将ffmpeg/tools/build_stagefright移动到ffmpeg下面,修改执行权限。

  

chmod u+x build_stagefright

第二步:打开build_stagefright文件,配置Android NDK路径。

#!/bin/bash
export NDK=/to/your/ndk/path
if [ "$NDK" = "" ]; then
    echo NDK variable not set, assuming ${HOME}/android-ndk-r8d
    export NDK=${HOME}/android-ndk-r8d
fi  

第三步:build_stagefright中的下载地址http://download.cyanogenmod.com/get/update-cm-7.0.3-N1-signed.zip失效了,所以得手动下载update-cm-7.0.3-N1-signed.zip,附一个可以下载的地址http://sourceforge.net/projects/nexusoneandroid/files/update-cm-7.0.3-N1-signed.zip/stats/timeline

第四步:修改TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.3.3/prebuilt/*-x86 ` 为 TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64 ` ,否则会出现arm-linux-androideabi-gcc is unable to create an executable file. C compiler test failed.这样的错误

第五步:vim configure 将enabled libstagefright_h264  && require_cpp libstagefright_h264 改为 enabled libstagefright && require_cpp libstagefright_h264,否则会出现ERROR: libstagefright_h264 not found

第六步:将build_stagefright中的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 -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI/include"

第七步:将build_stagefright中的EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI"更改为EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI"

第八步:将build_stagefright中的EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI"继续修改添加交叉编译所需要的外部库。最终修改为:

EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.8/libs/$ABI -lstagefright     -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared"


第八步能解决大多数交叉编译没有链接相应的库导致的问题。


最终修改完成的build_stagefright内容如下:

#!/bin/bash

export NDK=$ANDROID_NDK

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 ../android-source/frameworks/base
git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../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 "../android-libs" ]; then
    if [ ! -f "../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 ../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.8/prebuilt/linux-x86_64`
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++/4.8/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.8/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++/4.8/libs/$ABI -lstagefright -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared"
#EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lcutils -ldl -lstlport -lc -lm -lz -ldl -llog -lstdc++ -lstagefright -lbinder  -lstlport -lstdc++ -lstl"
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 $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

第九步,执行./build_stagefright编译,最终输出如下内容则表示编译成功:

CC    ffprobe.o
CC    ffserver.o
AR    libavfilter/libavfilter.a
AR    libavformat/libavformat.a
AR    libavcodec/libavcodec.a
AR    libswresample/libswresample.a
AR    libswscale/libswscale.a
AR    libavutil/libavutil.a
HOSTLD    doc/print_options
GENTEXI    doc/avoptions_format.texi
GENTEXI    doc/avoptions_codec.texi
POD    doc/ffmpeg.pod
POD    doc/ffprobe.pod
POD    doc/ffserver.pod
POD    doc/ffmpeg-all.pod
POD    doc/ffprobe-all.pod
POD    doc/ffserver-all.pod
POD    doc/ffmpeg-utils.pod
POD    doc/ffmpeg-scaler.pod
POD    doc/ffmpeg-resampler.pod
POD    doc/ffmpeg-codecs.pod
POD    doc/ffmpeg-bitstream-filters.pod
POD    doc/ffmpeg-formats.pod
POD    doc/ffmpeg-protocols.pod
POD    doc/ffmpeg-filters.pod
POD    doc/libavutil.pod
POD    doc/libswscale.pod
POD    doc/libswresample.pod
POD    doc/libavcodec.pod
POD    doc/libavformat.pod
POD    doc/libavfilter.pod
MAN    doc/ffmpeg.1
MAN    doc/ffprobe.1
MAN    doc/ffserver.1
MAN    doc/ffmpeg-all.1
MAN    doc/ffprobe-all.1
MAN    doc/ffserver-all.1
MAN    doc/ffmpeg-utils.1
MAN    doc/ffmpeg-scaler.1
MAN    doc/ffmpeg-resampler.1
MAN    doc/ffmpeg-codecs.1
MAN    doc/ffmpeg-bitstream-filters.1
MAN    doc/ffmpeg-formats.1
MAN    doc/ffmpeg-protocols.1
MAN    doc/ffmpeg-filters.1
MAN    doc/libavutil.3
MAN    doc/libswscale.3
MAN    doc/libswresample.3
MAN    doc/libavcodec.3
MAN    doc/libavformat.3
MAN    doc/libavfilter.3
LD    ffmpeg_g
LD    ffprobe_g
LD    ffserver_g
CP    ffprobe
CP    ffmpeg
STRIP    ffprobe
STRIP    ffmpeg
CP    ffserver
STRIP    ffserver
时间: 2024-10-16 02:30:50

[原]ffmpeg编译android 硬解码支持库 libstagefright的相关文章

基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

配置FFmpeg硬解码 设置解码输出格式回调 static AVPixelFormat GetHwFormat(AVCodecContext * pCodecCtx, const AVPixelFormat * pPixFmt) { // 因为采用的是DXVA2,所以这里直接写死了 return AV_PIX_FMT_DXVA2_VLD; } m_pDecoderCtx->get_format = GetHwFormat; 设置解码数据回调 // 个人理解就是将LPDIRECT3DSURFACE

android support Percent支持库开发

Android的布局支持百分比的设置进行开发,来学习如何去实现它,不过看起来会像网页的设置,比如宽度的设置属性是`layout_widthPercent`.在此之前,我们一般都会设置Linearlayout的weight权重来实现布局间的比例大小. Percent support Library提供了两个新的类: 1.PercentRelativeLayout 2.PercentFrameLayout 创建新项目 创建一个新的项目来测试,修改`build.gradle`,需要引入以下库 `app

Android百分比布局支持库介绍——com.android.support:percent

在此之前,相信大家都已经对Android API所提供的布局方式非常熟悉了.也许在接触Android的时候都有过这样的想法,如果可以按照百分比的方式进行界面布局,这样适配各种屏幕就简单多了吧!!以前的一个小梦想,现在终于得以实现,谷歌正式提供百分比布局支持库(percent-support-lib). <ignore_js_op> 获取支持库: 使用Android studio在build.gradle添加以下信息就可以获取支持库,当然了,如果你没有下载到该支持库会提示你下载. [AppleS

基于FFmpeg的Dxva2硬解码及Direct3D显示(四)

显示及资源清理 显示 关于D3D显示的大概步骤是解码数据放在缓冲区,也就是这里离屏的概念,然后将离屏数据拷贝到后台缓冲表面,后台表面和前台表面不停的交替实现显示. // 离屏 LPDIRECT3DSURFACE9 surface = (LPDIRECT3DSURFACE9)pFrame->data[3]; // D3DCLEAR_TARGET 清除要渲染目标(帧缓存)的颜色为D3DCOLOR_XRGB(0, 0, 0)的值 // D3DCLEAR_ZBUFFER 清除深度缓冲(确定像素遮挡关系)

Android 测试支持库介绍

测试支持库 Android的测试支持库为测试Android应用提供了大量框架.该库提供了一组API快速构建和运行测试代码,包括JUnit4和功能用户界面(UI)测试.可以从Android Studio IDE中或命令行这执行. Android的测试支持库可通过Android SDK管理器获取. 测试支持库特性 AndroidJUnitRunner:兼容JUnit 4测试运行器. Espresso:UI测试框架;适合在单个应用的功能UI测试. UI Automator:UI测试框架;适用于跨应用的

LNMP编译安装的架构中安装zabbix(php支持库的问题很多)

PHP编译参考 为了减少不必要的支持库报错,最好先安装执行编译前需要的支持库软件yum install -y net-snmp net-snmp-devel libcurl-devel libevent-devel java* openldap-devel &&?cp -frp /usr/lib64/libldap* /usr/lib/php编译安装参数参考 ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/u

[原]如何在Android用FFmpeg解码图像

前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进行解码了. 一.编译出来可以使用的动态库,我们会看到如下输出则表示link完成了: CC libavcodec/log2_tab.o CC libavutil/log2_tab.o CC libswresample/log2_tab.o AR libavcodec/libavcodec.a LD l

[原]如何在Android用FFmpeg+SDL2.0解码图像线程

关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,关于如何在Android使用FFmpeg+SDL2.0解码声音参考[原]如何在Android用FFmpeg+SDL2.0解码声音.但是该文章有一个问题,就是解码出来的声音有很大的噪音,基本无法听清,这是由于对于声音的处理有问题.故本文参考ffmpeg-sdl音频播放分析声音解码的处理,解码出来的声音就正常了. 博主的开发环境:Ubuntu 14.04 64位

FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库

FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库:1. 安装faad2 # wget http://downloads.sourceforge.net/faac/faad2-2.6.1.tar.gz# tar xvfz faad2-2.6.1.tar.gz# cd faad2 # ./bootstrap # ./configure # make # make install 2. 安装liba52 # wget http://liba52.source