1. 程式人生 > >史上最全的基於ffmpeg+sdl網路攝像頭編解碼播放資料(包含交叉編譯過程,附帶完整原始碼)

史上最全的基於ffmpeg+sdl網路攝像頭編解碼播放資料(包含交叉編譯過程,附帶完整原始碼)

原創博文,嚴禁私自轉載,轉載請註明出處!!!

近期,由於工作需要,要在開發板上跑一個攝像頭,攝像頭款式比較老,不支援rtsp格式,所以選擇編譯ffmpeg+sdl實現軟解碼播放攝像頭,特此記錄整個編譯過程(非常之艱辛,發文留念)

在ubuntu上交叉編譯環境的搭建:因為開發板上搭建的程式的執行環境和用於編譯的PC上的編譯環境要匹配,所以要看好自己的需要,交叉編譯工具鏈有好幾種,最常見的arm-none-linux-gnueabi-,我使用的是arm-linux-gnueabihf- ,由於ffmpeg的交叉編譯需要依賴sdl,所以二者之間就存在版本的匹配問題,sdl1.2和sdl2.0之間有很大的差異,所以開始編譯前要搞清楚自己的版本,通過查詢資料和反覆測試,初步的出結論ffmpeg3.1.x版本以上+sdl2.0可以編譯通過(網上說sdl2.0與ffmpeg3.0.11以上版本比配,測試了一下,沒成功),sdl1.2+ffmpeg2.x

SDL1.2遷移到SDL2.0的區別及遷移指南參考文件https://blog.csdn.net/Amrf2/article/details/75119570

ffmpeg與sdl版本匹配問題參考文件https://blog.csdn.net/cyf15238622067/article/details/79423052

開發板:imax6dl

系統:ubuntu16.04

攝像頭:好像是fairy(後來因為視野達不到要求改用別的了)

在正式交叉編譯前首先要先來及簡單瞭解一下視訊依賴庫ffmpeg和sdl

FFmpeg(負責解碼)+SDL(負責顯示)
   
 (1)FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式
        FFmpeg原始碼的簡單分析,參考文件:

https://blog.csdn.net/leixiaohua1020/article/details/44116215

     (2)SDL提供了數種控制影象、聲音、輸出入的函式,讓開發者只要用相同或是相似的程式碼就可以開發出跨多個平臺(Linux、Windows、Mac OS X等)的應用軟體
        SDL2原始碼的簡單分析,參考文件:https://blog.csdn.net/leixiaohua1020/article/details/41207787

好的,簡單瞭解了ffmpeg和sdl之後正式交叉編譯sdl和ffmpeg

因為是交叉編譯,所以編譯過程中./configure引數時一定要注意,要弄清楚host,build,target所代表的含義,要設定正確不然編譯會報錯,關於該問題後文將不再贅述

host,build,target所代表的含義參考文件http://www.cnblogs.com/baiduboy/p/7573778.html

先編譯低版本的視訊庫ffmpeg2.3.6+sdl1.2

交叉編譯sdl1.2

因為fmpeg編譯需要依賴sdl庫,所以先編譯sdl

./configure --prefix=/home/user/arm --disable-video-wayland --disable-video-wayland-qt-touch --disable-pulseaudio --disable-video-dummy --disable-arts --disable-esd --disable-alsa --disable-video-x11 --disable-video-rpi --disable-input-tslib --enable-video-directfb --disable-video-mir --build=x86_64 --host=arm-linux-gnueabihf 

make install 

make( -j4)

至此,完成對sdl的編譯

上面為我編譯時./configure的引數,需要注意的是版本的不同可能造成./configure引數的不同,所以要善於用./configure --help看配置引數資訊

交叉編譯ffmpeg2.3.6

編譯ffmpeg時需要注意,版本一定要和sdl版本匹配,不然編譯會報錯,另外,如果想新增播放功能,需要新增--enable-ffplay,但是這樣還是編譯不出來ffplay,還要在ffmmpeg在configure後會生成config.mak,開啟config.mak中去掉HAVE_SDL和CONFIG_FFPLAY前面的“!”,然後就可以把ffplay編譯出來了參考文件如下:

編譯ffplay參考文件:https://blog.csdn.net/liaojunwu/article/details/80425593

此外,若想播放MP4格式視訊,還要--enable-libx264,為了enable成功,還要額外編譯x264以及他的兩個依賴庫gpac和zlib,交叉編譯成功後移植到開發板,

交叉編譯x264
./configure --prefix=/home/user/arm --enable-shared --enable-pic --disable-asm --disable-win32thread --cross-prefix=arm-linux-gnueabihf- --host=arm-linux-gnueabihf

