1.學前知識
1.1視頻碼率值
碼率公式: 碼率(kbps)=檔案大小(KB)*8/時間(秒)
所以碼率和視頻檔案大小成正比的,不過碼率超過一定值后,人眼是看不出效果的.

接下來,我們便先來學習ffmpeg命令使用
2.ffmpeg常用命令使用
ffmpeg命令- 用于轉碼的應用程式, 也可以從url/現場音頻/視頻源抓取輸入源
參考:http://ffmpeg.org/ffmpeg.html
常用引數使用
主要引數
- -i 設定輸入流
- -f 設定輸出格式
- -ss 00:00:15 從制定時間開始轉換(如果不加:則表示為秒,比如-ss 70,表示從第70秒開始)
- -t 00:01:15 設定輸出的視頻時長時間(如果不加:則表示為秒,比如-t 110,表示110秒)
- -y 覆寫已有檔案
- -fs limit_size 設定檔案大小上限
視頻引數
- -b:v 640k設定視頻碼率為640k,默認為200Kbit/s
- -minratee 600k 設定視頻碼率最小閾值為700k
- -maxrate 700k 設定視頻碼率最大閾值為700k
- -r 60 設定幀速率fps為60,默認為25
- -s 720x352 設定畫面的寬與高為720X352
- -aspect 16:9 設定畫面的比例為16:9 (也可以使用1.3333, 1.7777)
- -vn 不處理視頻(比如只提取音頻的時候)
- -vcodec 設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器(比如-vcodec codec,表示使用輸入流的格式, -vcodec xvid表示使用XVID編碼壓縮視頻)
- -vf scale=960:540 將輸入的視頻壓縮至960X540輸出,如果寫為960:-1,則輸出時保持原始的寬高比
音頻引數
- -ar 22500 設定采樣率(audio rate)為22.5khz (單位:Hz),PSP只認24000
- -b:a 640k 設定音頻碼率為640k,默認為200Kbit/s
- -ac 2 設定聲音的Channel數為2(1就是單聲道,2就是立體聲)
- -acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器(比如-acodec codec,表示使用輸入流的格式, -acodec aac表示使用aac編解碼)
- -an 不處理音頻(比如只提取視頻的時候)
示例命令如下所示:
ffmpeg –h //打開幫助 ffmpeg -i input.avi -b:v 640k output.ts //轉換為ts視頻檔案
ffmpeg -i test.mp4 -f s16le out.pcm //提取原始音頻資料,s16le表示(signed 16 bits little endian, 有符號 16 位小端)
ffmpeg -i test.mp4 -vn music.aac //提取出音頻檔案 ffmpeg -i test.mp4 -vn music.aac //提取出音頻檔案 ffmpeg -i input.mp4 -vcodec copy -an output.mp4 //輸出的視頻取消掉音頻流 //-i input.avi:表示輸入檔案為input.avi //-b:v 640k:設定輸出的視頻檔案碼率值 // output.ts:生成的檔案名稱 ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv //-an:取消output.ts視頻檔案的音頻流 ./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4 //將logo貼在左上角 ./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4 //貼在右下角 ./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay0:H-h output.mp4 //貼在左下角, overlay W-w:0 貼在右上角 ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4 //添加過濾器,位置位于[0,0],w=220,h=90,厚度為100(厚度越大,越模糊).1:表示有一個綠色的矩形,設定為0就表示沒有 ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg // -r :設定幀數為1, -q:v:設定jpeg圖片質量為高質量(2),所以每隔一秒,存一張圖片下來 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg // - ss :設定開始時間,-t:設定time時間長度, -f 設定輸出格式 , 所以會從input.mp4的第20s時間開始,往下10s,每隔1s就抓一幀,總共會抓10幀, ffmpeg -i input.mkv -y -f image2 -ss 10 -r 1 -t 1 –s 350x220 a.jpg //截取一張第10秒的352x220尺寸大小的,格式為jpg的a.jpg圖片
3.ffplay常用命令使用
ffplay命令- FFplay是一個非常簡單和可移植的媒體播放器,使用FFmpeg庫和SDL庫,它主要用作各種FFmpeg API的測驗平臺
參考: http://ffmpeg.org/ffplay.html
最簡單的播放命令: ffplay input.avi
播放的時候,支持的快捷鍵有:
- q,ESC : 退出,
- f : 切換全屏,
- P,空格鍵 : 停下來,
- m : 切換靜音,
- 9, 0 : 分別減少和增加體積,
- /, * : 分別減少和增加體積,
- a : 在當前程式中回圈音頻通道,
- v : 回圈視頻頻道,
- t : 當前程式中的回圈字幕通道,
- c : 回圈程式,
- w:回圈視頻過濾器或顯示模式,
- s : 進入下一幀
- left/right : 尋找向后/向前10秒,
- down/up : 向后/前進1分鐘,
- page down/page up : 尋找上一視頻/下一視頻,或者,如果沒有,請向后/向前尋求10分鐘,
- 滑鼠右鍵單擊 : 在檔案中尋求與寬度分數相對應的百分比,
- 滑鼠左鍵雙擊 : 切換全屏,
4.ffprobe常用命令使用
ffprobe命令- ffprobe用來查看多媒體檔案的資訊
常用命令如下所示:
ffprobe -show_packets input.mp4 //獲取檔案資訊并顯示檔案中每個幀的包資訊(包含audio和video包),如下圖所示:

- codec_type : 幀型別,如視頻包、音頻包等
- stream_index : 多媒體的stream索引(上圖的stream0表示video資料,steam1表示audio資料)
- pts(Presentation Time Stamp) : 顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的資料,
- pts_time : 將pts換算為時間后的值
- dts(Decoding Time Stamp) : 解碼時間戳,表示在什么時候解碼的這一幀資料,
- dts_time : 將dts換算為時間后的值
- duration : 該幀占用的時間值(需要持續多久切換下一幀)
- duration_time : 根據不同格式計算后的多媒體包占用的時間值
- size : 該幀的大小
- pos : 該幀所在的檔案偏移位置
- flags : 該幀標記,如關鍵包與非關鍵包的標記
ffprobe -show_packets -show_data input.mp4 //獲取檔案資訊并顯示檔案中每個幀的包資訊以及包里的具體data資訊 ffprobe -show_format input.mkv //獲取檔案資訊以及格式資訊,如下圖所示:

- nb_streams : 打開的視頻檔案中流的數量,一般為2,表示音頻流和視頻流
- nb_programs : 節目數
- format_name : 檔案封裝格式名稱, 該檔案的格式是Matroska,webm(MKV的全稱)格式
- format_long_name : 檔案封裝格式具體的名稱
- start_time : 起始時間
- duration : 視頻總時長
- size : 檔案大小
- bit_rate : 碼率, 碼率公式為 碼率(kbps)=檔案大度小(KB)*8/時間(秒)
- probe_score : 探測出的視頻評分,100是最大的分數,這意味著FFmpeg確信格式是真實的
ffprobe -show_streams input.mkv //獲取視頻檔案中流的具體資訊,比如音頻采樣率、視頻尺寸、幀率等
5.視頻解碼步驟
首先將讀取視頻封裝,然后通過不同的封裝格式讀取出視頻碼流(比如:h.264、mpeg4等),然后再通過視頻碼流解碼出yuv
比如mkv視頻: mkv->h.264->yuv
下章學習: 5.FFMPEG-Qt移植ffmpeg、ffmpeg結構體介紹
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27260.html
標籤:C++
上一篇:【QT】QT的下載
