音視頻基本概念和FFmpeg的簡單入門教程詳解

寫在前面
最近正好有音視頻編輯的需求,雖然之前粗略的了解過FFmpeg不過肯定是不夠用的,借此重新學(xué)習(xí)下;
基本概念
ffmpeg概念
Fmpeg的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的“FF”代表“Fast Forward”,F(xiàn)Fmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序??梢暂p易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換組成.
- ffmpeg:是一個命令行工具,用來對視頻文件轉(zhuǎn)換格式,也支持對電視卡實時編碼
- libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能,包含demuxers和muxer庫;
- libavcodec:用于各種類型聲音/圖像編解碼;
- libavfilter:濾鏡庫
- libavutil:包含一些公共的工具函數(shù);
- libswscale:用于視頻場景比例縮放、色彩映射轉(zhuǎn)換;
- libpostproc:用于后期效果處理;
- ffsever:是一個HTTP多媒體實時廣播流服務(wù)器,支持時光平移;
- ffplay:是一個簡單的播放器,使用ffmpeg
- 庫解析和解碼,通過SDL顯示;(一般編譯完沒有帶ffplay,新版本版本依賴于sd-2.0,需要安裝sdl-2.0才能生成ffplay)
容器/文件(Conainer/File):
即特定格式的多媒體文件,一般來說一個視頻文件是由視頻,音頻,字幕等按特定的格式/規(guī)則組合到一起的,常見如:
mp4 flv mkv avi
媒體流(Stream):
表示時間軸上的一段連續(xù)數(shù)據(jù),如一段聲音數(shù)據(jù)、一段視頻數(shù)據(jù)或一段字幕數(shù)據(jù),可以是壓縮的,也可以是非壓縮的,壓縮的數(shù)據(jù)需要關(guān)聯(lián)特定的編解碼器。
數(shù)據(jù)幀/數(shù)據(jù)包(Frame/Packet):
通常,一個媒體流是由大量的數(shù)據(jù)幀組成的,對于壓縮數(shù)據(jù),幀對應(yīng)著編解碼器的最小處理單元,分屬于不同媒體流的數(shù)據(jù)幀交錯存儲于容器之中。
一般: Frame對應(yīng)壓縮前的數(shù)據(jù),Packet對應(yīng)壓縮后的數(shù)據(jù)。
編解碼器(Codec):
視頻和音頻都需要經(jīng)過編碼,才能保存成文件。編解碼器是指以幀為單位實現(xiàn)壓縮數(shù)據(jù)和原始數(shù)據(jù)之間的相互轉(zhuǎn)換的;
編碼:原始數(shù)據(jù)->壓縮數(shù)據(jù);
解碼:壓縮數(shù)據(jù)->原始數(shù)據(jù);
不同的編碼格式(CODEC),有不同的壓縮率,會導(dǎo)致文件大小和清晰度的差異。
常用的視頻編碼格式如下:
H.262 H.264 H.265
示例:原始圖形YUV數(shù)據(jù)用H.264編碼成H264幀

常用的音頻編碼格式如下:
MP3 AAC
示例:原始聲音PCM數(shù)據(jù)用AAC編碼器編碼成AAC幀(是的音頻也有幀)

復(fù)用(mux):
把不同的流按照某種容器的規(guī)則放入容器,這種行為叫做復(fù)用(mux)

解復(fù)用(mux):
把不同的流從某種容器中解析出來,這種行為叫做解復(fù)用(demux)

