導航:首頁 > 使用方法 > ffmpeg使用方法

ffmpeg使用方法

發布時間:2022-11-26 17:14:47

『壹』 FFmpeg命令行使用

FFmpeg的命令非常多,經常看著會雲里霧里的,個人認為沒必要去硬背,只要打開Terminal,輸入 ffmpeg -help 命令,這條命令會告述你FFmpeg支持的大部分常用命令以及使用方式。查看這些輸出的信息,基本上就會使用很多常用的命令了。
你會發現執行 ffmpeg -help 會輸出一大坨,那都是些啥玩意呢,不著急,咱們一步一步來慢慢品嘗。

第一個就是輸出我們安裝的FFmpeg的版本號

--prefix 是指FFmpeg的安裝路徑
--enable 是你安裝的FFmpeg支持的三方庫 這里可以看出支持 libx264 、 libx265 的編碼,以及支持 videotoolbox , videotoolbox 是Mac、iOS上的一個系統自帶硬編解碼庫,FFmpeg也給予了支持,非常的給力。

這是輸出FFmpeg裡麵包含的庫,這些都是獨立的,是可以單獨拎出來使用的,你如果只要編解碼,那你就只要在項目中導入 libavcodec 即可

這是告訴我們命令行使用格式
[options] 這個是全局參數
[infile options] 這個是輸入文件的參數
infile 這個是輸入文件的路徑
[outfile options] 這個是輸出文件的參數
outfile 這個是輸出文件的路徑
細心的你肯定發現 infile 、 outfile 的後面有個 ... ,這是在告訴我們輸入、輸出文件可以分別有一個或者多個。
比如執行 ffmpeg -i test.h264 -i test.aac -c test.mp4
這條命令會把一個h264文件和一個aac的音頻文件合並並輸出一個mp4格式的文件,這其中就有兩個輸入文件、一個輸出文件。

這些是詳細的幫助信息
-h long 列印更多的選項參數。
-h full 列印所有的選項參數,包括所有針對於 format 和 codec 的選項,信息特別的長。
man ffmpeg : 查看FFmpeg的幫助手冊。
-h type=name 列印指定名稱的 decoder/encoder/demuxer/muxer/filter 的所有選項信息。
比如你要查詢 scale 濾鏡的使用方式,我們就執行 ffmpeg -h filter=scale
輸出如下:

這就告訴我們 scale 濾鏡有 w 、 h 等參數,我們就這樣使用 scale 濾鏡,
ffmpeg -i input.mp4 -filter_complex "scale=w=iw/2h=ih/2" output.mp4
其中 iw 代表輸入視頻的寬, ih 代表輸入視頻的高,這條命令就把輸入的視頻縮小一倍,這里你可能會有疑問,我都不記得那些濾鏡的名字,就無法使用這個去查了,哈哈不要急,還記得上面的幫助命令嗎, ffmpeg -filters 可以輸出所有的濾鏡名字了,如果你覺的輸出太多,你不好找的話,你只要記得這個濾鏡大概是叫什麼名字、包含什麼字母,你就藉助 grep 指令去輸出裡面搜索關鍵字,這樣就只會輸出你關心的濾鏡名了,如 ffmpeg -filters | grep over

以上是幫助命令,如果你忘記了某個編譯器、像素格式或者濾鏡的名字,你就可以用這些命令去查看。

以上就是全局參數

以上是音視頻的公共參數

以上是視頻處理相關參數

以上是音頻處理相關

以上字幕處理相關參數

以上就是 ffmpeg -help 的輸出說明了,下面咱們來看看常用的命令。

-r 10 表示1秒視頻會生成10張圖片

-f avfoundation 指定採用avfoundation採集數據使用
-i 1:0 表示 指定視頻設備索引為1,指定錄音設備索引為0。
使用 ffmpeg -list_devices 1 -f avfoundation -i '' 可以列印出設備列表,如下:

因此上述命令中的 -i 1:0 表示採用【Capture screen 0】【Built-in Microphone】即採用屏幕和系統自帶的麥克風進行採集。

『貳』 ffmpeg 基本用法

1、libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;
2、libavcodec:用於各種類型聲音/圖像編解碼;
3、libavutil:包含一些公共的工具函數;
4、libswscale:用於視頻場景比例縮放、色彩映射轉換;
5、libpostproc:用於後期效果處理;
6、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼;
7、ffsever:是一個HTTP多媒體實時廣播流伺服器,支持時光平移;
8、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;
在這組成部分中,需要熟悉基礎概念有
容器(Container)
容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。
流(Stream)
是一種視頻數據信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據。
幀(Frame)
幀代表一幅靜止的圖像,分為I幀,P幀,B幀。
編解碼器(Codec)
是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
復用/解復用(mux/demux)
把不同的流按照某種容器的規則放入容器,這種行為叫做復用(mux)
把不同的流從某種容器中解析出來,這種行為叫做解復用(demux)

1、FFmpeg程序把-i參數指定的若干文件內容讀入到內存,按照輸入的參數或者程序默認的參數來處理並且把結果寫入到若乾的文件中。輸入和輸出文件可以是計算機文件、管道、網路流、捕獲設備等。
2、FFmpeg用libavformat包調用解復用器(demuxers)來讀取輸入文件中被編碼的數據包(packets),如果有多個輸入文件,FFmpeg以有效輸入流的最小時間戳來同步,
3、然後解碼器(decoder)從已編碼的數據包中產生未被壓縮的幀(frame),在那之後調用可選的過濾器。
4、這些幀被傳遞到編碼器,編碼器會產生新的編碼包
5、把新的編碼包傳遞給復用器(muxer)處理並且把結果寫入到輸出文件中。

在多媒體處理中,filter的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟體工具。如:視頻翻轉,旋轉,縮放等。
語法:[input_link_label1]… filter_name=parameters [output_link_label1]…
1、視頻過濾器 -vf
如input.mp4視頻按順時針方向旋轉90度
ffplay -i input.mp4 -vf transpose=1
如input.mp4視頻水平翻轉(左右翻轉)
ffplay -i input.mp4 -vf hflip
2、音頻過濾器 -af
實現慢速播放,聲音速度是原始速度的50%
offplay input.mp3 -af atempo=0.5

過濾器鏈(Filterchain)
Filterchain = 逗號分隔的一組filter
語法:「filter1,filter2,filter3,…filterN-2,filterN-1,filterN」
順時針旋轉90度並水平翻轉
ffplay -i input.mp4 -vf transpose=1,hflip

過濾器圖(Filtergraph)
第一步: 源視頻寬度擴大兩倍。
ffmpeg -i ji.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源視頻水平翻轉
ffmpeg -i ji.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻轉視頻覆蓋output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很復雜?
用帶有鏈接標記的過濾器圖(Filtergraph)只需一條命令

基本語法
Filtergraph = 分號分隔的一組filterchain
「filterchain1;filterchain2;…filterchainN-1;filterchainN」

Filtergraph的分類
1、簡單(simple) 一對一
2、復雜(complex)多對一, 多對多
簡單過濾器圖處理流程:

復雜過濾器圖處理流程:

對於剛才用三步處理的方式,用過濾器圖可以這樣做:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split過濾器創建兩個輸入文件的拷貝並標記為[a],[b]
F2: [a]作為pad過濾器的輸入,pad過濾器產生2倍寬度並輸出到[1].
F3: [b]作為hflip過濾器的輸入,vflip過濾器水平翻轉視頻並輸出到[2].
F4: 用overlay過濾器把 [2]覆蓋到[1]的旁邊.

一些多媒體容器比如AVI,mkv,mp4等,可以包含不同種類的多個流,如何從容器中抽取各種流呢?
語法:
-map file_number[:stream_type][:stream_number]

這有一些特別流符號的說明:
1、-map 0 選擇第一個文件的所有流
2、-map i:v 從文件序號i(index)中獲取所有視頻流, -map i:a 獲取所有音頻流,-map i:s 獲取所有字幕流等等。
3、特殊參數-an,-vn,-sn分別排除所有的音頻,視頻,字幕流

tip:對比上面的圖,可以知道,假設有兩個文件ffmpeg -i fist.mp4 -i second.mp4 ..output.mp4
如果想去兩個文件的音視頻流 ffmpeg -i fist.mp4 -i second.mp4 map:0 -map 1 output.mp4
如果想去第一個文件的視頻流,第二個文件的音頻流ffmpeg -i fist.mp4 -i second.mp4 -map:v:0 -map:a:0 output.mp4

可用的bit流 :ffmpeg –bsfs
可用的編解碼器:ffmpeg –codecs
可用的解碼器:ffmpeg –decoders
可用的編碼器:ffmpeg –encoders
可用的過濾器:ffmpeg –filters
可用的視頻格式:ffmpeg –formats
可用的聲道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的協議:ffmpeg -protocals

碼率和幀率是視頻文件的最重要的基本特徵,對於他們的特有設置會決定視頻質量。如果我們知道碼率和時長那麼可以很容易計算出輸出文件的大小。

幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數,肉眼想看到連續移動圖像至少需要15幀。
碼率:比特率(也叫碼率,數據率)是一個確定整體視頻/音頻質量的參數,秒為單位處理的位元組數,碼率和視頻質量成正比,在視頻文件中中比特率用bps來表達。

設置幀率
1、用 -r 參數設置幀率
ffmpeg –i input.mp4 –r fps output.mp4
2、用fps filter設置幀率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

設置碼率 –b 參數
-b
ffmpeg -i film.avi -b 1.5M film.mp4
音頻:-b:a 視頻: - b:v
設置視頻碼率為1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4

控制輸出文件大小
-fs (file size首字母縮寫)
ffmpeg -i input.avi -fs 1024K output.mp4
計算輸出文件大小
(視頻碼率+音頻碼率) * 時長 /8 = 文件大小K

用-s參數設置視頻解析度,參數值wxh,w寬度單位是像素,h高度單位是像素
ffmpeg -i input_file -s 320x240 output_file

2、預定義的視頻尺寸
下面兩條命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi
下表列出了所有的預定義尺寸

Scale filter調整解析度
Scale filter的優點是可以使用一些額外的參數
語法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的額外參數

下面兩條命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4

對輸入視頻成比例縮放
改變為源視頻一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改變為原視頻的90%大小:
ffmpeg -i input.mpg -vf scale=iw 0.9:ih 0.9 output.mp4

在未知視頻的解析度時,保證調整的解析度與源視頻有相同的橫縱比。
寬度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1

相反地,高度固定300,寬度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300

從輸入文件中選取你想要的矩形區域到輸出文件中,常見用來去視頻黑邊。
語法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]

裁剪輸入視頻的左三分之一,中間三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的默認值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中間一半區域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

比較裁剪後的視頻和源視頻比較
ffplay -i ji.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2 iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w 2.4:40

自動檢測裁剪區域�
cropdetect filter 自動檢測黑邊區域
ffplay ji.mp4 -vf cropdetect

填充視頻(pad)
在視頻幀上增加一快額外額區域,經常用在播放的時候顯示不同的橫縱比
語法:pad=width[:height:[:x[:y:[:color]]]]

創建一個30個像素的粉色寬度來包圍一個SVGA尺寸的圖片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

同理可以製作input.mp4視頻用30個像素粉色包圍視頻
ffplay -i input.mp4 -vf pad=iw+60:ih+60:30:30:pink

4:3到16:9
一些設備只能播放16:9的橫縱比,4:3的橫縱比必須在水平方向的兩邊填充成16:9,
高度被保持,寬度等於高度乘以16/9,x(輸入文件水平位移)值由表達式(output_width - input_width)/2來計算。
4:3到16:9的通用命令是:
ffmpeg -i input.mp4 -vf pad=ih 16/9:ih :(ow-iw)/2:0:color output.mp4
eg:ffplay -f input.mp4 -vf pad=ih
16/9:ih:(ow-iw)/2:0:pink

16:9到4:3
為了用4:3的橫縱比來顯示16:9的橫縱比,填充輸入文件的垂直兩邊,寬度保持不變,高度是寬度的3/4,y值(輸入文件的垂直偏移量)是由一個表達式(output_height-input_height)/2計算出來的。
16:9到4:3的通用命令:
ffmpeg -i input.mp4-vf pad=iw :iw 3/4:0:(oh-ih)/2:color output.mp4
eg:ffplay -i input.mp4 =size=320x180 -vf pad=iw:iw
3/4:0:(oh-ih)/2:pink

水平翻轉語法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
垂直翻轉語法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip

語法:transpose={0,1,2,3}
0:逆時針旋轉90°然後垂直翻轉
1:順時針旋轉90°
2:逆時針旋轉90°
3:順時針旋轉90°然後水平翻轉

模糊
語法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
注意:luma_r和alpha_r半徑取值范圍是0~min(w,h)/2, chroma_r半徑的取值范圍是0~min(cw/ch)/2

銳化
語法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的參數是可選的,默認值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩陣,取值范圍3-13,默認值為5
l_msize_y:垂直亮度矩陣,取值范圍3-13,默認值為5
l_amount:亮度強度,取值范圍-2.0-5.0,負數為模糊效果,默認值1.0
c_msize_x:水平色彩矩陣,取值范圍3-13,默認值5
c_msize_y:垂直色彩矩陣,取值范圍3-13,默認值5
c_amount:色彩強度,取值范圍-2.0-5.0,負數為模糊效果,默認值0.0
eg:
使用默認值,亮度矩陣為5x5和亮度值為1.0
ffmpeg -i input.mp4 -vf unsharp output.mp4
高斯模糊效果(比較強的模糊):
ffplay -i input.mp4 -vf unsharp=13:13:-2

語法:overlay[=x[:y]
所有的參數都是可選,默認值都是0

Logo在左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4

刪除logo
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的坐標
w:h logo的寬和高
t: 矩形邊緣的厚度默認值4
show:若設置為1有一個綠色的矩形,默認值0.
ffplay -i ji.mp4 -vf delogo=50:51:60:60:100:0

語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的參數值
x:離左上角的橫坐標
y: 離左上角的縱坐標
fontcolor:字體顏色
fontsize:字體大小
text:文本內容
textfile:文本文件
t:時間戳,單位秒
n:幀數開始位置為0
draw/enable:控制文件顯示,若值為0不顯示,1顯示,可以使用函數

1、在左上角添加Welcome文字
ffplay -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、設置字體顏色和大小
ffplay -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

動態文本
用 t (時間秒)變數實現動態文本
1、頂部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t 50:fontcolor=darkorange:fontsize=30"
2、底部水平滾動
ffplay -i ji.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t
50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直從下往上滾動
ffplay ji.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30「
在右上角顯示當前時間 localtime
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}'「