交叉編譯gpac
./configure --prefix=/home/user/arm --cross-prefix=arm-linux-gnueabihf- --enable-vrml --enable-odf --enable-player --enable-avi --enable-dvb4linux --extra-cflags=-I/home/user/zlib/include --extra-ldflags=-L/home/user/zlib/lib --extra-libs=-ldl
交叉編譯zlib
./configure --prefix=/home/user/arm --shared

交叉編譯x264庫參考文件:https://blog.csdn.net/tgww88/article/details/51392984

./configure --prefix=/home/user/arm --enable-shared --enable-ffserver --enable-ffplay --enable-ffprobe --enable-gpl --enable-libx264 --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --arch=arm --disable-stripping --extra-cflags=-I/home/user/arm/include --extra-ldflags=-L/home/user/arm/lib --extra-libs=-lSDL2 --extra-libs=-ldl --target-os=linux

make install

make(-j4)

至此,sdl1.2+ffmpeg2.3.6編譯結束

注:這裡說一下--prefix=/home/user/arm這個引數,最好把所有的庫放在一個資料夾下,免得有依賴關係的庫之間因為路徑問題找不到而報錯,都像上面這樣配置就避免了這個問題,切記!!!

以上依賴庫資源打包已上傳:https://download.csdn.net/download/weixin_42550424/10855689

 

接下里是要交叉編譯ffmpeg3.2.12+sdl2.0
同樣,我們嘗試在ffmpeg3.2.12+sdl2.0上編譯出ffplay驗證播放功能,依舊要根據上文章前面的內容,configure後要在config.mak下修改引數HAVE_SDL和CONFIG_FFPLAY前面的"!"去掉。同樣成功編譯出ffplay,但是將編譯出來的ffmpeg和sdl的動態庫移植到板子,發現ffplay命令無法播放任何格式的視訊檔案,通過檢視,發現編譯sdl2.0時沒有開啟framebuffer選項,配置引數變了,sdl1.2中開啟framebuffer支援的引數是-enable-video-fbcon,但是在sdl2.0中變為--enable-video-directfb,於是修改引數重新configure,但是通過檢視config.log,發現framebuffer支援還是沒有開啟,通過查資料,發現如果想要在編譯sdl時開啟framebuffer支援,必須額外編譯directfb庫,通過檢視sdl2.0的README,發現sdl2.0只支援directfb1.0,1.2.x,1.3,所以我下載了directfb,此外編譯Ddirectfb需要4個依賴庫 分別為libpng,jpegsrc,zlib,freetype,之後編譯sdl時新增--enable-video-directfb,成功開啟framebuffer支援,然後編譯

編譯SDL之前要先編譯directfb以及他的四個依賴庫,才能在編譯編譯sdl時--enable-video-directfb成功,詳細編譯方法見下面連結,這裡不做過多贅述(我也是按照下面做的)


交叉編譯directfb參考文件:https://blog.csdn.net/u012075739/article/details/25030029
交叉編譯directfb四個依賴庫參考文件:http://blog.csdn.net/u012075739/article/details/25159849

交叉編譯SDL2.0

./configure --prefix=/home/user/arm --disable-video-directfb --disable-video-dummy --disable-arts --disable-video-wayland --disable-esd --disable-alsa --disable-render-metal --disable-video-x11  --disable-input-tslib --disable-video-x11-xcursor --disable-video-x11-xdbe --disable-video-x11-xinerama --disable-video-x11-xinput --disable-video-x11-xrandr --disable-video-x11-scrnsaver --disable-video-x11-xshape --disable-video-x11-vm --disable-video-cocoa --disable-video-wscons --disable-video-vivante --disable-oss --disable-video-xbios --disable-video-gem --disable-video-opengl --disable-directx --disable-pulseaudio --build=x86_64 --host=arm-linux-gnueabihf

make install 

make(-j4)

接下來編譯ffmpeg3.2.12(版本要匹配!!!)

./configure --prefix=/home/user/arm --enable-shared --enable-ffserver --enable-ffplay --enable-ffprobe --enable-gpl --enable-libx264 --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --arch=arm --disable-stripping --extra-cflags=-I/home/user/arm/include --extra-ldflags=-L/home/user/arm/lib --extra-libs=-lSDL2 --extra-libs=-ldl --target-os=linux

make install 

make(-j4)

至此,ffmpeg3.2.12+sdl2.0編譯成功

以上所有用到的依賴庫資源:https://download.csdn.net/download/weixin_42550424/10855778

基於ffmpeg2.3.6+sdl1.2實現的播放網路攝像頭和本地檔案的程式碼:

自己修改的播放本地檔案程式碼,可播放網路攝像頭:https://download.csdn.net/download/weixin_42550424/10855599

基於該程式修改的程式(簡單的播放器):https://blog.csdn.net/leixiaohua1020/article/details/8652605