幀率(Frame rate):
n幀率也叫幀頻率,用FPS表示。幀率是視頻文件中每一秒的幀數(shù),肉眼想看到連續(xù)移動圖像至少需要15幀。
一般電影的幀率為24;
碼率(Bit Rate):
比特率(也叫碼率,數(shù)據(jù)率)是一個確定整體視頻/音頻質(zhì)量的參數(shù),秒為單位處理的位數(shù),碼率和視頻質(zhì)量成正比,在視頻文件中中比特率用bps(bit per second)來表達(dá)。
碼率越低,表示壓縮程度越高,畫質(zhì)越差。
碼率越高,視頻質(zhì)量相對越高,視頻文件也就越大。
FFmpeg
FFmpeg是一個很多的項目,包括很多組件:
- ffmpeg——一個命令行工具,用來對視頻文件轉(zhuǎn)換格式,也支持對電視卡即時編碼
- ffserver——一個HTTP多媒體即時廣播流服務(wù)器,支持時光平移
- ffplay——一個簡單的播放器,基于SDL與FFmpeg庫
- libavcodec——包含全部FFmpeg音頻/視頻編解碼庫
- libavformat——包含demuxers和muxer庫
- libavutil——包含一些工具庫
- libpostproc——對于視頻做前處理的庫
- libswscale——對于視頻作縮放的庫
我們一般說的的FFmpeg 是指FFmpeg 的命令行工具;
第一條FFmpeg命令
ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi
參數(shù)解析
-y # 全局參數(shù),等于npm -y -i input.mp4 #輸入文件,F(xiàn)Fmpeg命令有位置之分, -i 之前是輸入?yún)?shù),之后是輸出參數(shù) -acodec copy #輸出文件參數(shù),復(fù)制音頻編碼而不用重新編碼 -vcodec libx26 #輸出文件參數(shù),重新用libx26編碼(比較慢耗性能) -s 720x1280 #輸出參數(shù), output.avi #輸出文件
可以看到,F(xiàn)Fmpeg一般分為這五個部分,大家參考上面命令對號入座
全局參數(shù)
輸入文件參數(shù)
輸入文件
輸出文件參數(shù)
輸出文件所以這條命令的含義是:把視頻input.mp4不修改音頻的情況下用libx26編碼音頻,同時分辨率改成720*1280,格式改成avi;
視頻信息
左:input.mp4 ,右:output.avi
可以看到視頻文件已經(jīng)完成了命令操作轉(zhuǎn)換;

FFmpeg常用參數(shù)
-c:指定編碼器 -c copy:直接復(fù)制,不經(jīng)過重新編碼 -c:v:指定視頻編碼器 -c:a:指定音頻編碼器 -i:指定輸入文件 -an:去除音頻流 -vn: 去除視頻流,不處理視頻 -preset:指定輸出的視頻質(zhì)量,會影響文件的生成速度,有以下幾個可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。 -y:不經(jīng)過確認(rèn),輸出時直接覆蓋同名文件。 -s: size 設(shè)置幀大小 格式為WXH 缺省160X128.下面的簡寫也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576 -b: bitrate 設(shè)置比特率,缺省200kb/s -vcodec: codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼數(shù)據(jù)直接被拷貝。 -filter: 視頻過濾器,如 -filter:v "crop=w:h:x:y"用過濾器v裁剪視頻 w - 源視頻中裁剪的矩形的寬度 h – 矩形的高度。 x – 我們想自源視頻中裁剪的矩形的 x 坐標(biāo) 。 y – 矩形的 y 坐標(biāo)。 -aspect:設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777 -ss:position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持,比如用來指定剪切開始時間
FFmpeg命令處理流程
我們還是以這條命令為例,分析FFmpeg命令對視頻的處理經(jīng)過哪些流程
ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi
我們看圖:

