最近對編解碼進行學習分析。於是下載了ffmpeg 2.7 , 以下是編譯ffmpeg的問題和解決方法。
1. configure 的配置問題
./configure --enable-memalign-hack --disable-debug --prefix=`pwd`/../_install/ffmpeg2.7
make -j4
make install
發現自己編譯出來的文件中沒有ffplay , 感覺應該是ffplay 的一些庫,系統裏面沒有裝好,但急於看到ffmpeg 對VP9解碼的效果,先不顧這些了。於是,我先直接下載安裝了一個ffplay
sudo apt-get install ffplay
ffplay -version
查看版本,發現這個ffplay 是來自 libav 的(ffmpeg 出走的一個團隊),由於版本問題,這個ffplay 沒有支持HEVC 和 VP9 解碼
於是我使用ffmpeg 解碼成yuv文件
ffmepg -i xxx.webm xxxx.yuv
然後再使用ffplay播放yuv文件
ffplay -f rawvideo -video_size 1920x1080 xxxx.yuv
2. ffmpeg 編譯之後沒有 ffplay
沒有從自己下載的版本中編譯出ffplay,接下來繼續搞定:
首先網上查找了一下原因,應該是SDL 庫沒有,導致在configure 的時候,沒有支持 ffplay
也就是說:
config.mak
!CONFIG_FFPLAY = yes (注意前面有 !)
接下來本人安裝了SDL 2.2 重新configure之後發現打印
SDL support no
然後在裝上SDL 1.2 之後, 再次configure之後出現打印
SDL support yes
gedit config.mak
可以看到
CONFIG_FFPLAY = yes (前面已經沒有 !)
看來我下載的ffmpeg 版本需要SDL 1.2 的接口
接下來 重新make 一下,就有 ffplay出現了
ffplay xxx.webm
這是我在網上參考的說法:
/////////////////////////////////////////////////////////////////////////////////////////
1、安裝SDL庫,不安裝將沒有ffplay;
2、如果安裝的是SDL2.0最新版本,建議重新編譯安裝SDL1.x版本(我測試的時候使用SDL2未生成ffplay,此項我再驗證);
聽羣裏的高手說,SDL2.0與1.x的版本對比,變動很大,很多接口有調整,強制使用的話要修改源碼。
3、確定不是1和2的問題後,在ffmpeg目錄下執行./configure ******之後查看Makefile中指定的config.mak(在ffmpeg根目錄下)中:CONFIG_FFPLAY=yes,如果不是需要重新./configure(如果前面總有!,重裝SDL)
ps:
1、如果自己去下載SDL源碼然後make install安裝的庫,編譯ffmpeg可以產生ffplay,但是產生的ffplay播放視頻沒有聲音。而且不能播音頻,這個時候需要安裝一些其他的庫文件;
編譯sdl 1.的時候,把 makefile 中CFLAGS變量的-O2優化選項去掉,重新生成sdl的lib庫即可解決問題
////////////////////////////////////////////////////////////////////////
3.SDL庫不能正確執行
運行ffplay時,有些機器上會出現
Could not initialize SDL - No available video device
(Did you set the DISPLAY variable?)
說明系統中沒有安裝x11的庫文件,因此編譯出來的SDL庫實際上不能用。
下載安裝
sudo apt-get install libx11-dev
sudo apt-get install xorg-dev
重新編譯sdl
再次進入sdl源代碼目錄重新編譯,make clean,./configure,make,make install
ffplay xxxx.webm
解碼顯示正確~
本人在 ubuntu kylin 14.04 上出現了新的問題 SDL1.2的代碼中於系統的/usr/x11/Xlibint.h 出現來命名衝突,於是還需要註釋掉SDL中的代碼 src/video/SDL_x11sym.h line 168 附件的兩行代碼:
#ifdef LONG64
SDL_X11_MODULE(IO_32BIT)
//SDL_X11_SYM(int,_XData32,(Display *dpy,register long *data,unsigned len),(dpy,data,len),return)
<span style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 18px; line-height: 20px;">+SDL_X11_SYM(int,_XData32,(Display *dpy,register _Xconst long *data,unsigned len),(dpy,data,len),return)</span>
SDL_X11_SYM(void,_XRead32,(Display *dpy,register long *data,long len),(dpy,data,len),)
#endif
重新對SDL 進行configure, make, make install
問題修復成功!