每隔3秒顯示一次當前時間
ffplay ji.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime:%H:%M:%S}':enable=lt(mod(t,3),1)"

FFmpeg支持絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
截取一張圖片使用 –ss(seek from start)參數.
ffmpeg -ss 01:23:45 -i ji.mp4 image.jpg
從視頻中生成GIF圖片
ffmpeg -i ji.mp4 -t 10 -pix_fmt rgb24 ji.gif
轉換視頻為圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
圖片轉換為視頻
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4

和視頻一樣,圖片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

和視頻一樣圖片同樣能翻轉,旋轉和覆蓋
翻轉
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋轉
ffmpeg -i -vf transpose=1 image_rotated.png
覆蓋
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png

屏幕錄像
顯示設備名稱
ffmpeg -list_devices 1 -f dshow -i mmy
調用攝像頭
ffplay -f dshow -i video="Integrated Camera"
保存為文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4

添加字幕subtitles
語法 –vf subtitles=file
ffmpeg -i ji.mp4 -vf subtitles=rgb.srt output.mp4

視頻顫抖、色彩平衡
視頻顫抖
ffplay –i ji.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2) sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2) sin(n/7)

色彩平衡
ffplay -i ji.mp4 -vf curves=vintage
色彩變幻
ffplay -i ji.mp4 -vf hue="H=2 PI t: s=sin(2 PI t)+1「
彩色轉換黑白
ffplay -i ji.mp4 -vf lutyuv="u=128:v=128"

設置音頻視頻播放速度
3倍視頻播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/3
¾速度播放視頻
ffplay -i ji.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音頻
ffplay -i speech.mp3 -af atempo=2

截圖
每隔一秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一張圖。
多張截圖合並到一個文件里(2x3) 每隔一千幀(秒數=1000/fps25)即40s截一張圖
ffmpeg -i ji.mp4 -frames 3 -vf "select=not(mod(n,1000)),scale=320:240,tile=2x3" out.png

本篇文章主要記錄ffmpeg的一些基礎指令操作,該資料的來源是源於網上的一個ppt文檔,感謝文檔的總結。

『叄』 ffmpeg播放視頻的部分方法解析

ffmpeg播放視頻的部分方法解析

The number of *pixels* that a line in the buffer takes in memory. This may be >= width.
圖像的一行在內存里占的空間,做了對齊,可能比寬度大一些。比如寬高為 544 * 960 的視頻下stride可能為576,所以在向 m_NativeWindowBuffer.bits 中拷貝圖像數據的時候需要考慮此步長數據,每次向 m_NativeWindowBuffer.bits 中拷貝544個bytes,需要佔據576個bytes空間。

也就是:

x:如果是RGBA_8888格式,x=4,如果是RGB_565,則x=2.

linesize存儲的是圖像的尺寸,不是一個固定值,是根據格式來的。
一個寬高為 544 * 960 的視頻,在常見的格式下:

在使用的時候一般是這樣:

根據需要的顯示類型和視頻的寬高計算出需要的緩沖區 bufferSize 的大小,申請一塊 bufferSize 大小的內存,然後使用 av_image_fill_arrays ,然後傳入了我們拿來接收配置的的 m_RGBAFrame 和新申請的 m_FrameBuffer
這個函數的作用其實是將 AVFrame 跟 m_FrameBuffer 綁定在了一起,然後設置了對應的data和linesize數據。
我們可以查看這個函數的源碼:

發現其實把ptr也就是src賦值給了data[0],其實 m_FrameBuffer 傳進來之後就打醬油坐了個賦值。

AVFrame中data與linesize關系

『肆』 FFmpeg工具

ffmpeg在做音視頻編解碼時非常方便,所以很多場景下轉碼使用的是ffmpeg,通過ffmpeg –-help可以看到ffmpeg常見的命令大概分為六部分:

命令格式如下:

下面羅列一些ffmpeg常用的信息查詢命令:
1、查詢版本信息

2、ffmpeg查詢是否支持對應的視頻文件格式
使用ffmpeg轉嗎,有時候可能會遇到無法解析的視頻文件或者無法生成視頻文件,報錯提示不支持生成對應的視頻文件,這時候就需要查看當前使用的ffmpeg是否支持對應的視頻文件格式,需要使用ffmpeg -formats參數來查看:

根據上面輸出的信息可以看到,輸出的內容分為3個部分,具體如下。

輸出信息中包含了三部分內容,具體如下。

輸出信息的內容分為四列,具體如下。

從輸出的幫助信息中可以看到,FLV的muxer的信息包含兩大部分,具體如下。

從輸出的幫助信息可以看到,FLV的demuxer的信息包含兩大部分:

從幫助信息可以看到,H.264(AVC)的編碼參數包含兩大部分,具體如下。

從幫助信息可以看到,H.264(AVC)的解碼參數查看包括兩大部分,具體如下:

從幫助信息可以看到,colorkey濾鏡查看信息包含兩大部分,具體如下。

ffmpeg的封裝轉換(轉封裝)功能包含在AVFormat模塊中,通過libavformat庫進行Mux和Demux操作;多媒體文件的格式有很多種,這些格式中的很多參數在Mux與Demux的操作參數中是公用的,下面來詳細介紹一下這些公用的參數。
通過查看ffmpeg --help full信息,找到AVFormatContext參數部分,該參數下的所有參數均為封裝轉換可使用的參數。下表列出了ffmpeg AVFormatContext的主要參數及說明。

這些都是通用的封裝、解封裝操作時使用的參數,後續章節中介紹轉封裝操作、解封裝操作、封裝操作時,上述參數可以與對應的命令行參數搭配使用。

ffmpeg編解碼部分的功能主要是通過模塊AVCodec來完成的,通過libavcodec庫進行Encode與Decode操作。多媒體編碼格式的種類有很多,但是還是有很多通用的基本操作參數設置,下面來詳細介紹這些公用的參數。
通過命令ffmpeg --help full可以看到AVCodecContext參數列表信息。該選項下面的所有參數均為編解碼可以使用的參數。

ffmpeg還有一些更細化的參數,本節中並未詳細提及,可以根據本節中提到的查看方法查看ffmpeg的幫助文件以查看更多的內容,本節中介紹的是重點及常用的通用參數,後續章節中介紹編碼操作時,上述參數可以配合對應的例子使用。

ffmpeg工具的主要用途為編碼、解碼、轉碼以及媒體格式轉換,ffmpeg常用於進行轉碼操作,使用ffmpeg轉碼的主要原理如圖

通過之前介紹的參數,可以設置轉碼的相關參數,如果轉碼操作頻涉及封裝的改變,則可以通過設置AVCodec與AVFormat的操作參數進行封裝與編碼的改變,下面示例:

從輸出信息中可以看到,以上輸出的參數中使用了前面介紹過的參數,具體如下。