我們看到命令處理一般分成5個步驟
- 解復(fù)用:把容器文件解析成編碼的數(shù)據(jù)包;
- 解碼:解碼器把數(shù)據(jù)包解碼成數(shù)據(jù)幀;
- filter進行幀處理:把1080 * 1920的數(shù)據(jù)幀處理成720 * 1280
- 重新編碼:編碼器libx264重新把數(shù)據(jù)幀編碼成編碼的數(shù)據(jù)包;
- 復(fù)用:把數(shù)據(jù)包按格式avi封裝;
這個簡單流程比較重要,要了然于心;
FFmpeg常用命令
打印視頻基本信息
$ ffmpeg -i input.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42mp41isomavc1
creation_time : 2021-05-29T16:51:47.000000Z
Duration: 00:00:30.61, start: 0.000000, bitrate: 5932 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1080x1920, 5672 kb/s, 60 fps, 60 tbr, 60 tbn (default)
Metadata:
creation_time : 2021-05-29T16:51:47.000000Z
handler_name : L-SMASH Video Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 253 kb/s (default)
Metadata:
creation_time : 2021-05-29T16:51:47.000000Z
handler_name : L-SMASH Audio Handler
vendor_id : [0][0][0][0]
At least one output file must be specified轉(zhuǎn)換格式修改分辨率
ffmpeg -y -i input.mp4 -s 720x1280 output.avi
視頻靜音處理(移除音頻)
ffmpeg -i input.mp4 -an quiet.mp4
從視頻中提取圖片
ffmpeg -i input.mp4 -r 1 -f image2 -ss 00:00:10 -t 2 image-%2d.png
-r– 設(shè)置幀速度。即,每秒提取幀到圖像的數(shù)字。默認(rèn)值是 25。-f– 表示輸出格式,即,在我們的實例中是圖像。image-%2d.png– 表明我們?nèi)绾蜗朊崛〉膱D像。在這個實例中,命名應(yīng)該像這樣image-01.png、image-02.png、image-03.png 等等開始。如果你使用%3d,那么圖像的命名像 image-001.png、image-002.png 等等開始。
添加/修改封面
ffmpeg -y -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic cover_output.mp4
如果需要把視頻第一幀截出來坐封面,那就先提取
ffmpeg -ss 00:00:01 -i input.mp4 -f image2 cover.png
提取視頻里的音頻文件
ffmpeg -i input.mp4 -vn -c:a copy output.aac
裁剪視頻
ffmpeg -i input.mp4 -filter:v "crop=640:480:120:240" cut.mp4
-filter:v– 表示視頻過濾器。crop– 表示裁剪過濾器。w– 我們想自源視頻中裁剪的矩形的寬度。h– 矩形的高度。x– 我們想自源視頻中裁剪的矩形的 x 坐標(biāo) 。y– 矩形的 y 坐標(biāo)。
視頻截取
ffmpeg -i input.mp4 -ss 00:00:05 -codec copy -t 10 cutout.mp4
-ss開始時間-t10,截取十秒
視頻切割拆分成多個
ffmpeg -i input.mp4 -t 00:00:13 -c copy part1.mp4 -ss 00:00:13 -codec copy part2.mp4
-t 00:00:13 表示從視頻的開始到視頻的第 30 秒創(chuàng)建一部分視頻。
-ss 00:00:13 為視頻的下一部分顯示開始時間戳。它意味著第 2 部分將從第 30 秒開始,并將持續(xù)到原始視頻文件的結(jié)尾。
視頻合并拼接
ffmpeg -i "concat:part1.mp4|part2.mp4" -c:a copy -c:v copy combine.mp4
設(shè)置視屏屏蔽寬高
ffmpeg -i input.mp4 -aspect 4:3 4_3.mp4
通常使用的高寬比是:
- 16:9
- 4:3
- 16:10
- 5:4
- 2:21:1
- 2:35:1
- 2:39:1
添加字幕
ffmpeg -i input.mp4 -i subtitle.srt -c copy output.mkv
是字幕文件,然后這里選用的是軟字幕方式比較快
總結(jié)
根據(jù)項目需要,簡單學(xué)習(xí)了下音視頻的非常基本的概念和FFmpeg的基本使用,留個記錄;
[參考]
https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html
https://zhuanlan.zhihu.com/p/67878761
到此這篇關(guān)于音視頻基本概念和FFmpeg的簡單入門的文章就介紹到這了,更多相關(guān)FFmpeg音視頻內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA2020.3 新特性(小結(jié))
這篇文章主要介紹了IntelliJ IDEA 2020.3 新特性,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-12-12
net-snmp靜態(tài)編譯鏈接的獲取程序及生成執(zhí)行程序詳解
這篇文章主要介紹了net-snmp靜態(tài)編譯鏈接的獲取程序及生成執(zhí)行程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

