FFmpeg基礎(chǔ)入門

FFMPEG簡介
FFmpeg的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的“FF”代表“Fast Forward”,F(xiàn)Fmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。可以輕易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換。FFmpeg的用戶有Google,F(xiàn)acebook,Youtube,優(yōu)酷,愛奇藝,土豆等。
基礎(chǔ)知識
1.容器/文件(Conainer/File):即特定格式的多媒體文件,比如mp4、flv、mkv等。
2.媒體流(Stream):表示時間軸上的一段連續(xù)數(shù)據(jù),如一段聲音數(shù)據(jù)、一段視頻數(shù)據(jù)或一段字幕數(shù)據(jù),可以是壓縮的,也可以是非壓縮的,壓縮的數(shù)據(jù)需要關(guān)聯(lián)特定的編解碼器。
3.數(shù)據(jù)幀/數(shù)據(jù)包(Frame/Packet):通常,一個媒體流是由大量的數(shù)據(jù)幀組成的,對于壓縮數(shù)據(jù),幀對應(yīng)著編解碼器的最小處理單元,分屬于不同媒體流的數(shù)據(jù)幀交錯存儲于容器之中。
一般情況下:
Frame對應(yīng)壓縮前的數(shù)據(jù),Packet對應(yīng)壓縮后的數(shù)據(jù)。
4.編解碼器(Codec):以幀為單位實現(xiàn)壓縮數(shù)據(jù)和原始數(shù)據(jù)之間的相互轉(zhuǎn)換的
5.復(fù)用(mux):把不同的流按照某種容器的規(guī)則放入容器,這種行為叫做復(fù)用(mux)
6.解復(fù)用(mux):把不同的流從某種容器中解析出來,這種行為叫做解復(fù)用(demux)
7. 碼率和幀率是視頻文件的最重要的基本特征,對于他們的特有設(shè)置會決定視頻質(zhì)量。如果我們知道碼率和時長那么可以很容易計算出輸出文件的大小。
8.幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數(shù),肉眼想看到連續(xù)移動圖像至少需要15幀。
9.碼率:比特率(也叫碼率,數(shù)據(jù)率)是一個確定整體視頻/音頻質(zhì)量的參數(shù),秒為單位處理的位數(shù),碼率和視頻質(zhì)量成正比,在視頻文件中中比特率用bps來表達。

FFMPEG命令行環(huán)境搭建
1. 到ffmpeg官方下載已經(jīng)編譯好的Windows shared庫;
2. 將執(zhí)行文件ffmpeg.exe ffplay.exe ffprobe.exe拷貝到C:\Windows目錄;
3. 將相應(yīng)的動態(tài)庫拷貝到C:\Windows\SysWOW64目錄;
注:WOW64 (Windows-on-Windows 64-bit)
4. 在命令行窗口輸入ffmpeg -version 查看版本,以卻確定環(huán)境是否搭建成功。

FFMPEG如何查詢命令幫助文檔
ffmpeg/ffplay/ffprobe區(qū)別
ffmpeg:
Hyper fast Audio and Video encoder
超快音視頻編碼器(類似愛剪輯)
ffplay:
Simple media player簡單媒體播放器
ffprobe:
Simple multimedia streams analyzer
簡單多媒體流分析器

所有信息:ffprobe -h
usage:
ffprobe [OPTIONS] [INPUT_FILE]
ffmpeg/ffplay/ffprobe部分參數(shù)通用,部分參數(shù)不通用,在使用時需要注意。
ffmpeg命令查看幫助文檔
ffplay命令查看幫助文檔
所有信息:ffplay -h
usage:
ffplay [options] input_file
ffmpeg音視頻處理流程

ffmpeg命令分類查詢

ffplay播放控制

ffplay命令選項





ffplay命令播放媒體
播放本地文件
ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4
ffplay buweishui.mp3
播放網(wǎng)絡(luò)流
ffplay -window_title "rtmp stream" rtmp://202.69.69.180:443/webcast/bshdlive-pc
強制解碼器
mpeg4解碼器:ffplay -vcodec mpeg4 test.mp4
h264解碼器:ffplay -vcodec h264 test.mp4
禁用音頻或視頻
禁用音頻:ffplay test.mp4 -an
禁用視頻:ffplay test.mp4 -vn
播放YUV數(shù)據(jù)
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv
播放RGB數(shù)據(jù)
ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb
ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb
播放PCM數(shù)據(jù)
ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
-ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)
-ac set number of audio channels (from 0 to INT_MAX) (default 0)
ffplay簡單過濾器
視頻旋轉(zhuǎn)
ffplay -i test.mp4 -vf transpose=1
視頻反轉(zhuǎn)
ffplay test.mp4 -vf hflip
ffplay test.mp4 -vf vflip
視頻旋轉(zhuǎn)和反轉(zhuǎn)
ffplay test.mp4 -vf hflip,transpose=1
音頻變速播放
ffplay -i test.mp4 -af atempo=2
視頻變速播放
ffplay -i test.mp4 -vf setpts=PTS/2
音視頻同時變速
ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2
ffmpeg命令參數(shù)說明