在 FFmpeg套件中,除了ffmpeg作為多媒體處理工具之外,還有ffprobe多媒體信息查看工具,ffprobe主要用來查看多媒體文件的信息,下面就來看一下ffprobe中常見的基本命令。
usage: ffprobe [OPTIONS] [INPUT_FILE] the other
ffprobe常用的參數比較多,可以通過ffprobe --help來查看詳細的幫助信息。
這些輸出的幫助信息既是ffprobe常用的操作參數,也是ffrpobe的基礎參數。例如查看log,查看每一個音頻數據包信息或者視頻數據包信息,查看節目信息,查看流信息,查看每一個流有多少幀以及每一個流有多少個音視頻包,查看視頻像素點的格式等。下面就來根據以上的輸出參數重點列舉幾個例子。
1)使用下面的命令,查看多媒體數據包信息:

通過show_packets查看的多媒體數據包信息使用PACKET標簽括起來,其中包含的信息主要如下:

2)除了以上欄位和信息之外,還可以通過如下的組合參數來查看包中的具體數據:

和上面的比起來多了一個data欄位,具體如下
[PACKET]
codec_type=video
stream_index=0
pts=379904
pts_time=24.733333
dts=379904
dts_time=24.733333
ration=512
ration_time=0.033333
size=2010
pos=3272564
flags=__
data=
00000000: 0000 07d6 419a cc21 3ffa 5800 0031 9893 ....A..!?.X..1..
00000010: d7e7 0641 039b 27c5 e0f8 5175 1abc 0e4f ...A..'...Qu...O
00000020: d710 f401 3224 0093 a2e5 c07e 9c30 0003 ....2$.....~.0..

略過一大段數據
00000770: 1ebe 840a 5ac2 4f9a 614c 5697 8eab fef8 ....Z.O.aLV.....
00000780: 0b59 9647 cc6d 8a4b f8c0 89e8 798e f569 .Y.G.m.K....y..I
00000790: 2aca ec22 e1f5 d2e5 31b1 010e 7725 e127 *.."....1...w%.'
000007a0: c5f4 7051 f07b 8449 649f 3fab 6a3d 3913 ..pQ.{.Id.?.j=9.
000007b0: d9e4 bdd6 0f22 fa77 2b32 35f5 f4f7 5393 .....".w+25...S.
000007c0: 1c9d fe72 1550 ba41 c774 5031 96d5 aef5 ...r.P.A.tP1....
000007d0: f1b9 77a7 ad54 0800 010f ..w..T....
[/PACKET]
從輸出的內容中可以看到多媒體包中包含的數據,那麼我們可以根據上述輸出內容中的pos,也就是文件偏移位置來查看,pos的值為3272564,將其轉換為十六進制位置為0x31EF74,這就是這個包在flv文件中的偏移量,可以使用Linux下的xxd 1.mp4命令進行查看:
0031ef70: 0000 000e 0000 07d6 419a cc21 3ffa 5800 ........A..!?.X.
0031ef80: 0031 9893 d7e7 0641 039b 27c5 e0f8 5175 .1.....A..'...Qu
0031ef90: 1abc 0e4f d710 f401 3224 0093 a2e5 c07e
0031efa0: 9c30 0003 389a 06b7 f211 fb06 362c 95a9 .0..8.......6,..
0031efb0: 0020 8f32 e280 6773 015e 78d2 87a3 e114 . .2..gs.^x.....
0031efc0: f3b3 9d2d ffd7 b202 2233 923f 3d42 bc7f ...-...."3.?=B..
可以看到從0x31EF74開始的數據和上面一致:0000 07d6 419a cc21 3ffa 5800。
通過ffprobe讀取packets來進行對應的數據分析,使用show_packets與show_data配合可以進行更加精確的分析。
3)除了packets與data之外,ffprobe還可以分析多媒體的封裝格式,其使用FORMAT標簽括起來顯示:

[FORMAT]
filename=1.mp4
nb_streams=2
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
ration=25.704000
size=3307949
bit_rate=1029551
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:encoder=Lavf55.33.100
[/FORMAT]
下面是對輸出信息關鍵欄位的說明:

4)使用下面的命令可以查看視頻文件的幀信息,輸出的幀信息將使用FRAME標簽括起來:

[FRAME]
media_type=video
stream_index=0
key_frame=1
pts=0
pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=0
best_effort_timestamp_time=0.000000
pkt_ration=512
pkt_ration_time=0.033333
pkt_pos=22995
pkt_size=1888
width=720
height=1280
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=tv
color_space=bt709
color_primaries=bt709
color_transfer=bt709
chroma_location=left
[/FRAME]
通過-show-frames參數可以查看每一幀的信息,下面就來介紹一下其中重要的信息,

在Windows下常用的Elecard StreamEye工具中打開查看MP4時,會很直觀地看到幀類型顯示,用ffprobe的pict_type同樣可以看到視頻的幀是I幀,P幀或者B幀;每一幀的大小同樣也可以通過ffprobe的pkt_size查看到。
5)通過-show_streams參數可以查看到多媒體文件中的流信息,流的信息將使用STREAM標簽括起來:

[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_tag_string=avc1
codec_tag=0x31637661
width=720
height=1280
coded_width=720
coded_height=1280
closed_captions=0
film_grain=0
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=42
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=progressive
refs=1
is_avc=true
nal_length_size=4
id=0x1
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/15360
start_pts=0
start_time=0.000000
ration_ts=388608
ration=25.300000
bit_rate=964695
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=759
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=39
DISPOSITION:default=1
DISPOSITION:b=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]
如以上輸出內容所示,從中可以看到流的信息,具體屬性及說明如下表

fprobe 使用前面的參數可以獲得key-value格式的顯示方式,但是閱讀起來因為習慣不同,可能有的人會認為方便,有的人認為不方便;如果要進行格式化的顯示,這樣就需要用到ffprobe -print_format 或者 ffprobe -of 參數來進行相應的格式輸出,而-print_format 支持多種格式輸出,包括XML,INI,JSON,CSV,FLAT等。下面列舉幾種常見的格式輸出的例子

<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from Ƈ.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf55.33.100
Duration: 00:00:25.70, start: 0.000000, bitrate: 1029 kb/s
Stream #0:0 0x1 : Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1280, 964 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1 0x2 : Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 72 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
<streams>
<stream index="0" codec_name="h264" codec_long_name="H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10" profile="Main" codec_type="video" codec_tag_string="avc1" codec_tag="0x31637661" width="720" height="1280" coded_width="720" coded_height="1280" closed_captions="0" film_grain="0" has_b_frames="0" pix_fmt="yuv420p" level="42" color_range="tv" color_space="bt709" color_transfer="bt709" color_primaries="bt709" chroma_location="left" field_order="progressive" refs="1" is_avc="true" nal_length_size="4" id="0x1" r_frame_rate="30/1" avg_frame_rate="30/1" time_base="1/15360" start_pts="0" start_time="0.000000" ration_ts="388608" ration="25.300000" bit_rate="964695" bits_per_raw_sample="8" nb_frames="759" extradata_size="39">
<disposition default="1" b="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
<tag key="language" value="und"/>
<tag key="handler_name" value="VideoHandler"/>
<tag key="vendor_id" value="[0][0][0][0]"/>
</stream>
<stream index="1" codec_name="aac" codec_long_name="AAC (Advanced Audio Coding)" profile="LC" codec_type="audio" codec_tag_string="mp4a" codec_tag="0x6134706d" sample_fmt="fltp" sample_rate="44100" channels="2" channel_layout="stereo" bits_per_sample="0" id="0x2" r_frame_rate="0/0" avg_frame_rate="0/0" time_base="1/44100" start_pts="0" start_time="0.000000" ration_ts="1133511" ration="25.703197" bit_rate="72863" nb_frames="1107" extradata_size="2">
<disposition default="1" b="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0" captions="0" descriptions="0" metadata="0" dependent="0" still_image="0"/>
<tag key="language" value="und"/>
<tag key="handler_name" value="SoundHandler"/>
<tag key="vendor_id" value="[0][0][0][0]"/>
</stream>
</streams>
</ffprobe>
從輸出的內容可以看到,輸出的內容格式為XML格式,如果原有的業務本身就可以解析XML格式,那麼就不需要更改解析引擎,直接將輸出內容輸出為XML格式即可,解析引擎解析Packet信息是會更方便。
輸出INI格式:

輸出FLAT格式:

輸出JSON格式:

輸出CSV格式:

通過各種格式的輸出,可以使用對應的繪圖方式繪制出可視化圖形。
CSV格式輸出後可以使用Excel打開表格形式

可以在命令行中自行輸出,輸出的frame信息全部為視頻相關的信息。
使用ffprobe還可以查看很多信息,我們可以通過本節介紹的help方法查看更多更詳細的信息

在FFmpeg中通常使用ffplay作為播放器,其實ffplay同樣也可作為很多音視頻的圖形化分析工具,通過ffplay可以看到視頻圖像的運動估計方向、音頻數據的波形等,以下將介紹更多參數並舉例說明。
1)ffplay常用參數
ffplay不僅僅是播放器,同時也是測試ffmpeg的codec引擎、format引擎,以及filter引擎的工具,並且還可以進行可視化的媒體參數分析。其可以通過ffplay --help進行查看:

Simple media player
usage: ffplay [options] input_file

Main options:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-dispositions show available stream dispositions
-colors show available color names
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-sources device list sources of the input device
-sinks device list sinks of the output device
-x width force displayed width
-y height force displayed height
-s size set frame size (WxH or abbreviation)
-fs force full screen
-an disable audio
-vn disable video
-sn disable subtitling
-ss pos seek to a given position in seconds
-t ration play "ration" seconds of audio/video
-bytes val seek by bytes 0=off 1=on -1=auto
-seek_interval seconds set seek interval for left/right keys, in seconds
-nodisp disable graphical display
-noborder borderless window
-alwaysontop window always on top
-volume volume set startup volume 0=min 100=max
-f fmt force format
-window_title window title set window title
-af filter_graph set audio filters
-showmode mode select show mode (0 = video, 1 = waves, 2 = RDFT)
-i input_file read specified file
-codec decoder_name force decoder
-autorotate automatically rotate video
這只是Main options裡面的部分,另外還有Advanced options,AVCodecContext AVOptions等等很多內容。就上述幫助信息的輸出所示,有些是前面已經介紹過的參數,這里就不再一一贅述,一些未介紹的參數說明見下表

常見參數可以手動進行嘗試,下面列舉幾個示例。
*如果希望從視頻的第5秒開始播放,播放5秒鍾的文件,則可以使用如下命令

*如果希望視頻播放時播放器的窗口顯示標題為自定義標題,則可以使用如下命令

*如果希望使用ffplay打開網路直播流,則可以使用如下命令:

可以看出ffplay可以支持的協議有多種,ramp,rtmp,http等等都支持。
顯示如下窗口內容

下面將這些參數與前面介紹過的一些參數進行組合,舉幾個例子。
1⃣️從10秒播放一個視頻,播放時長為5秒,播放完畢後自動退出ffplay,播放器的窗口標題為「Hello World」,為了確認播放時長正確,可以通過系統命令time查看命令運行時長:

可以看到輸出結果如下:
ffplay -window_title "Hello World" -ss 10 -t 5 -autoexit 1.mp4 0.94s user 0.52s system 22% cpu 6.502 total
2⃣️如果強制使用H.264解碼器解碼MPEG4的視頻,將會報錯

我們這個視頻是h264編碼,所以可以正常播放。
查看視頻編碼可以使用

查看ffmpeg支持的解碼格式

下面這個方式解碼就會報錯

前面舉過的例子中,我們看到的比較多的是單節目的流,多節目的流,常用於廣電行業的視頻。當視頻中出現多個Program時,播放Program與常規的播放方式有所不同,需要指定對應的流,可以通過vst,ast,sst參數來指定,例如希望播放Program 13中的音視頻流,視頻編號為4,音頻編號為5,則可以通過如下命令進行制定:

有條件的朋友可以自己找視頻來查看。
3⃣️如果使用ffplay播放視頻時希望載入字幕文件,則可以通過載入ASS或者SRT字幕文件來解決,下面列舉一個載入SRT字幕的例子,首先編輯SRT字幕文件,內容如下:
1
00:00:01.000 --> 00:00:05.000
這是我 我是誰
2
00:00:05.001 --> 00:00:10.000
我愛中國
3
00:00:10.001 --> 00:00:15.000
為人民服務
4
00:00:18.001 --> 00:00:20.000
疫情早日結束,國泰民安!

然後通過filter將字幕文件載入到播放數據中,使用命令如下:

播放的效果如下:

可以看出,視頻中已經將SRT格式的文字字幕加入到視頻中並展現了出來。
2)ffplay的數據可視化分析應用
使用ffplay除了可以播放視頻流媒體文件之外,還可以作為可視化的視頻流媒體分析工具,例如播放音頻文件時,如果不確定文件的聲音是否正常,則可以直接使用ffplay播放音頻文件,播放的時候其將會把解碼後的音頻數據以音頻波形的形式顯示出來,

命令行執行後的效果如下:

從圖中可以看到,音頻播放時的波形可以通過振幅顯示出來,可以用來查看音頻的播放情況。
當播放視頻時想要體驗解碼器是如何解碼每個宏塊的,可以使用如下命令

新版FFmpeg此方法已經不再支持啦,可參考
https://trac.ffmpeg.org/wiki/Debug/MacroblocksAndMotionVectors
我們可以使用ffmpeg或者ffplay來分析視頻文件中的運動向量。ffmpeg的早期版本(2017年10月之前)也允許分析宏塊,但此選項已被刪除。
'codecview'過濾器可用於將運動向量顯示為每個宏塊的小箭頭。它採用一個叫mv的選項,它指定了要繪制的運動向量的類型:

你可以使用如下的命令

第一條命令是直接用ffplay顯示視頻。
第二條命令是把生成的帶有運動向量的視頻保存到output.mp4中。
顯示效果如下:

『伍』 編輯碼工具ffmpeg怎麼使用

