一、FFmpeg的基本組成
目前,ffmpeg有7大庫,分別為AVFormat, AVCodec, AVFilteer, AVDecoder, AVUtil,Swresample, Swscale,AVDevice七大庫組成。
1、AVFormat模塊
它實現了對文件的封裝(muxing)解封裝(demuxing),例如:MP4,flv,ts等文件格式,RTMP(Real Time Messaging Protocol),TRSP(Real Time Streaming Protocol),MMS等網絡協議封裝格式。在實際需求中,我們可以對avforamt增加自己的封裝處理模塊,進行媒體封裝格式的擴展,增加自己定制的封裝格式。
2、AVCodec模塊
它實現了大多數常用的編解碼格式,支持編碼(encoder),也支持解碼(decoder), 例如:MPEG4,AAC,MJPEG,H.264(第三方解碼器),H.265等解碼器,同樣,也支持h264對應的x264編碼器,h265支持的x265編碼器。同理,我們也可以對AVcodec進行拓展,增添我們自己的編解碼格式。
3、AVFilter模塊
它提供了一個通用的音頻,視頻,字幕等濾鏡處理框架,它的一個使用樣例如下:
在這張圖中,首先,一個輸入文件進行分割成為兩個流,一個保存原樣([main]),另一個傳入[tmp],經過crop濾鏡和vflip濾鏡處理后,覆蓋在[main]流上,並輸出新的視頻。
例如:ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop = iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
這行命令的刨析:
a、“,”: 用於分割兩個相同的Filter線性鏈,在這里就是crop和vflip
b、“;”: 用於分隔不同的Filter線性鏈
c、[main][flip] 表示這兩個流進行合並,后面overflay表示flip從x = 0, y = H/2這個地方開始覆蓋掉。
4、swscale和swresample模塊
這兩個模塊放在一起介紹:
scale:裁剪,是對視頻圖像進行縮放和像素格式轉換。例如:將圖像從1080p->720p,將圖像數據從yuv420P->YUYV,YUV->RGB。
YUV:Y代表亮度,UV代表色度。用於對視頻圖形進行壓縮。
swresample:重采樣,音頻需要進行采樣,它可以操作音頻采樣,音頻通道(channel)布局轉換和調整。
5、命令分析:
例如;ffmpeg -i input.mp4 output.avi
a、-i: input(輸入),后面接一個輸入文件。
第二個人參數就是輸出文件,在這里是output.avi
b、在這里,這兩個文件不是簡單的進行后綴名的更換,而是對它的封裝格式進行了轉換,轉換過程如下圖:
先讀取輸入流,讓后通過Demuxer(調用libavformat的API)對音頻包進行解封裝,通過Decoder(libavcodec)解包為YUV或PCM數據,然后通過Encoder(libavcodec)對數據進行編碼,再通過muxer(libavformat)進行封裝,最后成為輸出流。
二、ffplay和ffprobe
ffplay:它提供了音視頻的顯示播放功能
ffprobe:它是一個多媒體分析工具,可用查詢你要了解的媒體信息,比如音頻的參數,視頻的參數,時長等。
例:ffprobe -show_streams 那些年,我們一起追的女孩.mp4
然后,這一章的后面還講了FFmpeg支持的封裝和解封裝格式,編碼器與解碼器支持,通信協議支持,這些知識后面遇到再去查。
上面的語言是經過我自己的整理寫的,如果有錯誤,歡迎糾正!