一、簡述
ffplay是以FFmpeg框架為基礎,外加渲染音視頻的庫libSDL構建的媒體文件播放器。
在使用ffplay之前必須要安裝到系統中,MAC的安裝教程為:http://www.cnblogs.com/renhui/p/8458150.html
二、命令格式
在安裝了在命令行中輸入如下格式的命令:
ffplay [選項] ['輸入文件']
1. 主要選項
'-x width' 強制以 "width" 寬度顯示
'-y height' 強制以 "height" 高度顯示
'-an' 禁止音頻
'-vn' 禁止視頻
'-ss pos' 跳轉到指定的位置(秒)
'-t duration' 播放 "duration" 秒音/視頻
'-bytes' 按字節跳轉
'-nodisp' 禁止圖像顯示(只輸出音頻)
'-f fmt' 強制使用 "fmt" 格式
'-window_title title' 設置窗口標題(默認為輸入文件名)
'-loop number' 循環播放 "number" 次(0將一直循環)
'-showmode mode' 設置顯示模式
可選的 mode :
'0, video' 顯示視頻
'1, waves' 顯示音頻波形
'2, rdft' 顯示音頻頻帶
默認值為 'video',你可以在播放進行時,按 "w" 鍵在這幾種模式間切換
'-i input_file' 指定輸入文件
2. 一些高級選項
'-sync type' 設置主時鍾為音頻、視頻、或者外部。默認為音頻。主時鍾用來進行音視頻同步
'-threads count' 設置線程個數
'-autoexit' 播放完成后自動退出
'-exitonkeydown' 任意鍵按下時退出
'-exitonmousedown' 任意鼠標按鍵按下時退出
'-acodec codec_name' 強制指定音頻解碼器為 "codec_name"
'-vcodec codec_name' 強制指定視頻解碼器為 "codec_name"
'-scodec codec_name' 強制指定字幕解碼器為 "codec_name"
3. 一些快捷鍵
'q, ESC' 退出
'f' 全屏
'p, SPC' 暫停
'w' 切換顯示模式(視頻/音頻波形/音頻頻帶)
's' 步進到下一幀
'left/right' 快退/快進 10 秒
'down/up' 快退/快進 1 分鍾
'page down/page up' 跳轉到前一章/下一章(如果沒有章節,快退/快進 10 分鍾)
'mouse click' 跳轉到鼠標點擊的位置(根據鼠標在顯示窗口點擊的位置計算百分比)
三、ffplay 播放音頻
播放音頻文件的命令:
ffplay shy.mp3
這時候就會彈出來一個窗口,一邊播放MP3文件,一邊將播放音頻的圖畫到該窗口上。針對該窗口的操作如下:
- 點擊該窗口的任意一個位置,ffplay會按照點擊的位置計算出時間的進度,然后seek到計算出來的時間點繼續播放。
- 按下鍵盤的左鍵默認快退10s,右鍵默認快進10s,上鍵默認快進1min,下鍵默認快退1min。
- 按ESC就退出播放進程,按W會繪制音頻的波形圖。
相關效果圖片如下:


三、ffplay 播放視頻
播放視頻文件的命令:
ffplay pm.mp4
這時候,就會在新彈出的窗口上播放該視頻了。
- 如果想要同時播放多個文件,只需在多個命令行下同時執行ffplay就可以了。
- 如果按s鍵就可以進入frame-step模式,即按s鍵一次就會播放下一幀圖像。
五、ffplay 高級使用方式
1. 循環播放
ffplay pm.mp4 -loop 10
上述命令代表播放視頻結束之后會從頭再次播放,共循環播放10次。
2. 播放 pm.mp4 ,播放完成后自動退出
ffplay -autoexit pm.mp4
3. 以 320 x 240 的大小播放 test.mp4
ffplay -x 320 -y 240 pm.mp4
4. 將窗口標題設置為 "myplayer",循環播放 2 次
ffplay -window_title myplayer -loop 2 pm.mp4
5. 播放 雙通道 32K 的 PCM 音頻數據
ffplay -f s16le -ar 32000 -ac 2 test.pcm
六、ffplay音畫同步
ffplay也是一個視頻播放器,所以不得不提出來的一個問題是:音畫同步。ffplay的音畫同步的實現方式其實有三種,分別是:以音頻為主時間軸作為同步源,以視頻為主時間軸作為同步源,以外部時鍾為主時間軸作為同步源。
下面就以音頻為主時間軸來作為同步源來作為案例進行講解,而且ffplay默認也是以音頻為基准進行對齊的,那么以音頻作為對齊基准是如何實現的呢?
首先需要說明的是,播放器接收到的視頻幀或者音頻幀,內部都是會有時間戳(PTS時鍾)來標識它實際應該在什么時刻展示,實際的對齊策略如下:比較視頻當前的播放時間和音頻當前的播放時間,如果視頻播放過快,則通過加大延遲或者重復播放來降低視頻播放速度,如果視頻播放滿了,則通過減小延遲或者丟幀來追趕音頻播放的時間點。關鍵就在於音視頻時間的比較和延遲的計算,當前在比較的過程中會設置一個閾值,如果超過預設的閾值就應該作出調整(丟幀或者重復渲染),這就是整個對齊策略。
在使用ffplay的時候,我們可以明確的指定使用那種對齊方式,比如:
ffplay pm.mp4 -sync audio
上面這個命令顯式的指定了使用以音頻為基准進行音視頻同步的方式播放視頻文件,當然這也是ffplay的默認播放設置。
ffplay pm.mp4 -sync video
上面這個命令顯式的指定了使用以視頻為基准進行音視頻同步的方式播放視頻文件。
ffplay pm.mp4 -sync ext
上面這個命令顯式的指定了使用外部時鍾為基准進行音視頻同步的方式播放視頻文件。
大家可以分別使用這三種方式進行播放,嘗試聽一聽,做一些快進或者seek的操作,看看不同的對齊策略對最終的播放會產生什么樣的影響。
