ffplay是ffmpeg源碼中一個自帶的開源播放器組件,支持本地視頻文件的播放以及在線流媒體播放,很多商業播放器都是基於ffplay定制而來的。ffplay中的代碼充分利用了ffmpeg中的函數庫,因此,想學習ffmpeg的使用,或基於ffplay實現一個自己的播放器,ffplay都是一個很好的切入點。
FFplay: FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library. It is mostly used as a testbed for the various FFmpeg APIs.
公眾號:斷點實驗室 音視頻開發系列文章
ffmpeg源碼編譯環境搭建
ffplay源碼編譯
ffmpeg播放器實現詳解 - 框架搭建
ffmpeg播放器實現詳解 - 視頻顯示
ffmpeg播放器實現詳解 - 音頻播放
ffmpeg播放器實現詳解 - 創建線程
ffplay依賴庫准備
ffplay編譯主要依賴sdl2環境(針對ffmpeg 3.x版本),未安裝sdl2的情況下,不會自動生成關於ffplay的編譯選項。
SDL(Simple DirectMedia Layer)是一個跨平台的多媒體和游戲開發包,提供2D,音頻,事件驅動,多線程和定時器等服務,它使用C語言寫成,提供了多種控制圖像、聲音、輸出的函數,讓開發者只要用相同或是相似的代碼就可以開發出跨多個平台(Linux、Windows、Mac OS X等)的應用軟件。
SDL: Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. It is used by video playback software, emulators, and popular games including Valve's award winning catalog and many Humble Bundle games.
可以通過下面兩個命令安裝sdl2組件,dev后綴表示安裝路徑下會包含頭文件及動態庫等在開發環境下需要的文件
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
也可以從下面的地址下載sdl2源碼包編譯安裝,這種方法更適合在嵌入式環境下使用
http://www.libsdl.org/download-2.0.php
sdl2庫編譯
下載完成后解壓進入sdl2源碼目錄,可通過下面的配置方法生成Makefile文件
./configure --prefix=/usr/local/3rdparty/sdl2
生成Makefile文件后,輸入make命令即可開始編譯過程,編譯完成后,執行make install命令進行安裝
make
sudo make install
安裝完成后,會在configure指定的目錄下找到sdl2的目錄,由於sdl2以庫文件的方式提供支持,因此在sdl2/bin目錄下沒有對應的可執行文件。
sdl2環境變量配置
sdl2編譯完成后,還需要讓系統能夠找到對應的安裝位置。打開/etc/profile配置文件,在該文件底部添加sdl2的環境變量
#SDL2 ENVIRONMENT
export C_INCLUDE_PATH=/usr/local/3rdparty/sdl2/include/SDL2:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/usr/local/3rdparty/sdl2/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/3rdparty/sdl2/lib/pkgconfig:$PKG_CONFIG_PATH
ffplay configure配置
在ffmpeg的編譯配置項中,添加sdl2的配置項,重新生成對應的Makefile文件。此外,configure腳本會通過環境變量自動查詢是否已安裝sdl2組件,因此按照之前ffmpeg的configure配置方法,直接重新生成Makefile文件應該也可以,這樣就不必添加sdl2配置項了,大家可以試試。
./configure --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --enable-sdl --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib
生成Makefile文件后,打開ffmpeg源碼目錄下的config.mak文件,搜索CONFIG_FFPLAY關鍵字,可以看到ffplay對應的編譯選項已由之前的[!CONFIG_FFPLAY=yes]變成了[CONFIG_FFPLAY=yes],前面的嘆號已經去掉了
ffplay編譯
重新生成Makefile后輸入make命令即可開始編譯過程,編譯完成后,執行make install命令進行安裝
make
sudo make install
在ffmpeg的安裝路徑ffmpeg/bin下,即可看到ffplay的可執行文件,輸入ffplay -version,可以打印出ffplay的版本號。
ffplay -version
ffplay version 3.2.4 Copyright (c) 2003-2017 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --prefix=/usr/local/3rdparty/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --enable-sdl --extra-cflags=-I/usr/local/3rdparty/x264/include --extra-ldflags=-L/usr/local/3rdparty/x264/lib
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100
在ffmpeg的源碼路徑下,可以通過ldd命令查詢ffplay依賴的所有組件,其中顯示了sdl2依賴庫的安裝位置,若其中的某些依賴項顯示[Not Found]無法找到,則需要對照前文確定是否有依賴項尚未配置環境變量
ldd ffplay
linux-vdso.so.1 => (0x00007ffd3c3a3000)
libavdevice.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavdevice.so.57 (0x00007fbe2e539000)
libavfilter.so.6 => /usr/local/3rdparty/ffmpeg/lib/libavfilter.so.6 (0x00007fbe2e10a000)
libavformat.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavformat.so.57 (0x00007fbe2dcea000)
libavcodec.so.57 => /usr/local/3rdparty/ffmpeg/lib/libavcodec.so.57 (0x00007fbe2c7b6000)
libpostproc.so.54 => /usr/local/3rdparty/ffmpeg/lib/libpostproc.so.54 (0x00007fbe2c59a000)
libswresample.so.2 => /usr/local/3rdparty/ffmpeg/lib/libswresample.so.2 (0x00007fbe2c37e000)
libswscale.so.4 => /usr/local/3rdparty/ffmpeg/lib/libswscale.so.4 (0x00007fbe2c0f6000)
libavutil.so.55 => /usr/local/3rdparty/ffmpeg/lib/libavutil.so.55 (0x00007fbe2be7c000)
libSDL2-2.0.so.0 => /usr/local/3rdparty/sdl2/lib/libSDL2-2.0.so.0 (0x00007fbe2bb49000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe2b840000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fbe2b623000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe2b259000)
libXv.so.1 => /usr/lib/x86_64-linux-gnu/libXv.so.1 (0x00007fbe2b054000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fbe2ad1a000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fbe2ab08000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fbe2a8e6000)
libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007fbe2a6e2000)
libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007fbe2a4da000)
libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007fbe2a2d6000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007fbe29fd6000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fbe29dbc000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbe29bb8000)
libx264.so.148 => /usr/local/3rdparty/x264/lib/libx264.so.148 (0x00007fbe29812000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fbe295f0000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fbe293e8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbe2e751000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fbe291e4000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fbe28fde000)
ffplay使用
ffplay支持本地視頻文件的播放以及在線流媒體播放,輸入ffplay url命令即可打開指定的媒體流,這里我們以湖南衛視 & CCTV1 的直播源為例
ffplay rtmp://58.200.131.2:1935/livetv/hunantv
ffplay http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
播放畫面截圖
ffplay播放中可能出現的問題
sdl找不到音頻設備
SDL_OpenAudio no such audio device
在stackoverflow找到了對應的解決辦法,可參考如下鏈接
https://stackoverflow.com/questions/10465202/initializing-sdl-mixer-gives-error-no-available-audio-device
sudo apt-get install libasound2-dev
sudo apt-get install libpulse-dev
然后重新配置生成SDL及ffplay的Makefile文件並編譯安裝
sdl無法初始化
Could not initialize SDL, no available video device
解決辦法如下,可參考如下鏈接
https://askubuntu.com/questions/443053/could-not-initialize-sdl-no-available-video-device-dont-move
https://stackoverflow.com/questions/38869963/i-cannot-use-sdl2-on-centos-maybe-i-install-it-failed-errorno-available-vide/38877897#38877897
sudo apt-get install libx11-dev
sudo apt-get install xorg-dev
然后重新配置生成SDL及ffplay的Makefile文件並編譯安裝
// 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
// 公眾號:斷點實驗室
// 掃描二維碼,關注更多優質原創,內容包括:音視頻開發、圖像處理、網絡、
// Linux,Windows、Android、嵌入式開發等