ffmpeg命令 提取音視頻數(shù)據(jù)
保留封裝格式
ffmpeg -i test.mp4 -acodec copy -vn audio.mp4
ffmpeg -i test.mp4 -vcodec copy -an video.mp4
提取視頻
保留編碼格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264
強制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264
提取音頻
保留編碼格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac
強制格式:ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3
ffmpeg命令提取像素格式和PCM數(shù)據(jù)
ffmpeg命令提取像素格式
提取YUV
提取3秒數(shù)據(jù),分辨率和源視頻一致
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv
提取3秒數(shù)據(jù),分辨率轉(zhuǎn)為320x240
ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv
提取RGB
提取3秒數(shù)據(jù),分辨率轉(zhuǎn)為320x240
ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb
RGB和YUV之間的轉(zhuǎn)換
ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb
提取PCM
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav
ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm
ffmpeg -i test.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_2_f32le_2.pcm
ffmpeg命令轉(zhuǎn)封裝
ffmpeg命令轉(zhuǎn)封裝
保持編碼格式:
ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts
ffmpeg -i test.mp4 -codec copy test_copy2.ts
改變編碼格式:
ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv
修改幀率:
ffmpeg -i test.mp4 -r 15 -codec copy output.mp4 (錯誤命令)
ffmpeg -i test.mp4 -r 15 output2.mp4
修改視頻碼率:
ffmpeg -i test.mp4 -b 400k output_b.mkv (此時音頻也被重新編碼)
修改視頻碼率:
ffmpeg -i test.mp4 -b:v 400k output_bv.mkv
修改音頻碼率:
ffmpeg -i test.mp4 -b:a 192k output_ba.mp4
如果不想重新編碼video,需要加上-vcodec copy
修改音視頻碼率:
ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4
修改視頻分辨率:
ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4
修改音頻采樣率:
ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4
ffmpeg命令過濾器
生成測試文件
找三個不同的視頻每個視頻截取10秒內(nèi)容
ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4
ffmpeg -i 復(fù)仇者聯(lián)盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4
ffmpeg -i 紅海行動.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4
如果音視頻格式不統(tǒng)一則強制統(tǒng)一為 -vcodec libx264 -acodec aac
將上述1.mp4/2.mp4/3.mp4轉(zhuǎn)成ts格式
ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts
ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts
ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts
轉(zhuǎn)成flv格式
ffmpeg -i 1.mp4 -codec copy 1.flv
ffmpeg -i 2.mp4 -codec copy 2.flv
ffmpeg -i 3.mp4 -codec copy 3.flv
分離某些封裝格式(例如MP4/FLV/MKV等)中的H.264的時候,需要首先寫入SPS和PPS,否則會導(dǎo)致分離出來的數(shù)據(jù)沒有SPS、PPS而無法播放。H.264碼流的SPS和PPS信息存儲在AVCodecContext結(jié)構(gòu)體的extradata中。需要使用ffmpeg中名稱為“h264_mp4toannexb”的bitstream filter處理
開始拼接文件
以MP4格式進行拼接
方法1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4
方法2:ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4
以TS格式進行拼接
方法1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4
方法2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4
以FLV格式進行拼接
方法1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4
方法2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4
方法1只適用部分封裝格式,比如TS
建議:
(1)使用方法2進行拼接
(2)轉(zhuǎn)成TS格式再進行拼接
測試不同編碼拼接
修改音頻編碼
ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4 結(jié)果第二段沒有聲音
修改音頻采樣率
ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4 第二段播放異常
修改視頻編碼格式
ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4
修改視頻分辨率
ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsf h264_mp4toannexb 1.ts
ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4
注意:
把每個視頻封裝格式也統(tǒng)一為ts,拼接輸出的時候再輸出你需要的封裝格式,比如MP4
視頻分辨率可以不同,但是編碼格式需要統(tǒng)一
音頻編碼格式需要統(tǒng)一,音頻參數(shù)(采樣率/聲道等)也需要統(tǒng)一
fmpeg命令圖片與視頻互轉(zhuǎn)
截取一張圖片
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg
ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp
-i 輸入
-y 覆蓋
-f 格式 image2 一種格式
-ss 起始值
-vframes 幀 如果大于1 那么 輸出加%03d test%03d.jpg
-s 格式大小size
轉(zhuǎn)換視頻為圖片(每幀一張圖):
ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg
圖片轉(zhuǎn)換為視頻:
ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4
從視頻中生成GIF圖片
ffmpeg -i test.mp4 -t 5 -r 1 image1.gif
ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif
將 GIF 轉(zhuǎn)化為 視頻
ffmpeg -f gif -i image2.gif image2.mp4
發(fā)布于 2020-03-26 20:45