移植ffmpeg到6410开发板

ffmpeg是一个开源免费跨平台的视频和音频流方案,它提供了录制、转换以及流化音视频的完整解决方案。

我用的是飞凌6410开发板,交叉工具版本为4.3.2,安装在/usr/local/arm/4.3.2/下,根据交叉工具链安装位置不同,目录需要做相应改变(具体下面有提示)。

一、下载yasm:

到 http://yasm.tortall.net/Download.html下载yasm

(x264需要用到的汇编编译器,最好下载1.0.0以上版本,否则编译x264的时候可能会出现下面的错误提示:

       ./configure
       Found yasm 0.7.2.2153
       Minimum version is yasm-1.0.0
       If you really want to compile without asm, configure with --disable-asm.

 

for x86:

./configure --enable-shared --prefix=/usr/local
make
make install

for arm:
./configure --enable-shared --prefix=/usr/local/ --host=arm-linux
make
make install

 

安装完后确记要导入yasm环境变量:export PATH="$PATH:/usr/local/yasm/bin",如果没有这一步下面安装x264时会提示x264 Found no assembler!

 

下载安装x264
到 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 下载x264库
for x86:
./configure --enable-shared --prefix=/usr/local
make
make install

for arm:
./configure --enable-shared
修改config.mak文件,将其中的CC=gcc,AS=yasm修改成CC=arm-linux-gcc,AS=arm-linux-as。—>make。之后便生成了可执行文件X264。
这里会出错

解决办法:

将解压文件夹下的common文件夹下的cpu.c中的

#elif defined(SYS_LINUX)

unsigned int bit;

int np;

cpu_set_t p_aff; memset( &p_aff, 0, sizeof(p_aff) );

sched_getaffinity( 0, sizeof(p_aff), &p_aff );

for( np = 0;bit = 0; bit < sizeof(p_aff); bit++ );

np += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;return np;
改成了:#elif defined(SYS_LINUX)
return 1 ;
二、下载安装xvid库
到 http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz 下载xvid
for x86:
cd build/generic
./configure --prefix=/usr/local
make
make install

for arm:
#./configure --prefix=/usr/local/ --host=arm-linux --target=arm-linux
./configure --prefix=/usr/local/ --host=arm-hismall-linux --target=arm-hismall-linux
make
make install

至此移植FFmpeg所需的安装包都已具备

三、下载ffmpeg
http://download.chinaunix.net/download.php?id=5532&ResourceID=2990在这个网址上下载了ffmpeg然后解压。(3.3.2版本的编译器建议下载ffmpeg-0.4.9-p20051120.tar.bz2,否则可能编译不通过)
(1)修改configure文件,要修改的如下
prefix="/usr/local/ffmpeg-arm"
cross_prefix="/usr/local/arm/4.3.2/bin/"    #根据交叉工具链安装位置和版本的不同,红色字体需要做相应改变,下同;

cc="arm-linux-gcc"
ar="arm-linux-ar"
ranlib="arm-linux-ranlib"
strip="arm-linux-strip"
cpu="armv41"
由于cc、ar、ranlib、strip都是交叉编译环境中的执行文件,也可以这样配置
prefix="/usr/local/ffmpeg-arm"
cross_prefix="/usr/local/arm/4.3.2/bin/arm-linux-"
cpu="armv41"

(2)执行 ./configure
./configure --enable-shared --disable-strip
说明:如果不加--disable-strip,那么在编译之后,动态链接库会有问题。在运行程序链接该三个链接库的时候,会出现"skippingincompatible"错误。我猜想是在安装动态库之前,利用了strip对其进行了处理,而不是调用arm-linux-strip,所以造成了动态库的损坏。(比如gcc编译得到的动态库,利用arm-linux-gcc去链接该动态库,当然会出现"skippingincompatible"错误)。
(3)编译并安装
make
make install
安装完成后,在/usr/local/ffmpeg-arm文件下有三个文件夹,分别为头文件夹include、动态库文件夹lib和执行文件夹bin。
由于是利用动态链接库,bin目录下的执行文件需要lib下的动态库的支持。在实验箱上运行ffmpeg,必须把lib下的动态库烧写到/usr/lib或者/lib目录下。
(4)测试
把include文件夹下的ffmpeg文件夹复制到/usr/local/arm/4.3.2/include目录下。那么在测试程序中的包含文件可以这样写#include<ffmpeg/avcodec.h>。
编译:

arm-linux-gcc -o test test.c -L/usr/local/ffmpeg-arm/lib-lavformat -lavcodec
-lavutil
在实验箱运行测试程序,必须把动态库文件烧写到/usr/lib或者/lib下。

(5)ffmpeg+ffserver构建视频服务器

(摄像头作为视频采集端口,通过ffmpeg进行mpeg4编码,然后通过ffserver使用rtp协议传输视频!)
首先启动ffserver。启动ffserver之前必须先配置好ffserver。配置文件如下
Port 8090

BindAddress 0.0.0.0
#最大链接数
MaxClients 1000
#带宽上限
MaxBandwidth 10000
CustomLog -
NoDaemon
#配置缓冲文件
<Feed feed1.ffm>
#缓冲文件所在目录
File /tmp/feed1.ffm
#缓冲大小
FileMaxSize 1M
#允许链接的地址
ACL allow 127.0.0.1
</Feed>
#配置视频文件的参数
<Stream test.asf>
Feed feed1.ffm
Format asf
NoAudio
VideoCodec mpeg4
VideoFrameRate 15
VideoSize 320x240
VideoBitRate 256
VideoBufferSize 40
VideoGopSize 30
#AudioBitRate 64
StartSendOnKey
ACL allow 192.168.0.0 192.168.255.255
</Stream>
这样就可以启动ffserver了,使用格式如下:./ffserver -f test.conf
然后再启动ffmpeg,使用方法:ffmpeg -f video4linux -s 320*240 -r 15 -i /dev/video0 http://localhost:8090/feed1.ffm
这样服务器端就OK了!整个移植过程结束。

 参考ffmpeg的安装和配置:http://hi.baidu.com/dawangxu/item/5cbea5d7dbe0001d21e250eb

你可能感兴趣的:(linux,Stream,测试,服务器,gcc,include)