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

android编译ffmpeg+x264

2016-02-24 08:53 531 查看
android编译ffmpeg+x264

编译x264:

下载最新版的x264
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
1.解压到指定的目录

2.切换当前目录为该目录

3.创建一个shell脚本build_x264.sh,内容如下:

export NDK=/home/robin/桌面/android-ndk-r8c
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
export PREFIX=/home/robin/android-x264
./configure --prefix=$PREFIX \
--enable-static \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM


执行如下命令编译和安装

make

sudo make install

sudo ldconfig

编译ffmpeg:

下载最新版的ffmpeg
http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
1.解压到指定的目录

2.切换当前目录为该目录

3.创建一个shell脚本build_ffmpeg.sh,内容如下:

#!/bin/sh
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
export PREFIX=/home/robin/android-x264

build_one(){
./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-nonfree \
--enable-version3 \
--disable-everything \
--enable-gpl \
--disable-doc \
--enable-avresample \
--enable-demuxer=rtsp \
--enable-muxer=rtsp \
--disable-ffplay \
--disable-ffserver \
--enable-ffmpeg \
--disable-ffprobe \
--enable-libx264 \
--enable-encoder=libx264 \
--enable-decoder=h264 \
--enable-protocol=rtp \
--enable-hwaccels \
--enable-zlib \
--disable-devices \
--disable-avdevice \
--extra-cflags="-I/home/robin/android-x264/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \
--extra-ldflags="-L/home/robin/android-x264/lib"

make -j4 install

$PREBUILT/linux-x86/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/linux-x86/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}

build_one


执行build_ffmpeg.sh编译完成,编译输出在$PREFIX指定的目录

原文:http://hi.baidu.com/duizhe_memory/item/482e6fd6ccfee7fa93a974be


编译Android下可用的FFmpeg+x264

编译x264:

下载最新版的x264
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
1.解压到指定的目录

2.切换当前目录为该目录

3.创建一个shell脚本build_x264.sh,内容如下:

NDK= NDK=/home/duizhe/android-ndk-r6(你自己的NDK根目录)

PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt

PLATFORM=$NDK/platforms/android-8/arch-arm (or any other android platform you want)

PREFIX=/home/android-ffmpeg

./configure --prefix=$PREFIX \

--enable-static \

--enable-pic \

--disable-asm \

--disable-cli \

--host=arm-linux \

--cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- \

--sysroot=$PLATFORM

make

sudo make install

sudo ldconfig

编译ffmpeg:

下载最新版的ffmpeg
http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
1.解压到指定的目录

2.切换当前目录为该目录

3.创建一个shell脚本build_ffmpeg.sh,内容如下:

#!/bin/bash

export NDK=/home/duizhe/android-ndk-r6

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=/home/android-ffmpeg

function build_one

{

./configure --target-os=linux --prefix=$PREFIX \

--enable-cross-compile \

--enable-runtime-cpudetect \

--disable-asm \

--arch=arm \

--cc=$PREBUILT/linux-x86/bin/arm-linux-androideabi-gcc \

--cross-prefix=$PREBUILT/linux-x86/bin/arm-linux-androideabi- \

--disable-stripping \

--nm=$PREBUILT/linux-x86/bin/arm-linux-androideabi-nm \

--sysroot=$PLATFORM \

--enable-nonfree \

--enable-version3 \

--disable-everything \

--enable-gpl \

--disable-doc \

--enable-avresample \

--enable-demuxer=rtsp \

--enable-muxer=rtsp \

--disable-ffplay \

--disable-ffserver \

--enable-ffmpeg \

--disable-ffprobe \

--enable-libx264 \

--enable-encoder=libx264 \

--enable-decoder=h264 \

--enable-protocol=rtp \

--enable-hwaccels \

--enable-zlib \

--disable-devices \

--disable-avdevice \

--extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" \

--extra-ldflags="-L/home/android-ffmpeg/lib"

make -j4 install

$PREBUILT/linux-x86/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/linux-x86/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

}

build_one

编译完成。

另一篇文章:


使用 NDK r9 编译ffmpeg




博客分类:

android

1. 环境 ubuntu 我的是13.10 ndk r9 64位

2. 下载ffmpeg http://www.ffmpeg.org/download.html 找到


FFmpeg 2.1.3 "Fourier"



2.1.3 was released on 2014-01-15. It is the latest stable FFmpeg release from the 2.1 release branch, which was cut from master on 2013-10-28. Amongst lots of other changes, it includes all changes from ffmpeg-mt, libav master of 2013-10-27, libav 9 as of 2013-10-27.

It includes the following library versions:
libavutil      52. 48.101
libavcodec     55. 39.101
libavformat    55. 19.104
libavdevice    55.  5.100
libavfilter     3. 90.100
libswscale      2.  5.101
libswresample   0. 17.104
libpostproc    52.  3.100


Download bzip2 tarball 下载

下载之后 解压到 $NDK/sources 文件夹下面,这是因为编译快捷以及方便使用