FFmpeg在Windows系統下的編譯過程,分四步:如下:1. 配置編譯環境2. 下載FFMPEG的代碼3. 編譯,獲取FFMPEG庫(頭文件,lib,和DLL)4. 在VC下配置,測試1. 配置編譯環境1)安裝MSys下載文件:bash-3.1-MSYS-1.0.11-snapshot.tar.bz2msysCORE-1.0.11-20080826.tar.gz解壓msysCORE-1.0.11-20080826.tar.gz,比如解壓到X:\msys(以下內容都使用該路徑描述,X為你安裝的盤符)。解壓bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,產生一個名為bash-3.1的目錄,在該目錄下有一個子目錄名為bin,其他的目錄不需要關心。復制bin目錄中的所有文件到D:\msys\bin,提示是否要覆蓋sh.exe的時候,選擇是。到「D:\msys\postinstall」目錄下執行pi.bat,在出現的提示中輸入n回車後(這個不搞錯了),按任意鍵退出即可。2)安裝MinGW下載文件:binutils-2.20-1-mingw32-bin.tar.gz(binutils-2.19.1-mingw32-bin.tar.gz)gcc-core-3.4.5-20060117-3.tar.gz gcc-g++-3.4.5-20060117-3.tar.gzw32api-3.13-mingw32-dev.tar.gz mingwrt-3.16-mingw32-dev.tar.gz(mingwrt-3.15.2-mingw32-dev.tar.gz)mingwrt-3.16-mingw32-dll.tar.gz(mingwrt-3.15.2-mingw32-dll.tar.gz)把它們全部解壓到X:\msys\mingw。3)修改「msys.bat」用文本編輯器打開D:\msys\msys.bat,由於打算用MSVC++編譯程序,所以需要有.lib文件才能鏈接到FFmpeg的庫,這些.lib文件可以使用微軟的工具鏈中lib命令產生。為此,機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,比如我的在「D:\program files\Microsoft Visual Studio 8\VC\bin」,於是就添加:call "D:\program files\Microsoft Visual Studio 8\VC\bin"

『陸』 FFmpeg怎麼批量給視頻加水印

批量給視頻加水印的方法,支持文字水印和圖片水印的批量添加:

步驟1,下載軟體工具後安裝打開,選擇左邊的【視頻水印】功能後,再點擊左上角的【添加文件】按鈕,將視頻導入到軟體中,可以同時添加多個視頻批量加水印。

『柒』 如何使用ffmpeg

基本選項: -formats 輸出所有可用格式 -f fmt 指定格式(音頻或視頻格式) -i filename 指定輸入文件名,在linux下當然也能指定:0.0(屏幕錄制)或攝像頭 -y 覆蓋已有文件 -t ration 記錄時長為t -fs limit_size 設置文件大小上限 -ss time_off 從指定的時間(s)開始, [-]hh:mm:ss[.xxx]的格式也支持 -itsoffset time_off 設置時間偏移(s),該選項影響所有後面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味著相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持 -title string 標題 -timestamp time 時間戳 -author string 作者 -right string 版權信息 -comment string 評論 -album string album名 -v verbose 與log相關的 -target type 設置目標文件類型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...) -dframes number 設置要記錄的幀數 視頻選項: -b 指定比特率(bits/s),似乎ffmpeg是自動VBR的,指定了就大概是平均比特率 -vb 指定視頻比特率(bits/s) -vframes number 設置轉換多少楨(frame)的視頻 -r rate 楨速率(fps) -s size 解析度 -aspect aspect 設置視頻長寬比(4:3, 16:9 or 1.3333, 1.7777) -croptop size 設置頂部切除尺寸(in pixels) -cropbottom size 設置底部切除尺寸(in pixels) -cropleft size 設置左切除尺寸 (in pixels) -cropright size 設置右切除尺寸 (in pixels) -padtop size 設置頂部補齊尺寸(in pixels) -padbottom size 底補齊(in pixels) -padleft size 左補齊(in pixels) -padright size 右補齊(in pixels) -padcolor color 補齊帶顏色(000000-FFFFFF) -vn 取消視頻 -vcodec codec 強制使用codec編解碼方式('' to stream) -sameq 使用同樣視頻質量作為源(VBR) -pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率 -passlogfile file 選擇兩遍的紀錄文件名為file -newvideo 在現在的視頻流後面加入新的視頻流 高級視頻選項 -pix_fmt format set pixel format, 'list' as argument shows all the pixel formats supported -intra 僅適用幀內編碼 -qscale q 以<數值>質量為基礎的VBR,取值0.01-255,約小質量越好 -loop_input 設置輸入流的循環數(目前只對圖像有效) -loop_output 設置輸出視頻的循環數,比如輸出gif時設為0表示無限循環 -g int 設置圖像組大小 -cutoff int 設置截止頻率 -qmin int 設定最小質量 -qmax int 設定最大質量 -qdiff int 量化標度間最大偏差 (VBR) -bf int 使用frames B 幀,支持mpeg1,mpeg2,mpeg4 音頻選項: -ab 設置比特率(單位:bit/s,也許老版是kb/s) -aframes number 設置轉換多少楨(frame)的音頻 -aq quality 設置音頻質量 (指定編碼) -ar rate 設置音頻采樣率 (單位:Hz) -ac channels 設置聲道數 -an 取消音頻 -acodec codec 指定音頻編碼('' to stream) -vol volume 設置錄制音量大小(默認為256) -newaudio 在現在的音頻流後面加入新的音頻流 字幕選項: -sn 取消字幕 -scodec codec 設置字幕編碼('' to stream) -newsubtitle 在當前字幕後新增 -slang code 設置字幕所用的ISO 639編碼(3個字母) Audio/Video 抓取選項: -vc channel 設置視頻捕獲通道(只對DV1394) -tvstd standard 設置電視標准 NTSC PAL(SECAM)

『捌』 使用ffmpeg將圖片拼接為視頻

本文介紹下如何使用ffmpeg將大量圖片拼接成一個視頻,並介紹其中部分參數的含義。

使用ffmpeg將圖片拼接成視頻前,需要將圖片文件名做下預處理,文件名中必須有數字將其次序標記出來,這里我直接使用數字將圖片重命名了,如下:

我們可以調整其參數,生成更符合我們需求的視頻,下面介紹下幾個常見的參數。

不指定幀率的話,ffmpeg會使用默認的25幀,也就是1秒鍾拼接25張圖片,我們可以通過調整幀率的大小來控制最終生成視頻的時長。

如上命令每秒會拼接10張圖片,250張圖片最終會生成25秒的視頻。
這里需要注意 -r 10 參數的位置,在 -i %d.jpeg 前面和在後面的效果是不一樣的。放在-i後面只會改變輸出的視頻幀率,而輸入的還是默認值25 ,比如 ffmpeg -f image2 -i %d.jpeg -r 10 output1.mp4 ,250張圖片依舊只會生成10s的視頻,但視頻的播放征率會減小到10。

-b:v bitrate of video。如果原始圖片比較大,默認參數生成的視頻大小會比較大。比如上文中我使用的圖片都是2k的高清圖,最終生成的10s視頻就有35MB,碼率有近30Mb/s(碼率是只1s播過的數據量,注意這里單位是小b)。

這里額外提醒下,改變碼率會影響到視頻清晰度,但並不意味著高碼率的視頻一定比低碼率的視頻清晰度更高,這還取決於視頻編碼格式,比如h265編碼可以用更小的碼率生成h264同等的視頻質量,像av1、v8、v9等編碼也優於h264。

-crf Constant Rate Factor,用以平衡視頻質量和文件大小的參數,FFMPEG里取值范圍為0-51,取值越高內容損失越多,視頻質量更差。 ffmpeg的默認值是23,建議的取值范圍是17-28。

-c:v codec of video。目前ffmpeg針對於mp4默認使用的是h264,你可以使用 -c:v libx265 生成同等質量,但文件更小的h265視頻。

