1.學前知識 1.1視頻碼率值 碼率公式: 碼率(kbps)=文件大度小(KB)*8/時間(秒) 所以碼率和視頻文件大小成正比的,不過碼率超過一定值後,人眼是看不出效果的. 接下來,我們便先來學習ffmpeg命令使用 2.ffmpeg常用命令使用 ffmpeg命令- 用於轉碼的應用程式, 也可以從u ...
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 -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
下章學習: 移植到QT使用