3. 找到 ffmpeg-xxx/configure
找到如下几行:

Java代码


SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

上面几行会导致libavcodec.so.<version>
(e.g. libavcodec.so.55),不会被android承认 ,修改为;

Java代码


SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

4. 复制下面的代码到文本中 并命名为 build_android.sh,注意这个文件应该保存到 ffmpeg-xxx/configure
同一个文件夹下

Java代码


#!/bin/bash

NDK=$HOME/Desktop/adt/android-ndk-r9

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

function build_one

{

./configure \

--prefix=$PREFIX \

--enable-shared \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avdevice \

--disable-doc \

--disable-symver \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--target-os=linux \

--arch=arm \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

CPU=arm

PREFIX=$(pwd)/android/$CPU

ADDI_CFLAGS="-marm"

build_one

注意修改 NDK=$HOME/Desktop/adt/android-ndk-r9
这行

5. 执行

Java代码


sudo chmod +x build_android.sh

./build_android.sh

6.输出 $NDK/sources/ffmpeg-xxx/android,
arm/lib 和arm/include

注意 arm/lib包含了两个 library files (e.g.: libavcodec-55.so) 和 symbolic links (e.g.: libavcodec.so) 我们需要删掉 symbolic links .

7. 让ffmpeg
Libraries用在我们的工程下
为了使ffmpeg libraries 可以作为 reusable modules, 需要添加一个文件 $NDK/sources/ffmpeg-xxx/android/arm/Android.mk
使用如下内容,

Java代码


include $(CLEAR_VARS)

LOCAL_MODULE:= libavcodec

LOCAL_SRC_FILES:= lib/libavcodec-55.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavformat

LOCAL_SRC_FILES:= lib/libavformat-55.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libswscale

LOCAL_SRC_FILES:= lib/libswscale-2.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavutil

LOCAL_SRC_FILES:= lib/libavutil-52.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libavfilter

LOCAL_SRC_FILES:= lib/libavfilter-3.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE:= libwsresample

LOCAL_SRC_FILES:= lib/libswresample-0.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_SHARED_LIBRARY)

这就是为什么我们把源码放在source文件夹下,ndk会自动寻找
8.使用
使用 libraries在Android project’s jni/Android.mk file,

Java代码


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := tutorial03

LOCAL_SRC_FILES := tutorial03.c

LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid

LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil

include $(BUILD_SHARED_LIBRARY)

$(call import-module,ffmpeg-2.0.1/android/arm)

这里你就会发现 我们用到了source中调用了 import-module
使用相对路径去调用。

分享到:




ios7
去掉左侧空格 | android h264含so

2014-01-16 13:32

浏览 3058

评论(3)

分类:移动开发

相关推荐


评论



3 楼 loovejava 2014-05-29
6步没有生成文件夹,7步和8步的mk文件分别怎么置放??

2 楼 ailuoben 2014-05-22

ygswine 写道

你好. 按照你的操作在编译 ./build_android.sh时一直报

--cross-prefix=/home/android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-: No such file or directory

是什么原因?

#!/bin/bash

NDK=/home/android/android-ndk-r9d

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86

function build_one

