ffplay使用
ffplay用于渲染音視頻的
如播放視頻
ffplay http://tb-video.bdstatic.com/tieba-video/15_4f104948e182a557c4eb651d9720a5ae.mp4
這時(shí)候會(huì)直接在新彈出的窗口上播放該視頻囤萤,如果想要同時(shí)播放多 個(gè)文件,那么只需要在多個(gè)命令行下同時(shí)執(zhí)行ffplay就可以了,在對比 多個(gè)視頻質(zhì)量的時(shí)候這是一個(gè)操作技巧全释,此外,如果按s鍵則可以進(jìn)入 frame-step模式,即按s鍵一次就會(huì)播放下一幀圖像幔托。
播放音頻
ffplay ~/Desktop/GALA.mp3
這時(shí)候會(huì)彈出一個(gè)窗口,一邊播放MP3文件蜂挪,一邊將播放聲音的語譜圖畫到該窗口上重挑。針對該窗口的操作如下,點(diǎn)擊窗口的任意一個(gè)位 置(右鍵)棠涮,ffplay會(huì)按照點(diǎn)擊的位置計(jì)算出時(shí)間的進(jìn)度谬哀,然后跳(seek)到這個(gè) 時(shí)間點(diǎn)上繼續(xù)播放;按下鍵盤上的右鍵會(huì)默認(rèn)快進(jìn)10s,左鍵默認(rèn)后退 10s严肪,上鍵默認(rèn)快進(jìn)1min史煎,下鍵默認(rèn)后退1min;按ESC鍵就是退出播放 進(jìn)程;如果按w鍵則將繪制音頻的波形圖等。
更多的ffplay命令介紹:
- 播放視頻結(jié)束之后會(huì)從頭再次播放驳糯,共循環(huán)播放10 次篇梭。
ffplay GALA.mp4 -loop 10
- 指定使用哪一路音頻流或者視頻流,表示播放視頻中的第一路音頻流,如果參數(shù)ast后面跟的是 2酝枢,那么就播放第二路音頻流恬偷,如果沒有第二路音頻流的話,就會(huì)靜音
ffplay ~/Desktop/8703.mov -ast 1
ffplay ~/Desktop/8703.mov -vst 1
表示播放視頻中的第一路視頻流帘睦,如果參數(shù)vst后面跟的是 2袍患,那么就播放第二路視頻流,但是如果沒有第二路視頻流官脓,就會(huì)是黑 屏即什么都不顯示协怒。
開發(fā)工作中常用的幾個(gè)命令
1.播放PCM裸數(shù)據(jù)
ffplay song.pcm -f s16le -channels 2 -ar 44100
這行命令其實(shí)就可以正常播放song.pcm了,當(dāng)然卑笨,前提 是格式(-f)孕暇、聲道數(shù)(-channels)、采樣率(-ar)必須設(shè)置正確,如 果其中任何一項(xiàng)參數(shù)設(shè)置不正確妖滔,都不會(huì)得到正常的播放結(jié)果隧哮。
- 播放YUV420P格式的視頻幀
ffplay -f rawvideo -pixel_format yuv420p -s 480*480 texture.yuv
對于一幀視頻幀,或者更直接來說一張PNG或者JPEG的圖 片座舍,直接用ffplay是可以顯示或播放的沮翔,當(dāng)然PNG或者JPEG都會(huì)在其頭 部信息里面指明這張圖片的寬高以及格式表示。若想讓ffplay顯示一張 YUV的原始數(shù)據(jù)表示的圖片曲秉,那么需要告訴ffplay一些重要的信息采蚀,其 中包括格式(-f rawvideo代表原始格式)、表示格式(-pixel_format yuv420p)承二、寬高(-s 480*480)榆鼠。
對于RGB表示的圖像,其實(shí)是一樣 的亥鸠,命令如下:
ffplay -f rawvideo -pixel_format rgb24 -s 480*480 texture.rgb
音畫同步
視頻播放器妆够,不得不提的一個(gè)問題就是音畫同步,在 ffplay中音畫同步的實(shí)現(xiàn)方式其實(shí)有三種负蚊,分別是:以音頻為主時(shí)間軸 作為同步源;以視頻為主時(shí)間軸作為同步源;以外部時(shí)鐘為主時(shí)間軸作 為同步源神妹。下面就以音頻為主時(shí)間軸來作為同步源來作為案例進(jìn)行講 解,這也是后面章節(jié)中完成視頻播放器項(xiàng)目時(shí)要使用到的對齊策略家妆,并 且在ffplay中默認(rèn)的對齊方式也是以音頻為基準(zhǔn)進(jìn)行對齊的鸵荠,那么以音 頻作為對齊基準(zhǔn)是如何實(shí)現(xiàn)的呢?
首先要聲明的是,播放器接收到的視頻幀或者音頻幀揩徊,內(nèi)部都會(huì)有 時(shí)間戳(PTS時(shí)鐘)來標(biāo)識(shí)它實(shí)際應(yīng)該在什么時(shí)刻進(jìn)行展示腰鬼。實(shí)際的對 齊策略如下:比較視頻當(dāng)前的播放時(shí)間和音頻當(dāng)前的播放時(shí)間,如果視 頻播放過快塑荒,則通過加大延遲或者重復(fù)播放來降低視頻播放速度;如果 視頻播放慢了熄赡,則通過減小延遲或者丟幀來追趕音頻播放的時(shí)間點(diǎn)。關(guān) 鍵就在于音視頻時(shí)間的比較以及延遲的計(jì)算齿税,當(dāng)然在比較的過程中會(huì)設(shè)
置一個(gè)閾值(Threshold)彼硫,若超過預(yù)設(shè)的閾值就應(yīng)該做調(diào)整(丟幀渲染 或者重復(fù)渲染),這就是整個(gè)對齊策略凌箕。
對于ffplay可以明確指明使用的到底是哪一種具體的對齊方式拧篮,比 如:
指定了ffplay使用音頻為基準(zhǔn)進(jìn)行音視頻同步,用 來播放文件32037.mp4牵舱,當(dāng)然這也是ffplay的默認(rèn)設(shè)置
ffplay 8703.mp4 -sync audio
指定了使用以視頻為基準(zhǔn)進(jìn)行音視頻同步的方式播 放視頻文件串绩。
ffplay 8703.mp4 -sync video
指定了使用外部時(shí)鐘作為基準(zhǔn)進(jìn)行音視頻同步的方 式,用來播放視頻文件芜壁。
ffplay 8703.mp4 -sync ext
ffprobe
- ffprobe查看一個(gè)音頻的文件
ffprobe ~/Desktop/809.mp3
- ffprobe查看一個(gè)視頻的文件
ffprobe ~/Desktop/8703.mp4
1)輸出格式信息format_name礁凡、時(shí)間長度duration高氮、文件 大小size、比特率bit_rate顷牌、流的數(shù)目nb_streams等剪芍。
ffprobe -show_format 8703.mp4
2)以JSON格式的形式輸出具體每一個(gè)流最詳細(xì)的信 息,視頻中會(huì)有視頻的寬高信息窟蓝、是否有b幀罪裹、視頻幀的總數(shù)目、視頻 的編碼格式运挫、顯示比例状共、比特率等信息,音頻中會(huì)有音頻的編碼格式谁帕、 表示格式口芍、聲道數(shù)、時(shí)間長度雇卷、比特率、幀的總數(shù)目等信息颠猴。
ffprobe -print_format json -show_streams 8704.mp4
3)顯示幀信息的命令
ffprobe -show_frames sample.mp4
4)查看包信息的命令
ffprobe -show_packets sample.mp4
ffmpeg使用
(1)剪切一段媒體文件关划,可以是音頻或者視頻文件
將文件input.mp4從第50s開始剪切20s的時(shí)間,輸出到文件 output.mp4中翘瓮,其中-ss指定偏移時(shí)間(time Offset)贮折,-t指定的時(shí)長 (duration)。
ffmpeg -i input.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4
(2)視頻文件切割為多個(gè)文件
ffmpeg -i input.mp4 -t 00:00:50 -c copy small-1.mp4 -ss 00:00:50 -codec copy small-2.mp4
(3)提取一個(gè)視頻文件中的音頻文件
ffmpeg -i input.mp4 -vn -acodec copy output.m4a
(4)使一個(gè)視頻中的音頻靜音资盅,即只保留視頻
ffmpeg -i input.mp4 -an -vcodec copy output.mp4
(5)從MP4文件中抽取視頻流導(dǎo)出為裸H264數(shù)據(jù)
ffmpeg -i output.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264
(6)使用AAC音頻數(shù)據(jù)和H264的視頻生成MP4文件
ffmpeg -i test.aac -i test.h264 -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f
mp4 output.mp4
(7)音頻文件的編碼格式做轉(zhuǎn)換
ffmpeg -i input.wav -acodec libfdk_aac output.aac
(8)從WAV音頻文件中導(dǎo)出PCM裸數(shù)據(jù)
導(dǎo)出用16個(gè)bit來表示一個(gè)sample的PCM數(shù)據(jù)了调榄,并且每 個(gè)sample的字節(jié)排列順序都是小尾端表示的格式,聲道數(shù)和采樣率使用 的都是原始WAV文件的聲道數(shù)和采樣率的PCM數(shù)據(jù)呵扛。
ffmpeg -i input.wav -acodec pcm_s16le -f s16le output.pcm
(9)重新編碼視頻文件每庆,復(fù)制音頻流,同時(shí)封裝到MP4格式的文件中
ffmpeg -i input.flv -vcodec libx264 -acodec copy output.mp4
(10)將一個(gè)MP4格式的視頻轉(zhuǎn)換成為gif格式的動(dòng)圖
按照分辨比例不動(dòng)寬度改為100(使用VideoFilter的 scaleFilter)今穿,幀率改為10(-r)缤灵,只處理前5秒鐘(-t)的視頻,生成 gif蓝晒。
ffmpeg -i input.mp4 -vf scale=100:-1 -t 5 -r 10 image.gif
(11)將一個(gè)視頻的畫面部分生成圖片, 提取幀圖片
每4秒鐘截取一幀視頻畫面生成一張圖片腮出,生成的圖片從 frames_0001.png開始一直遞增下去。
ffmpeg -i output.mp4 -r 0.25 frames_%04d.png
(12)使用一組圖片可以組成一個(gè)gif
ffmpeg -i frames_%04d.png -r 5 output.gif
(13)將兩路聲音進(jìn)行合并芝薇,比如要給一段聲音加上背景音樂
ffmpeg -i vocal.wav -i accompany.wav -filter_complex
amix=inputs=2:duration=shortest output.wav
(14)為視頻增加水印效果
main_w代表主視頻寬度胚嘲, overlay_w代表水印寬度,main_h代表主視頻高度洛二,overlay_h代表水印高度馋劈。
ffmpeg -i input.mp4 -i changba_icon.png -filter_complex
'[0:v][1:v]overlay=main_w-overlay_w-10:10:1[out]' -map '[out]' output.mp4
(15)將一段視頻推送到流媒體服務(wù)器上
rtmp://xxx代表流媒體服務(wù)器的地址攻锰,加上-re參數(shù)代 表將實(shí)際媒體文件的播放速度作為推流速度進(jìn)行推送。
ffmpeg -re -i input.mp4 -acodec copy -vcodec copy -f flv rtmp://xxx
(16)將流媒體服務(wù)器上的流dump到本地
http://xxx/xxx.flv 代表一個(gè)可以訪問的視頻網(wǎng)絡(luò)地 址侣滩,可按照復(fù)制視頻流格式和音頻流格式的方式口注,將文件下載到本地的 output.flv媒體文件中。
ffmpeg -i http://xxx/xxx.flv -acodec copy -vcodec copy -f flv output.flv
ffmpeg編碼支持查看
首先下載源碼https://github.com/FFmpeg/FFmpeg, 切換到源碼目錄
(1)編碼器支持
./configure --list-encoders
(2)解碼器支持
./configure --list-decoders
(3)封裝支持
FFmpeg的封裝( Muxing)是指將壓縮后的編碼封裝到一個(gè)容器格式中君珠,如果要查
看FFmpeg源代碼中都可以支持哪些容器格式寝志,可以通過命令./configure --list-muxers查看
./configure --list-muxers
(4)解封裝支持
FFmpeg的解封裝(Demuxing)是指將讀人的容器格式拆解開,將里面壓縮的音頻流策添、
視頻流材部、字幕流、數(shù)據(jù)流等提取出來唯竹,如果要查看FFmpeg的源代碼中都可以支持哪些輸
人的容器格式乐导,可以通過命令./configure --ist- demuxers來查看:
./configure --list-demuxers
(5)通信協(xié)議支持
FFmpeg不僅僅支持本地的多媒體處理,而且還支持網(wǎng)絡(luò)流媒體的處理浸颓,支持的網(wǎng)絡(luò)
流媒體協(xié)議相對來說也很全面物臂,可以通過命令./configure --list- protocols查看
./configure --list-protocols