移植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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章