{

./configure \

--prefix=$PREFIX \

--enable-shared \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avdevice \

--disable-doc \

--disable-symver \

--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \

--target-os=linux \

--arch=arm \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

CPU=arm

PREFIX=$(pwd)/android/$CPU

ADDI_CFLAGS="-marm"

build_one

在ubuntu中看一下这个文件是不是每行结束自动加上了两个空格,删掉空格就好了。我的是这样解决的

1 楼 ygswine 2014-03-29
你好. 按照你的操作在编译 ./build_android.sh时一直报

--cross-prefix=/home/android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-: No such file or directory

是什么原因?

#!/bin/bash

NDK=/home/android/android-ndk-r9d

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86

function build_one

{

./configure \

--prefix=$PREFIX \

--enable-shared \

--disable-static \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-avdevice \

--disable-doc \

--disable-symver \

--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \

--target-os=linux \

--arch=arm \

--enable-cross-compile \

--sysroot=$SYSROOT \

--extra-cflags="-Os -fpic $ADDI_CFLAGS" \

--extra-ldflags="$ADDI_LDFLAGS" \

$ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

CPU=arm

PREFIX=$(pwd)/android/$CPU

ADDI_CFLAGS="-marm"

build_one

另一篇文章:http://bbs.chinavideo.org/forum.php?mod=viewthread&tid=13358
avcodec_find_encoder(CODEC_ID_H264)返回值为空

我在代码中调用avcodec_find_encoder(CODEC_ID_H264);它的返回值老是为空,请问这如何解决。我在编译ffmpeg时加了x264的参数,也编译了最新版的x264。我用的ffmpeg是0.8的最新版。

ffmpeg编译参数

./configure --enable-nonfree --enable-gpl --enable-version3 \

--enable-shared --enable-postproc --enable-libmp3lame \

--enable-libopenjpeg --enable-libvorbis --enable-libopencore-amrnb \

--enable-libopencore-amrwb --enable-libxvid --enable-libx264 \

--enable-libfaac --enable-pthreads --disable-ffserver \

--disable-ffplay --prefix=/usr --extra-cflags=-I/local/include --extra-ldflags=-L/local/lib

make

sudo make install

x264编译参数

./configure

make

sudo make install
分享到:

QQ空间

腾讯微博

腾讯朋友


分享0


收藏0

回复

使用道具 举报

qqy13





1
主题
0
好友
4
积分
新手上路



发消息

2#


发表于
2011-12-2 11:29:20 |只看该作者

自已解决了。重新编译了一遍。

sudo apt-get purge ffmpeg x264 libx264-dev

清除原来的安装包

然后执行命令:

sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libMP3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxvidcore-dev zlib1g-dev

下载ffmpeg

git clone git://git.videolan.org/ffmpeg.git

下载x264

git clone git://git.videolan.org/x264.git

编译x264

cd x264

./configure

make

sudo make install

编译ffmpeg

cd ffmpeg

./configure --enable-nonfree --enable-gpl --enable-version3 \

--enable-shared --enable-postproc --enable-libmp3lame \

--enable-libxvid --enable-libx264 --enable-libfaac --enable-pthreads

make

sudo make install
回复

使用道具 举报

qqy13





1
主题
0
好友
4
积分
新手上路



发消息

3#


发表于
2011-12-2 11:29:39 |只看该作者

自已解决了。重新编译了一遍。

sudo apt-get purge ffmpeg x264 libx264-dev

清除原来的安装包

然后执行命令:

sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libMP3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxvidcore-dev zlib1g-dev

下载ffmpeg

git clone git://git.videolan.org/ffmpeg.git

下载x264

git clone git://git.videolan.org/x264.git

编译x264

cd x264

./configure

make

sudo make install

编译ffmpeg

cd ffmpeg

./configure --enable-nonfree --enable-gpl --enable-version3 \

--enable-shared --enable-postproc --enable-libmp3lame \

--enable-libxvid --enable-libx264 --enable-libfaac --enable-pthreads

make

sudo make install


ffmpeg + x264 编译提示libx264
not found 的解决方法

编译ffmpeg和x264吃了不少苦,很重要的一点就是如果你对这个编译不是很熟的话千万不要尝试用cygdrive+windows编译。建议在Ubuntu下编译!

1.首先要确保已经编译了x264的源码

这边是我x264的sh

[html] view
plain copy







export NDK=/home/mtb0157/workspace/android-ndk-r9

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

export CC=$PREBUILT/bin/arm-linux-androideabi-gcc

export LD=$PREBUILT/bin/arm-linux-androideabi-ld

export AS=$PREBUILT/bin/arm-linux-androideabi-gcc

export AR=$PREBUILT/bin/arm-linux-androideabi-ar

export RANLIB=$PREBUILT/bin/arm-linux-androideabi-ranlib

export STRIP=$PREBUILT/bin/arm-linux-androideabi-strip

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=/home/mtb0157/Project/lib

export STRIP=$PREBUILT/bin/arm-linux-androideabi-strip

./configure --prefix=$PREFIX \

--enable-static \

--enable-pic \

--enable-strip \

--disable-cli \

--extra-cflags= "-march=armv7-a -mfloat-abi=softfp -mfpu=neon" \ #这个没啥用

--host=arm-linux \

--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \

--sysroot=$PLATFORM

2.之所以编译的时候提示找不到x264,有两种可能.一是没有把静态库包含进来,二是包含进来了但是没有权限! 之前我尝试用 -I/usr/local/lib 这个目录作为附加库,结果失败了

于是我用上面的.sh定义我的

[cpp] view
plain copy







PREFIX=/home/mtb0157/Project/lib

x264编译完后 make install 就可以把库导到上面的目录了

3.在ffmpeg的sh里面加入额外的库和头文件

下面是我的sh

[html] view
plain copy







#!/bin/bash

NDK=/home/mtb0157/workspace/android-ndk-r9

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

export PLATFORM=$NDK/platforms/android-8/arch-arm

export PREFIX=/home/mtb0157/Project/lib

function build_one

{

./configure --prefix=$PREFIX\

--disable-doc \

--enable-gpl \

--enable-libx264 \

--disable-symver \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--target-os=linux \

--arch=arm \

--enable-cross-compile \

--sysroot=$PLATFORM \

--extra-cflags=-I/home/mtb0157/Project/lib/include \

--extra-ldflags=-L/home/mtb0157/Project/lib/lib

}

CPU=arm

PREFIX=$(pwd)/android/$CPU

ADDI_CFLAGS="-marm"

build_one

这边指定了之前我导出的x264的库

[html] view
plain copy







--extra-cflags=-I/home/mtb0157/Project/lib/include \

--extra-ldflags=-L/home/mtb0157/Project/lib/lib

//我的另一篇文章: http://blog.csdn.net/chinabinlang/article/details/50522564
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: