1 FFmpeg介紹
FFmpeg項目由 Fabrice Bellard在2000年創(chuàng)立。到目前為止,F(xiàn)Fmpeg項目的開發(fā)者仍然與VLC、MPV、dav1d、x264等多媒體開源項目有著廣泛的重疊。Ffmpeg(FastForward Mpeg)是一款遵循GPL的開源軟件,在音視頻處理方面表現(xiàn)十分優(yōu)秀,幾乎囊括了現(xiàn)存所有的視音頻格式的編碼,解碼、轉(zhuǎn)碼、混合、過濾及播放。作為最受歡迎的視頻和圖像處理軟件,它被來自各行各業(yè)的不同公司所廣泛使用。同時也是一款跨平臺的軟件,完美兼容Linux、Windows、Mac OSX等平臺。其實它由3大部件組成,號稱音視頻處理工具三劍客:
- Ffmpeg:由命令行組成,用于多媒體格式轉(zhuǎn)換
- Ffplay:基于ffmpeg開源代碼庫libraries做的多媒體播放器
- Ffprobe:基于ffmpeg做的多媒體流分析器
???????Ffmpeg 應(yīng)該是 FFmpeg 工具集中最核心的利器,支持多種多樣的編碼器、解碼器、封裝格式、濾鏡功能。FFmpeg框架的基本組成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模塊庫,結(jié)構(gòu)圖如下:
?(1)AVFormat–FFmpeg的封裝模塊
AVFormat中實現(xiàn)了目前多媒體領(lǐng)域中的絕大多數(shù)媒體封裝格式,包括封裝和解封裝,如MP4、FLV、KV、TS等文件封裝格式,RTMP、RTSP、MMS、HLS等網(wǎng)絡(luò)協(xié)議封裝格式。FFmpeg是否支持某種媒體封裝格式,取決于編譯時是否包含了該格式的封裝庫。根據(jù)實際需求,可進(jìn)行媒體封裝格式的擴(kuò)展,增加自己定制的封裝格式,即在AVFormat中增加自己的封裝處理模塊。
(2)AVCodec–FFmpeg的編解碼模塊
AVCodec中實現(xiàn)了目前多媒體領(lǐng)域絕大多數(shù)常用的編解碼格式,即支持編碼,也支持解碼。AVCodec除了支持MPEG4、AAC、MJPEG等自帶的媒體編解碼格式之外,還支持第三方的編解碼器,如H.264(AVC)編碼,需要使用x264編碼器;H.265(HEVC)編碼,需要使用x264編碼器;MP3(mp3lame)編碼,需要使用libmp3lame編碼器。如果希望增加自己的編碼格式,或者硬件編解碼,則需要在AVCodec中增加相應(yīng)的編解碼模塊。
(3)AVFilter–FFmpeg的濾鏡模塊
AVFilter庫提供了一個通用的音頻、視頻、字幕等濾鏡處理框架。在AVFilter中,濾鏡框架可以有多個輸入和多個輸出。
(4)swresample–FFmpeg的音頻轉(zhuǎn)換計算模塊
swresample模塊提供了高級別的音頻重采樣API。例如允許操作音頻采樣、音頻通道布局轉(zhuǎn)換與布局調(diào)整。
(5)swscale–FFmpeg的視頻圖像轉(zhuǎn)換計算模塊
swscale模塊提供了高級別的圖像轉(zhuǎn)換API,例如它允許進(jìn)行圖像縮放和像素格式轉(zhuǎn)換,常見于將圖像從1080p轉(zhuǎn)換成720p或者480p等的縮放,或者將圖像數(shù)據(jù)從YUV420p轉(zhuǎn)換成YUYV,或者YUV轉(zhuǎn)RGB等圖像格式轉(zhuǎn)換。
2 conda環(huán)境安裝ffmpeg
(1)annoconda環(huán)境安裝
安裝方法詳見:annoconda安裝
(2)ffmpeg安裝
conda install ffmpeg
3 ffmpeg命令
FFMPEG提供的命令行(CLI)工具ffmpeg,其使用方法如下(方括號表示可選項,花括號表示必選項目):
ffmpeg [global options] {[infile options]['-i' 'infile'] ...} {[outfile options] 'outfile' ...}
參數(shù)選項由三部分組成:可選的一組全局參數(shù)、一組或多組輸入文件參數(shù)、一組或多組輸出文件參數(shù),其中,每組輸入文件參數(shù)以‘-i’為結(jié)束標(biāo)記;每組輸出文件參數(shù)以輸出文件名為結(jié)束標(biāo)記。
(1)能力集列表
-
-formats:列出支持的文件格式。
-
-codecs:列出支持的編解碼器。
-
-decoders:列出支持的解碼器。
-
-encoders:列出支持的編碼器。
-
-protocols:列出支持的協(xié)議。
-
-bsfs:列出支持的比特流過濾器。
-
-filters:列出支持的濾鏡。
-
-pix_fmts:列出支持的圖像采樣格式。
-
-sample_fmts:列出支持的聲音采樣格式。
使用方法:
ffmpeg configure -encoders
(2)常用輸入選項
-
-i filename:指定輸入文件名。
-
-f fmt:強(qiáng)制設(shè)定文件格式,需使用能力集列表中的名稱(缺省是根據(jù)擴(kuò)展名選擇的)。
-
-ss hh:mm:ss[.xxx]:設(shè)定輸入文件的起始時間點(diǎn),啟動后將跳轉(zhuǎn)到此時間點(diǎn)然后開始讀取數(shù)據(jù)。
對于輸入,以下選項通常是自動識別的,但也可以強(qiáng)制設(shè)定。
-
-c codec:指定解碼器,需使用能力集列表中的名稱。
-
-acodec codec:指定聲音的解碼器,需使用能力集列表中的名稱。
-
-vcodec codec:指定視頻的解碼器,需使用能力集列表中的名稱。
-
-b:v bitrate:設(shè)定視頻流的比特率,整數(shù),單位bps。
-
-r fps:設(shè)定視頻流的幀率,整數(shù),單位fps。
-
-s WxH : 設(shè)定視頻的畫面大小。也可以通過掛載畫面縮放濾鏡實現(xiàn)。
-
-pix_fmt format:設(shè)定視頻流的圖像格式(如RGB還是YUV)。
-
-ar sample rate:設(shè)定音頻流的采樣率,整數(shù),單位Hz。
-
-ab bitrate:設(shè)定音頻流的比特率,整數(shù),單位bps。
-
-ac channels:設(shè)置音頻流的聲道數(shù)目。
(3)常用輸出選項
-
-f fmt:強(qiáng)制設(shè)定文件格式,需使用能力集列表中的名稱(缺省是根據(jù)擴(kuò)展名選擇的)。
-
-c codec:指定編碼器,需使用能力集列表中的名稱(編碼器設(shè)定為”copy“表示不進(jìn)行編解碼)。
-
-acodec codec:指定聲音的編碼器,需使用能力集列表中的名稱(編碼器設(shè)定為”copy“表示不進(jìn)行編解碼)。
-
-vcodec codec:指定視頻的編碼器,需使用能力集列表中的名稱(編解碼器設(shè)定為”copy“表示不進(jìn)行編解碼)。
-
-r fps:設(shè)定視頻編碼器的幀率,整數(shù),單位fps。
-
-pix_fmt format:設(shè)置視頻編碼器使用的圖像格式(如RGB還是YUV)。
-
-ar sample rate:設(shè)定音頻編碼器的采樣率,整數(shù),單位Hz。
-
-b bitrate:設(shè)定音視頻編碼器輸出的比特率,整數(shù),單位bps。
-
-ab bitrate:設(shè)定音頻編碼器輸出的比特率,整數(shù),單位bps。
-
-ac channels:設(shè)置音頻編碼器的聲道數(shù)目。
-
-an 忽略任何音頻流。
-
-vn 忽略任何視頻流。
-
-t hh:mm:ss[.xxx]:設(shè)定輸出文件的時間長度。
-
-to hh:mm:ss[.xxx]:如果沒有設(shè)定輸出文件的時間長度的畫可以設(shè)定終止時間點(diǎn)。
(4)流標(biāo)識
FFMPEG的某些選項可以對一個特定的媒體流起作用,這種情況下需要在選項后面增加一個流標(biāo)識。流標(biāo)識允許以下幾種格式:
-
流序號。譬如“:1”表示第二個流。
-
流類型。譬如“:a“表示音頻流,流類型可以和流序號合并使用,譬如“:a:1”表示第二個音頻流。
-
節(jié)目。節(jié)目和流序號可以合并使用。
-
流標(biāo)識。流標(biāo)識是一個內(nèi)部標(biāo)識號。
假如要設(shè)定第二個音頻流為copy,則需要指定-codec:a:1 copy
(5)音頻選項
-
-aframes:等價于frames:a,輸出選項,用于指定輸出的音頻幀數(shù)目。
-
-aq:等價于q:a,老版本為qscale:a,用于設(shè)定音頻質(zhì)量。
-
-atag:等價于tag:a,用于設(shè)定音頻流的標(biāo)簽。
-
-af:等價于filter:a,用于設(shè)定一個聲音的后處理過濾鏈,其參數(shù)為一個描述聲音后處理鏈的字符串。
(6)視頻選項
-
-vframes:等價于frames:v,輸出選項,用于指定輸出的視頻幀數(shù)目。
-
-aspect:設(shè)置寬高比,如4:3、16:9、1.3333、1.7777等。
-
-bits_per_raw_sample:設(shè)置每個像素點(diǎn)的比特數(shù)。
-
-vstats:產(chǎn)生video統(tǒng)計信息。
-
-vf:等價于filter:v,用于設(shè)定一個圖像的后處理過濾鏈,其參數(shù)為一個描述圖像后處理鏈的字符串。
-
-vtag:等價于tag:v,用于設(shè)定視頻流的標(biāo)簽。
-
-force_fps:強(qiáng)制設(shè)定視頻幀率。
-
-force_key_frames:顯式控制關(guān)鍵幀的插入,參數(shù)為字符串,可以是一個時間戳,也可以是一個“expr:”前綴的表達(dá)式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”
(7)高級選項
-
-re:要求按照既定速率處理輸入數(shù)據(jù),這個速率即是輸入文件的幀率。
-
-map:指定輸出文件的流映射關(guān)系。例如 “-map 1:0 -map 1:1”要求將第二個輸入文件的第一個流和第二個流寫入到輸出文件。如果沒有-map選項,ffmpeg采用缺省的映射關(guān)系。
4 ffmpeg使用示例
(1)視頻播放
- 播放視頻
????????ffplay input.mp4
- 播放完自動退出
????????ffplay -autoexit input.mp4
- 設(shè)置視頻的屏幕高寬比
????????ffmpeg -i input.mp4 -aspect 16:9 output.mp4
(2)視頻壓縮與拼接
- 視頻壓縮
????????ffmpeg -i demo.mp4 -vcodec h264 -vf scale=640:-2 -threads 4 result.mp4
????????ffmpeg -i demo.mp4 -strict -2 -vcodec h264 result.mp4
- 將4個視頻拼接成一個很長的視頻(無聲音)
????????ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][1:0] [2:0][3:0] concat=n=4:v=1 [v]' -map '[v]' output.mp4
- 將3個視頻拼接成一個很長的視頻(有聲音)
????????ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex '[0:0][0:1] [1:0][1:1] [2:0][2:1] concat=n=3:v=1:a=1 [v][a]' -map '[v]' -map '[a]’? output.mp4
- 橫向拼接2個視頻
????????ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
- 豎向拼接2個視頻
????????ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4
- 橫向拼接3個視頻
????????ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out_2.mp4
- 豎向拼接3個視頻
????????ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out_v4.mp4
- 4個視頻2x2方式排列
????????ffmpeg -i 0.mp4 -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4
(2)視頻幀操作
- 查看每幀的信息
????????ffprobe -v error -show_frames gemfield.mp4
- 從一個視頻文件中抽取一幀圖像
????????ffmpeg -y -i demo.mp4 -ss 00:03:22.000 -vframes 1 -an result.jpg
- 查看視頻總幀數(shù)
????????ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4
- 查看視頻總幀數(shù)
????????ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 gemfield.mp4
- 查看 key frame 幀數(shù)
????????ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 -skip_frame nokey gemfield.mp4
- 查看 key frame 所在的時間
????????ffprobe -v error -skip_frame nokey -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 gemfield.mp4
- 查看 key frame 分布的情況
????????ffprobe -v error -show_frames gemfield.mp4 | grep pict_type
- 查看 key frame 所在的幀數(shù)
????????ffprobe -v error -select_streams v -show_frames -show_entries frame=pict_type -of csv gemfield.mp4 | grep -n I | cut -d ':' -f 1
- 重新設(shè)置 key frame interval
????????ffmpeg -i gemfield.mp4 -vcodec libx264 -x264-params keyint=1:scenecut=0 -acodec copy out.mp4
- 查看視頻波特率
????????ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 gemfield.mp4
(3)圖片與視頻
- 從一個視頻生成一個分辨率修改為640*640的新視頻
????????ffmpeg -i demo.avi -vf scale=640:640 result.avi?
- 從視頻中抽取視頻(讓視頻靜音)
????????ffmpeg -i video_input.mp4 -an -video_output.mp4
????????ffmpeg -i input.mp4 -vcodec copy -an output.mp4
- 截取一張352x240尺寸大小的,格式為jpg的圖片
?????? ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg
- 把視頻的前30幀轉(zhuǎn)換成一個Animated Gif
?????? ffmpeg -i test.asf -vframes 30 -y -f gif a.gif
- 截取指定時間的縮微圖
?????? ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg
- 將一個avi文件轉(zhuǎn)成mp4格式
????????ffmpeg -i demo.avi -acodec copy -vcodec copy result.mp4
- 為視頻增加字幕
????????ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
- 轉(zhuǎn)換文件為3GP格式
?????? ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144
-acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp
- 將一個mp4文件的音視頻流實時轉(zhuǎn)碼之后發(fā)送給某個遠(yuǎn)程設(shè)備,遠(yuǎn)程設(shè)備可以通過http獲取的sdp文件來接收rtp媒體數(shù)據(jù)。
??????? ffmpeg -re -i demo.mp4 -acodec copy -vcodec libx264 -s 480x270 -map 0:0 -f rtp rtp://10.10.10.100:1234 -map 0:1 -f rtp rtp://10.10.10.100:1238 > /var/www/live.sdp
- 使用ffmpeg錄像屏幕
????????ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024x768 ~/test.avi
- 重新調(diào)整視頻尺寸大小
????????ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi
- 把攝像頭的實時視頻錄制下來,存儲為文件
????????ffmpeg? -f video4linux -s 320*240 -r 10 -i /dev/video0? test.asf
- 圖片轉(zhuǎn)視頻(規(guī)則的名稱)
????????ffmpeg -f image2 -i 'in%6d.jpg' -vcodec libx264 -r 25 -b 200k test.mp4
- 圖片轉(zhuǎn)視頻(不規(guī)則的名稱)
??????? 方法1:不規(guī)則圖片名稱合成視頻文件
????????ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' out.mp4
????????cat *.png | ffmpeg -f image2pipe -i - output.mp4
??????? 方法2:先動手把不規(guī)則文件重命名規(guī)則圖片名。
def getTpyeFile(filelist, type):
res = []
for item in filelist:
name, suf = os.path.splitext(item) # 文件名,后綴
if suf == type:
res.append(item)
return res
pwd = os.getcwd() # 返回當(dāng)前目錄的絕對路徑
dirs = os.listdir() # 當(dāng)前目錄下所有的文件名組成的數(shù)組
typefiles = getTpyeFile(dirs, '.jpg')
for i in range(0,len(typefiles)):
os.rename(typefiles[i],"./%d.jpg" % (i)) #將文件以數(shù)字規(guī)則命令
將需要合成的圖片放在txt中,通過讀取txt文件合并成視頻。
????????ffmpeg -f concat -i files.txt output.mp4
- 壓縮視頻文件
????????ffmpeg -i video_input.mp4 -r 24 video_output.mp4
- 通過壓縮音頻來降低視頻文件的體積
????????ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
(4)音頻處理
- 音頻播放
????????ffplay demo.ape
- 顯示波形圖
????????ffplay -showmode 1 demo.ape
- 顯示頻譜圖
????????ffplay -showmode 2 demo.ape
- 從視頻中抽取音頻
????????ffmpeg -i video.mp4 -vn audio.mp3
- 指定編碼比特率從視頻中抽取音頻
????????ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
- 為音頻增加封面圖片
????????ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
- 使用alsa接口錄制一段音頻存放到某個wav文件中
??????? ffmpeg -f alsa -i hw:0 -t 100 result.wav
- 使用alsa接口搭建一個個人網(wǎng)絡(luò)電臺
??????? ffmpeg -f alsa -i default -acodec aac -strict -2 -b:a 128k -r 44100 /var/www/data/main.m3u8
- 壓縮媒體文件
????????ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
????????ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
(5)格式轉(zhuǎn)換
- MPEG4編碼轉(zhuǎn)成H264編碼
????????ffmpeg -i input.mp4 -strict -2 -vcodec h264 output.mp4
- H264編碼轉(zhuǎn)成MPEG4編碼?
????????ffmpeg -i input.mp4 -strict -2 -vcodec mpeg4 output.mp4
- webp轉(zhuǎn)換成jpg
????????ffmpeg -i in.webp out.jpg
- webp轉(zhuǎn)換成png
????????ffmpeg -i in.webp out.png
- jpg轉(zhuǎn)換成png
????????ffmpeg -i in.jpg out.png
- jpg轉(zhuǎn)換成webp
????????ffmpeg -i in.jpg out.webp
- ?png轉(zhuǎn)換成webp
????????ffmpeg -i in.png out.webp
- png轉(zhuǎn)換成jpg
????????ffmpeg -i in.png out.jpg
(6)其它指令
- 查看FFmpeg支持的編碼器
????????ffmpeg configure -encoders
- 查看FFmpeg支持的解碼器
????????ffmpeg configure -decoders
- 查看FFmpeg支持的通信協(xié)議
????????ffmpeg configure -protocols
- 查看FFmpeg所支持的音視頻編碼格式、文件封裝格式與流媒體傳輸協(xié)議?
????????ffmpeg configure --help
- 從開始裁剪媒體文件
????????ffmpeg -i input_video.mp4 -t 5 output_video.mp4
????????ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
- 剪輯中間一段媒體文件
????????通過 -ss 給出一個開始時間,-to 給出結(jié)束時間
????????ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
????????ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
????????ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
????????ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
?文章來源地址http://www.zghlxwxcb.cn/news/detail-479173.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-479173.html
?
?
到了這里,關(guān)于FFmpeg音視頻處理工具介紹及應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!