output4.mp4相比於上文中生成的output.mp4,視頻文件大小減少了60%,但視頻質量不變。你也可以使用 -c:v libvpx -c:v libvpx-vp9 分別生成v8和v9編碼的webm文件。

-vf scale: Video Filter Scale

上面的命令會將視頻直接調整為640x480的解析度,如果原始圖片不是4:3 肯定是會對原始圖像做拉伸的。可以使用下面的命令等比例縮放

以上就是幾個常用的參數,這幾個參數不僅限於圖片轉視頻,視頻轉視頻時也可以使用。

『玖』 FFmpeg功能命令匯總

前言

如此強大的FFmpeg,能夠實現視頻採集、視頻格式轉化、視頻截圖、視頻添加水印、視頻切片、視頻錄制、視頻推流、更改音視頻參數功能等。通過終端命令如何實現這些功能,Richy在本文做一記錄,以備之後查閱。

注意:下面一一列舉的命令,未歸類整理,命令參數供參考。

如果參數有誤,大家可對照文章- FFmpeg參數命令 ,進行修改。

第一組

1.分離視頻音頻流

ffmpeg -i input_file -vcodec -an output_file_video//分離視頻流ffmpeg -i input_file -acodec -vn output_file_audio//分離音頻流

2.視頻解復用

ffmpeg –i test.mp4 –vcodec –an –f m4v test.264

ffmpeg –i test.avi –vcodec –an –f m4v test.264

3.視頻轉碼

ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264

//轉碼為碼流原始文件

ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //轉碼為碼流原始文件

ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //轉碼為封裝文件

說明: -bf B幀數目控制,-g 關鍵幀間隔控制,-s 解析度控制

4.視頻封裝

ffmpeg –i video_file –i audio_file –vcodec –acodec output_file

5.視頻剪切

ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取圖片

ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec -acodec output.avi //剪切視頻//-r 提取圖像的頻率,-ss 開始時間,-t 持續時間

6.視頻錄制

ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec out.avi

7、利用ffmpeg視頻切片

主要把視頻源切成若干個.ts格式的視頻片段然後生成一個.m3u8的切片文件索引提供給html5的video做hls直播源

命令如下:

ffmpeg -i 視頻源地址 -strict -2 -c:v libx264 -c:a aac -f hls m3u8文件輸出地址

8、ffmpeg縮放視頻

假設原始視頻尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以縮小到 480p:

命令如下:

ffmpeg -i 視頻源地址 -vf scale=853:480 -acodec aac -vcodec h264 視頻輸出地址(如:out.mp4)

各個參數的含義:-i a.mov 指定待處理視頻的文件名-vf scale=853:480 vf 參數用於指定視頻濾鏡,其中 scale 表示縮放,後面的數字表示縮放至 853×480 px,其中的 853px 是計算而得,因為原始視頻的寬高比為 16:9,所以為了讓目標視頻的高度為 480px,則寬度 = 480 x 9 / 16 = 853-acodec aac 指定音頻使用 aac 編碼。註:因為 ffmpeg 的內置 aac 編碼目前(寫這篇文章時)還是試驗階段,故會提示添加參數 「-strict -2」 才能繼續,盡管添加即可。又或者使用外部的 libfaac(需要重新編譯 ffmpeg)。-vcodec h264 指定視頻使用 h264 編碼。註:目前手機一般視頻拍攝的格式(封裝格式、文件格式)為 mov 或者 mp4,這兩者的音頻編碼都是 aac,視頻都是 h264。out.mp4 指定輸出文件名上面的參數 scale=853:480 當中的寬度和高度實際應用場景中通常只需指定一個,比如指定高度為 480 或者 720,至於寬度則可以傳入 「-1」 表示由原始視頻的寬高比自動計算而得。即參數可以寫為:scale=-1:480,當然也可以 scale=480:-1

9、ffmpeg裁剪

有時可能只需要視頻的正中一塊,而兩頭的內容不需要,這時可以對視頻進行裁剪(crop),比如有一個豎向的視頻 1080 x 1920,如果指向保留中間 1080×1080 部分命令如下:ffmpeg -i 視頻源地址 -strict -2 -vf crop=1080:1080:0:420 視頻輸出地址(如:out.mp4)

其中的 crop=1080:1080:0:420 才裁剪參數,具體含義是 crop=width:height:x:y,其中 width 和 height 表示裁剪後的尺寸,x:y 表示裁剪區域的左上角坐標。比如當前這個示例,我們只需要保留豎向視頻的中間部分,所以 x 不用偏移,故傳入0,而 y 則需要向下偏移:(1920 – 1080) / 2 = 420

10. 轉視頻格式

ffmpeng -i source.mp4 -c:v libx264 -crf 24 destination.flv

其中 -crf 很重要,是控制轉碼後視頻的質量,質量越高,文件也就越大。

此值的范圍是 0 到 51:0 表示高清無損;23 是默認值(如果沒有指定此參數);51 雖然文件最小,但效果是最差的。

值越小,質量越高,但文件也越大,建議的值范圍是 18 到 28。而值 18 是視覺上看起來無損或接近無損的,當然不代表是數據(技術上)的轉碼無損。

第二組

1.ffmpeg 把文件當做直播推送至伺服器 (RTMP + FLV)

ffmpeg - re -i demo.mp4 -c - f flv rtmp://w.gslb.letv/live/streamid

2.將直播的媒體保存到本地

ffmpeg -i rtmp://r.glsb.letv/live/streamid -c streamfile.flv

3.將一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另一個直播伺服器

ffmpeg -i rtmp://r.glsb.letv/live/streamidA -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://w.glsb.letv/live/streamb

4.提取視頻中的音頻,並保存為mp3 然後輸出

ffmpeg -i input.avi -b:a 128k output.mp3

第三組

1.獲取視頻的信息

ffmpeg -i video.avi

2.將圖片序列合成視頻

ffmpeg -f image2 -i image%d.jpg video.mpg

上面的命令會把當前目錄下的圖片(名字如:image1.jpg. image2.jpg. 等...)合並成video.mpg

3.將視頻分解成圖片序列

ffmpeg -i video.mpg image%d.jpg

上面的命令會生成image1.jpg. image2.jpg. ...

支持的圖片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI

4.為視頻重新編碼以適合在iPod/iPhone上播放

ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4

5.為視頻重新編碼以適合在PSP上播放

ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4

6.從視頻抽出聲音.並存為Mp3

ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3

7.將wav文件轉成Mp3

ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3

8.將.avi視頻轉成.mpg

ffmpeg -i video_origine.avi video_finale.mpg

9.將.mpg轉成.avi

ffmpeg -i video_origine.mpg video_finale.avi

10.將.avi轉成gif動畫(未壓縮)

ffmpeg -i video_origine.avi gif_anime.gif

11.合成視頻和音頻

ffmpeg -i son.wav -i video_origine.avi video_finale.mpg

12.將.avi轉成.flv

ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv

13.將.avi轉成dv

ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv

或者:

ffmpeg -i video_origine.avi -target pal-dv video_finale.dv

14.將.avi壓縮成divx

ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi

15.將Ogg Theora壓縮成Mpeg dvd

ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg

16.將.avi壓縮成SVCD mpeg2

NTSC格式:

ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg

PAL格式:

ffmpeg -i video_origine.avi -target pal-dvcd video_finale.mpg

17.將.avi壓縮成VCD mpeg2

NTSC格式:

ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg

PAL格式:

ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg

18.多通道編碼

ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2

19.從flv提取mp3

ffmpeg -i source.flv -ab 128k dest.mp3

第四組

1、將文件當做直播送至live

ffmpeg -re -i localFile.mp4 -c -f flv rtmp://server/live/streamName

2、將直播媒體保存至本地文件

ffmpeg -i rtmp://server/live/streamName -c mp.flv

3、將其中一個直播流,視頻改用h264壓縮,音頻不變,送至另外一個直播服務流

ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream

4、將其中一個直播流,視頻改用h264壓縮,音頻改用faac壓縮,送至另外一個直播服務流

ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream

5、將其中一個直播流,視頻不變,音頻改用faac壓縮,送至另外一個直播服務流

ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec -f flv rtmp://server/live/h264_AAC_Stream

6、將一個高清流,復制為幾個不同視頻清晰度的流重新發布,其中音頻不變

ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k

7、功能一樣,只是採用-x264opts選項

ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k

8、將當前攝像頭及音頻通過DSSHOW採集,視頻h264、音頻faac壓縮後發布

ffmpeg -r 25 -f dshow -s 640×480 -i video=」video source name」:audio=」audio source name」 -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name

9、將一個JPG圖片經過h264壓縮循環輸出為mp4視頻

ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4

10、將普通流視頻改用h264壓縮,音頻不變,送至高清流服務(新版本FMS live=1)

ffmpeg -i rtmp://server/live/originalStream -c:a -c:v libx264 -vpre slow -f flv 「rtmp://server/live/h264Stream live=1〃

文/騷之哈塞給(作者)

『拾』 ffmpeg 命令大全

前言
FFMPEG是特別強大的專門用於處理音視頻的開源庫。你既可以使用它的API對音視頻進行處理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,來編輯你的音視頻文件。
本文將簡要介紹一下 FFMPEG 庫的基本目錄結構及其功能,然後詳細介紹一下我們在日常工作中,如何使用 ffmpeg 提供的工具來處理音視頻文件。

在講解 FFMPEG 命令之前,我們先要介紹一些音視頻格式的基要概念。

我們按使用目的可以將 FFMPEG 命令分成以下幾類:

除了 FFMPEG 的基本信息查詢命令外,其它命令都按下圖所示的流程處理音視頻

先是解復用獲取到編碼的數據包,然後將編碼的數據包傳送給解碼器(除非為數據流選擇了流拷貝,請參閱進一步描述)。 解碼器產生未壓縮的幀(原始視頻/ PCM音頻/ ...),可以通過濾波進一步處理(見下一節)。 在過濾之後,幀被傳遞到編碼器,編碼器並輸出編碼的數據包。 最後,這些傳遞給復用器,將編碼的數據包寫入輸出文件。

默認情況下,ffmpeg只包含輸入文件中每種類型(視頻,音頻,字幕)的一個流,並將其添加到每個輸出文件中。 它根據以下標准挑選每一個的「最佳」:對於視頻,它是具有最高解析度的流,對於音頻,它是具有最多channel的流,對於字幕,是第一個字幕流。 在相同類型的幾個流相等的情況下,選擇具有最低索引的流。

您可以通過使用-vn / -an / -sn / -dn選項來禁用某些默認設置。 要進行全面的手動控制,請使用-map選項,該選項禁用剛描述的默認設置。

FFMPEG 可以使用下面的參數進行基本信息查詢。例如,想查詢一下現在使用的 FFMPEG 都支持哪些 filter,就可以用 ffmpeg -filters 來查詢。詳細參數說明如下:

查詢編譯器libfdk_aac的信息

FFMPEG 處理音視頻時使用的命令格式與參數

ffmpeg 通過 -i 選項讀取輸任意數量的輸入「文件」(可以是常規文件,管道,網路流,抓取設備等,並寫入任意數量的輸出「文件」。

原則上,每個輸入/輸出「文件」都可以包含任意數量的不同類型的視頻流(視頻/音頻/字幕/附件/數據)。 流的數量和/或類型是由容器格式來限制。 選擇從哪個輸入進入到哪個輸出將自動完成或使用 -map 選項。

要引用選項中的輸入文件,您必須使用它們的索引(從0開始)。 例如。 第一個輸入文件是0,第二個輸入文件是1,等等。類似地,文件內的流被它們的索引引用。 例如。 2:3是指第三個輸入文件中的第四個流

上面就是 FFMPEG 處理音視頻的常用命令,下面是一些常用參數

首先通過下面的命令查看一下 mac 上都有哪些設備。

注意,桌面的輸入對幀率沒有要求,所以不用限制桌面的幀率。其實限制了也沒用。

由於沒有解碼或編碼,速度非常快,沒有質量損失。 但是,由於許多因素,在某些情況下可能無法正常工作。 應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據

上面的命令表式的是音頻、視頻都直接 ,只是將 mp4 的封裝格式轉成了flv。

在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。 幾個鏈式過濾器形成一個過濾器圖形。 ffmpeg區分兩種類型的過濾器圖形:簡單和復雜。

請注意,某些濾鏡會更改幀屬性,但不會改變幀內容。 例如。 上例中的fps過濾器會改變幀數,但不會觸及幀內容。 另一個例子是setpts過濾器。

復雜的過濾器圖使用-filter_complex選項進行配置。 請注意,此選項是全局性的,因為復雜的過濾器圖形本質上不能與單個流或文件明確關聯。

-lavfi選項等同於-filter_complex。

一個復雜的過濾器圖的一個簡單的例子是覆蓋過濾器,它有兩個視頻輸入和一個視頻輸出,包含一個視頻疊加在另一個上面。 它的音頻對應是amix濾波器

添加文字水印

添加本地時間水印

https://www.jianshu.com/p/e4ad7e1e7ed5

先通過 ffplay 找到要刪除 LOGO 的位置

使用 delogo 濾鏡刪除 LOGO

crop 格式:crop=out_w:out_h:x:y

https://blog.csdn.net/matrix_laboratory/article/details/53158307

首先創建一個 inputs.txt 文件,文件內容如下:

然後執行下面的命令:

播放yuv數據,需要指定解析度

閱讀全文

與ffmpeg使用方法相關的資料

熱點內容
支氣管哮喘有哪些正確的治療方法 瀏覽:863
輕質磚打膨脹螺的正確使用方法 瀏覽:329
統計工作方法制度研究 瀏覽:856
英語教學方法非常多 瀏覽:240
華為手機微信自動下載的圖片在哪裡設置方法 瀏覽:372
腰間盤突出最簡單的方法 瀏覽:107
財務成本有哪些分類方法 瀏覽:641
結婚日子不好結婚後怎麼化解方法 瀏覽:82
最快速減肥有什麼方法 瀏覽:611
圈套的正確操作方法 瀏覽:168
簡單語法使用方法 瀏覽:56
中國新冠疫情的治療方法 瀏覽:485
刮北風的正確方法圖片 瀏覽:880
消防水池浮球安裝方法視頻 瀏覽:443
治療精神分方法 瀏覽:491
女學生頭風的治療方法 瀏覽:677
重心的判定簡單方法 瀏覽:962
尿自動檢查的方法和技巧 瀏覽:683
盆景要怎樣種植方法 瀏覽:757
管道打壓連接方法 瀏覽:902