FFmpeg基本使用(短視頻SDK基本免費功能實現(xiàn))

1.獲取信息

獲取到視頻寬高, 時長,碼率, 幀率, 編碼類型, 顏色格式, 總幀數(shù),是否有B幀,音頻通道數(shù),采樣率,碼率, 音頻編碼器名字.

ffprobe  input.mp4
ffprobe -show_data input.mp4
ffprobe -show_packets input.mp4
ffprobe -show_format input.mp4
ffprobe -show_frames input.mp4
ffprobe -show_streams input.mp4

//打印幀數(shù)
ffprobe -v error -count_frames -select_streams v:0 
        -show_entries stream=nb_read_frames 
        -of default=nokey=1:noprint_wrappers=1 input.mp4

-v error這隱藏了“info”輸出(版本信息等)讲岁,使解析更容易宜岛。
-count_frames計算每個流的幀數(shù)淹朋,并在相應(yīng)的流部分中報告捐名。
-select_streams v:0僅選擇視頻流中第一條流尖啡。
-show_entries stream = nb_read_frames只顯示讀取的幀數(shù)婉宰。
-of default = nokey = 1:noprint_wrappers = 1將輸出格式設(shè)置為默認(rèn)值妙色,不打印每個字段的鍵(nokey = 1),不打印節(jié)頭和頁腳(noprint_wrappers = 1)赵辕。

ffprobe -print_format json -show_streams input.mp4

(1)-print_format json 以json格式打印
(2)-show_streams 打印所有的流信息

2.提取音頻/視頻

從MP4中獲取音頻或視頻軌道, 得到只有音頻或視頻的文件.

ffmpeg -i input.mp4 -an -acodec copy output.mp3
ffmpeg -i input.mp4 -vn -vcodec copy output.mp4

3.合并音頻視頻

把一個視頻和一個音頻文件合并在一起, 給視頻增加上聲音.

ffmpeg -i input.mp4 -i output.mp3 -map 0:v -map 1:a -shortest output.mp4

4.增加背景音樂

給視頻增加一個額外的背景音樂, 可以是mp3, m4a, wav格式, 并可分別調(diào)節(jié)視頻原聲音和背景音樂的音量

ffmpeg -i input.avi -i input.mp3 -filter_complex 
"[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" 
-c:v copy -c:a libvorbis -ac 2 output.mp4

視頻和音頻都需要重新編碼 -c:v copy -c:a libvorbis既绩,不寫使用默認(rèn)編碼
-c:v copy指定編碼時,會報以下錯誤还惠,使用默認(rèn)編碼不會報錯饲握,修改方式如下

[mp4 @ 00000000004f1c80] Timestamps are unset in a packet for stream 0. This is
deprecated and will stop working in the future. Fix your code to set the timesta
mps properly
[mp4 @ 00000000004f1c80] pts has no value

ffmpeg -i input.mp4 -i input.mp3 -filter_complex 
"[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,
      volume=-30dB[a0];
[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,
      volume=30dB[a1];
[a0][a1]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[outa];
[0:v]setpts=PTS-STARTPTS[outv]" 
-map "[outv]" -map "[outa]" -c:a aac output.mp4

(1)amerge 合并成多聲道流
(2)必須要相同數(shù)據(jù)格式aformat哪雕,相同采樣率屯阀;設(shè)置channel_layouts,不然可能有警告
(3)pan過濾器
一般格式
output channel layout or number of channels | outdef | outdef
(4)c0 第一個輸入的左聲道吏饿,c3 第二個輸入的右聲道锣光,是聲道號
(5) < 表示不是去除噪音笆怠, = 會
If the ‘=’ in a channel specification is replaced by ‘<’, then the gains for that specification will be renormalized so that the total is 1, thus avoiding clipping noise.
(6) outdef 中聲道號或聲道名前的系數(shù)表示截取的音量
(7)默認(rèn)shortest

https://ffmpeg.org/ffmpeg-filters.html#pan-1

ffmpeg -i 9.ts -i zai.mp3 -filter_complex 
"[0:v]setpts=PTS-STARTPTS[outv];
 [0:a]volume=-30dB[a0];
 [1:a]volume=30dB[a1];
 [a0][a1]amix=inputs=2:duration=shortest[outa]" 
 -map "[outv]" -map "[outa]" -ac 2 output.mp4

(1)amix如果都是整數(shù)采樣率, 自動幫轉(zhuǎn)浮點采樣

Note that this filter only supports float samples (the amerge and pan audio filters
support many formats). If the amix input has integer samples then aresample will be automatically inserted to perform the conversion to float samples.

(2)支持多種參數(shù)

https://ffmpeg.org/ffprobe-all.html#amix

音量設(shè)置:

(1)在轉(zhuǎn)碼時設(shè)置
-vol 設(shè)置音量大小誊爹,256為標(biāo)準(zhǔn)音量蹬刷。(要設(shè)置成兩倍音量時則輸入512,依此類推替废。)
(2)使用過濾器設(shè)置 -af

查看音量level:

ffmpeg -i input.mp3 -af "volumedetect" -f null /dev/null

不指定輸出格式箍铭,沒有輸出文件

原音量

[Parsed_volumedetect_0 @ 0000000002bddd00] n_samples: 1320192
[Parsed_volumedetect_0 @ 0000000002bddd00] mean_volume: -33.9 dB
[Parsed_volumedetect_0 @ 0000000002bddd00] max_volume: -12.0 dB
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_12db: 9
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_13db: 6

[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_14db: 57
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_15db: 189
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_16db: 311
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_17db: 603
[Parsed_volumedetect_0 @ 0000000002bddd00] histogram_18db: 1092

2倍音量

ffmpeg -i input.mp4 i -af volume=2 output.mp4

[Parsed_volumedetect_0 @ 0000000002af45c0] n_samples: 1320960
[Parsed_volumedetect_0 @ 0000000002af45c0] mean_volume: -27.9 dB
[Parsed_volumedetect_0 @ 0000000002af45c0] max_volume: -6.2 dB
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_6db: 9
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_7db: 6
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_8db: 52
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_9db: 164

[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_10db: 346
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_11db: 582
[Parsed_volumedetect_0 @ 0000000002af45c0] histogram_12db: 1074

5.裁剪視頻

裁剪視頻的某個時間段, 可以精確裁剪和極速裁剪; 極速裁剪是根據(jù)視頻的IDR幀來調(diào)節(jié),如果視頻中的IDR間距過長,則可能有很大誤差, 如果IDR是一秒鐘一個,你裁剪時間段的最小單位是秒, 則幾乎是精確的. 精確裁剪是對視頻重新編碼, 精確但需要重新執(zhí)行一遍.

快速裁剪

ffmpeg -ss 20 -input.mp4 -t 40 -c copy output.mp4

-ss參數(shù)在-i之前
很難做到精確裁剪,指定的開始/結(jié)束的時間戳處不是關(guān)鍵幀椎镣,會自動尋找最近的關(guān)鍵幀進(jìn)行裁剪,導(dǎo)致裁剪的起止時間兽赁,和持續(xù)時間不精確

精確裁剪

ffmpeg -ss 10 -t 15 -accurate_seek -i input.mp4 -avoid_negative_ts 1 output.mp4

(1)精準(zhǔn)裁剪需要重新編碼 -accurate_seek 會對原視頻和音頻重新編碼
(2)不能使用-codec copy
(3)-avoid_negative_ts 1 避免時間戳中的負(fù)數(shù)状答,如果要使用concat demuxer拼接視頻時冷守,加上該參數(shù)
(4) -accurate_seek速度較快,對原編碼格式修改較少

ffmpeg -ss 10 -t 15 -i input.mp4 -vcodec libx264 output.mp4

或直接指定編碼格式惊科,對原視頻重新編碼

6.裁剪音頻

裁剪音頻的某個時間段, 生成新的音頻文件

ffmpeg -i input.mp3 -ss 00:01:12 -t 00:01:42 -acodec copy output.mp3

7.拼接視頻

把多個視頻文件拼接在一起.比如有4個視頻ABCD,則拼接后先播放A,然后B-C-D. 基本版本的拼接視頻要分辨率一致, 專業(yè)版可以任意一個視頻. 專業(yè)版可以給視頻增加背景和Logo, 可以調(diào)節(jié)每個音頻的音量, 是否靜音,同時增加背景音樂,并設(shè)置多個視頻在拼接時的轉(zhuǎn)場動畫等.

(1)對于非 MPEG 格式容器拍摇,但是是 MPEG 編碼器(H.264、DivX馆截、XviD充活、MPEG4、MPEG2蜡娶、AAC混卵、MP2、MP3 等)
All files must have the same streams (same codecs, same time base, etc.) but can be wrapped in different container formats.

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

ffmpeg.exe -f concat -safe 0 -i filelist.txt -c copy output.mp4

(2)If you have MP4 files, these could be losslessly concatenated by first transcoding them to MPEG-2 transport streams. With H.264 video and AAC audio, the following can be used:

ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4

All MPEG codecs (MPEG-4 Part 10 / AVC, MPEG-4 Part 2, MPEG-2 Video, MPEG-1 Audio Layer II, MPEG-2 Audio Layer III (MP3), MPEG-4 Part III (AAC)) are supported in the MPEG-TS container format, although the commands above would require some alteration (e.g., the -bsf bitstream filters will have to be changed).

(3)-filter_complex
基礎(chǔ)版

ffmpeg -i 00.avi -i 00.avi -i 00.avi -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]" -c:v libx264 output.mp4

專業(yè)版

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex 
"[0:v]scale=1080:720,setsar=sar=1[sv0];
 [1:v]scale=1080:720,setsar=sar=1[sv1];
[sv0][0:a][sv1][1:a]concat=n=2:v=1:a=1" output.mp4

PAR —— Pixel Aspect Ratio 像素橫縱比窖张。表示每個像素的寬度與長度的比值幕随。可以認(rèn)為每個像素不是正方形的宿接。
DAR —— Display Aspect Ratio 顯示橫縱比赘淮。最終顯示的圖像在長度單位上的橫縱比。
SAR —— Sample Aspect Ratio 采樣橫縱比睦霎。表示橫向的像素點數(shù)和縱向的像素點數(shù)的比值梢卸。

16:9和4:3指的是DAR,DAR和SAR之間沒有必然聯(lián)系副女。
三者之間的關(guān)系 PAR x SAR = DAR

ffmpeg 
-i input1.avi -i intput2.mp4 
-i input.mp3 -loop 1 -framerate 25 -t 45 -i mr.jpg 
-filter_complex 
"[0:v]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
             :'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
      pad=1280:720:(ow-iw)/2:(oh-ih)/2,
      setsar=sar=1,
      fade=t=in:st=0:d=3:alpha=1,fade=t=out:st=12:d=3:alpha=1[sv0];    
[1:v]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
            :'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
       pad=1280:720:(ow-iw)/2:(oh-ih)/2,
       setsar=sar=1,
       fade=t=in:st=0:d=5:alpha=1,fade=t=out:st=25:d=5:alpha=1[sv1];
[0:a]volume=0[a0];
[sv0][sv1]concat=n=2:v=1:a=0[tempv];
[a0][1:a]concat=n=2:v=0:a=1[tempa];
[tempa][2:a]amix=inputs=2:duration=shortest[outa];
[3]scale='if(gt(a*sar,16/9),1280,720*iw*sar/ih)'
          :'if(gt(a*sar,16/9),1280*ih/iw/sar,720)',
    pad=1280:720:(ow-iw)/2:(oh-ih)/2,
    setsar=sar=1[img];
[img][tempv]overlay=shortest=1:x=0:y=0[outv]" 
-map "[outv]" -map "[outa]" output.mp4

(1)設(shè)置分辨率蛤高,scale=1080:720,setsar=sar=1,有些原視頻sar肮塞!=1襟齿,任意設(shè)置分辨率會報錯
(2)調(diào)節(jié)每個音頻的音量, 是否靜音,volume=0,設(shè)置音量,或靜音
(3)增加背景音樂枕赵,需要將原音頻都抽取出來拼接猜欺,再使用amix添加背景音樂,并防止背景音樂時間過長duration=shortest
(4)多個視頻在拼接時的轉(zhuǎn)場動畫,轉(zhuǎn)場是淡入淡出fade=t=in:st=0:d=5:alpha=1,fade=t=out:st=25:d=5:alpha=1(t類型拷窜,st開始時間开皿,d持續(xù)時間,alpha設(shè)置alpha通道篮昧,可以看到背景)
(5)視頻增加背景和Logo,背景圖片的輸入-i input.mp3 -loop 1 -framerate 25 -t 45 -i mr.jpg 必須設(shè)置循環(huán)加載和持續(xù)時間赋荆,將視頻覆蓋在背景之上[img][tempv]overlay=shortest=1:x=0:y=0[outv],必選設(shè)置shortest=1懊昨,背景圖片是循環(huán)加載的窄潭,不然沒有結(jié)束;圖片縮放也要加setsar=sar=1

8.拼接音頻

多個音頻文件的拼接. 可以是不同的采樣率的音頻文件.

ffmpeg.exe -f concat -safe 0 -i filelist.txt -c copy output.mp3
ffmpeg -i "concat:input1.mp3|input2.mp3" -vcodec copy output.mp3

(1)concat可以支持不同采樣率,會提高采樣率
(2)很多mp3有封面酵颁,需要-vcodec copy

ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex 
"[0:0] [1:0] concat=n=2:v=0:a=1 [a]" -map "[a]" output.mp3

會重新編碼嫉你,速度較慢

9.裁剪畫面

裁剪視頻畫面的某個區(qū)域, 視頻的最上角是0.0; 然后設(shè)置大小后, 即可裁剪.

ffmpeg -i input.mp4 -vf crop=iw/3:ih:iw/3*2:0 -c:a copy output.mp4

10.拼接畫面

多個視頻畫面拼接在一起月帝。比如有abcd四個視頻,可以a放左上角幽污,b放右上角嚷辅,c放左下角,d放右下角處理后的視頻同時播放距误,可以設(shè)置每個視頻的坐標(biāo)簸搞,寬高,可以重疊准潭,可以增加背景圖片等

ffmpeg -i input1.ts -i input2.avi -i input3.mkv -i input4.mp4 -filter_complex 
"[0:v]scale='if(gt(a*sar,16/9),960,540*iw*sar/ih)'
                  :'if(gt(a*sar,16/9),960*ih/iw/sar,540)',
                  pad=960:540:(ow-iw)/2:(oh-ih)/2,
                  setsar=sar=1[sv0];     
 [sv0]pad=1920:1080[pad0];
 [1:v]scale=960:540[sv1];[pad0][sv1]overlay=960[over1];
 [2:v]scale=960:540[sv2];[over1][sv2]overlay=0:540[over2];
 [3:v]scale=960:540[sv3];[over2][sv3]overlay=960:540" out.mp4

11.提取視頻圖片

提取視頻中的圖片, 可以只提取第一幀, 可以間隔提取多少幀, 可以讀取視頻的所有幀

(1)提取第一幀

ffmpeg -i 9.ts -vf "select=between(n\,0\,0)" image.jpg
ffmpeg -i 9.ts -vf "select=between(n\,1\,10)*not(mod(n\,4))" image%03d.jpg

between(n,1,10) 在第幾-第幾幀之間
not(mod(n,4)) 間隔多少幀

ffmpeg -i 9.ts -ss 1 -t 5 -f image2  -vframes 40 -s 352x240 image%03d.jpg

-f 強制選擇格式
-ss 從多少秒開始 支持00:00:01
-t 持續(xù)多少秒
-vframes 提取多少幀
-s 提取幀的寬高

(2)間隔提取幀

ffmpeg -i 9.ts -f image2 -vf fps=1/2 image%03d.jpeg

-vf fps 每秒取多少幀 =1 每秒取一幀 =1/2 2秒取一幀

(3)讀取視頻的所有幀

ffmpeg -i 9.ts -f image2 image%03d.jpeg

12.圖片轉(zhuǎn)視頻

可以一張圖片轉(zhuǎn)視頻, 也可以是多張圖片. 設(shè)置視頻的總長度, 幀率,碼率. 如果是多張圖片,可以設(shè)置多張圖片的切換間隔.

(1)單張圖片

 ffmpeg -loop 1 -i input.jpg -vcodec libx264 -r 25 -b:v 300k -t 10 test.mp4

-loop 1循環(huán)讀輸入 0讀完就不讀了

(2)多張圖片

ffmpeg -framerate 0.2 -r 27 -i image%03d.jpeg test.mp4

-framerate 幀率 0.2趁俊,相當(dāng)于5秒顯示一張圖片

13.增加水印

在視頻畫面上疊加一張圖片, 可以指定位置, 圖片從左上角開始疊加到視頻中,以原始大小呈現(xiàn).比如APP-LOGO

//movie容器
ffmpeg -i input.mp4 -vf  
"movie=watermark.png[watermark];
 [in] [watermark] overlay=30:10" output.mp4

//-filter_complex
ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.mp4

//跑馬燈水印
ffmpeg  -i input.mp4 -i biu.png -filter_complex 
"overlay='if(gte(t,1), -w+(t-1)*200, NAN)'
:(main_h-overlay_h)/2[v]" -map "[v]" -map 0:a -c:a copy out.mp4

movie容器

ffmpeg -i input1.mp4 -vf "movie=input2.mp4:seek_point=5, 
                          scale=500:-1, setpts=PTS-STARTPTS [over];
                          [in] setpts=PTS-STARTPTS [main];
                          [main][over]overlay=160:160" output.mp4

(1)movie容器指向 input2.mp4
(2)seek_point=5 跳轉(zhuǎn)到5秒,movie 還有選擇流的參數(shù)等惋鹅,loop默認(rèn)1
參數(shù):https://ffmpeg.org/ffmpeg-filters.html#movie-1
(3)setpts=PTS-STARTPTS 跳轉(zhuǎn)到5秒后则酝,設(shè)置開始時間為0
(4) [in] 表示input1.mp4,不一定起名是in

14.刪除水印

準(zhǔn)確的講是:模糊視頻的某個區(qū)域, 最多可以模糊視頻的4個區(qū)域, 當(dāng)用戶在界面上選中某個區(qū)域后, 有坐標(biāo)和寬高,則用VideoEditor中的模糊方法即可模糊該區(qū)域.比如APP-LOGO

模糊單個區(qū)域

 ffmpeg -i 9.ts -filter_complex 
 "[0:v]crop=200:45:(iw-345):90,boxblur=9[fg];[0:v][fg]overlay=(W-345):90" output.mp4

模糊多個區(qū)域

 ffmpeg -i 9.ts -filter_complex
 "[0:v]crop=200:45:(iw-345):90,boxblur=9[b0];   
  [0:v]crop=320:180:1260:845,boxblur=9[b1];
  [0:v][b0]overlay=(W-345):90[over0];
  [over0][b1]overlay=1260:845" output.mp4

特定區(qū)域不模糊

ffmpeg -i 9.ts -filter_complex 
"[0:v]boxblur=10[bg];[0:v]crop=1500:800:210:110[fg];[bg][fg]overlay=210:110" output.mp4

15.指定時間段增加圖片

你可以設(shè)置一個時間段來顯示圖片, 比如要在視頻的第一幀顯示特定的一張圖片,則時間段是0--0.03秒.

ffmpeg -i input.mp4 -loop 1 -i zt.jpg -i mr.jpg -filter_complex 
"[0][1]overlay=enable='bewteen(t,3,8)':shortest=1[v1];
 [v1][2]overlay=enable='bewteen(t,10,18)'[v]"
 -map "[v]" -map 0:a -c:a copy output.mp4

在第3-8秒添加圖片zt.jpg闰集,在第10-18秒添加圖片mr.jpg
-loop 1 圖片是循環(huán)添加
:shortest=1 輸出視頻與輸入視頻時長保持一致沽讹,不然圖片-loop 1循環(huán)輸入,將是一個死循環(huán)

設(shè)置時間段bewteen(t,0,0.03)武鲁,不一定添加成功爽雄,可以設(shè)置bewteen(t,0,0.04),就可能是前兩幀沐鼠。
設(shè)置幀index eq(n,0)挚瘟,不一定添加成功,可以設(shè)置eq(n,1)饲梭,也有可能是前兩幀乘盖。

16.增加文字

直接給視頻增加文字,但因文字需字體,我們建議先把文字轉(zhuǎn)換為圖片憔涉,然后疊加圖片來實現(xiàn)订框,從而省去設(shè)置字體的麻煩.

ffmpeg  -i input.mp4 -vf 
"drawtext=fontfile=simsun.ttc
:text='國境之南':x=100:y=100:fontsize=28
:fontcolor=green:shadowy=2" output.mp4

17.縮放視頻

縮放視頻大小, 可以放大,或縮小.

ffmpeg -i input.mpg -s 320x240 output.mp4

-s:scale filter 后跟 寬x高

ffmpeg -i input.mpg -vf scale=320:240 output.mp4

-vf:video filter

18.壓縮視頻

手機里的視頻一般碼率很大,比如30M, 50M這樣的,從而文件也就很大, 不利于上傳, 我們會重新對視頻編碼, 調(diào)整碼率,從而使視頻文件大小降低很多, 此方法不建議單獨使用,因為你在做其他方法帶有編碼的功能時候,我們會自動調(diào)整碼率, 從而附帶壓縮的效果.

(1) -b

ffmpeg -i input.mp4 -c:v libx264 -b:v 1M output.mp4

bitrate模式
即為固定目標(biāo)碼率模式(固定目標(biāo)比特率模式),x264會試圖讓最終文件的整體碼率與給定的碼率相等兜叨,這會使最終文件的大小是確定的穿扳,適用于精確控制體積,但由于這是一次編碼国旷,所以畫質(zhì)上不如同等體積的crf矛物,故一般配合pass參數(shù)使用。

ffmpeg -y -i input -c:v libx264 -b:v 2600k -pass 1 -c:a aac -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4
//如果是 Windows 環(huán)境跪但, /dev/null 換為 NUL履羞,\ 換為 ^

(2) -crf

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

即 Constant Rate Factor模式,如果說QP是固定量化器,bitrate是固定文件最終大小,那么crf則是則是固定“肉眼質(zhì)量”吧雹,crf可以提供跟QP一樣的視覺的質(zhì)量骨杂,但是文件更小涂身。
crf是通過降低那些“不那么重要”的幀的質(zhì)量做到這一切的~雄卷,“不那么重要”意思是過于耗費碼率又難以用肉眼察覺的幀。省下來的碼率會用在其它更有效的幀里蛤售。

(3) -qp

ffmpeg -i input.mp4 -c:v libx264 -qp 23 output.mp4

qp模式
即為固定量化值(Constant Quantizer)模式來編碼視頻..需要注意的是這里的量化參值為P幀的量化值..I 幀(IDR幀)和B幀的量化值又由ipratio和bpratio參數(shù)來確定..不過通常這兩個參數(shù)無需手動設(shè)置丁鹉。
簡單點說qp模式就是:相對于壓縮前的原視頻來說每一個 P 幀 I 幀 B幀都會固定的損失一部分質(zhì)量..損失判定是固定的.但由于I P B幀的插入是不確定的。所以最終文件的大小是無法確定的悴能。相同視覺質(zhì)量時qp模式壓出的視頻文件比crf模式大揣钦。

19.旋轉(zhuǎn)視頻

旋轉(zhuǎn)視頻角度, 90度, 180度, 270, 等, 也可以設(shè)置視頻的元數(shù)據(jù), 視頻本身不旋轉(zhuǎn), 讓在播放的時候, 旋轉(zhuǎn)畫面播放.

(1)畫面旋轉(zhuǎn)

//順時針旋轉(zhuǎn)畫面90度
ffmpeg -i test.mp4 -vf "transpose=1" out.mp4 
//逆時針旋轉(zhuǎn)畫面90度
ffmpeg -i test.mp4 -vf "transpose=2" out.mp4 
//順時針旋轉(zhuǎn)畫面90度再水平翻轉(zhuǎn)
ffmpeg -i test.mp4 -vf "transpose=3" out.mp4 
//逆時針旋轉(zhuǎn)畫面90度水平翻轉(zhuǎn)
ffmpeg -i test.mp4 -vf "transpose=0" out.mp4 
//水平翻轉(zhuǎn)視頻畫面
ffmpeg -i test.mp4 -vf hflip out.mp4 
//垂直翻轉(zhuǎn)視頻畫面
ffmpeg -i test.mp4 -vf vflip out.mp4

transpose可以旋轉(zhuǎn),但是不能用-c:v copy漠酿,必須要重新轉(zhuǎn)碼

(2)元數(shù)據(jù)旋轉(zhuǎn)

ffmpeg -i input.mp4 -metadata:s:v:0 rotate=90 -codec copy output.mp4

要加-codec copy冯凹,不然不生效

20.倒序

把視頻從后到前處理.這樣處理后的視頻, 在播放的時候,就是倒序播放.

1.視頻倒放,無音頻
ffmpeg -i input.mp4 -filter_complex 
"[0:v]reverse[v]" -map [v] -preset superfast reversed.mp4

2.視頻倒放炒嘲,音頻不變
ffmpeg -i input.mp4 -vf reverse reversed.mp4

3.音頻倒放宇姚,視頻不變
ffmpeg -i input.mp4 -c:v copy -af areverse reversed_audio.mp4

4.音視頻同時倒放
ffmpeg -i input.mp4 -vf reverse -af areverse -preset superfast reversed.mp4

21.加減速

把整個視頻加減速處理, 比如降低一倍, 速度值的范圍是0.5---2.0 ; 0.5是降低一倍, 2.0是加速播放兩倍.

//減速到0.5倍     
ffmpeg -i input.mp4 -filter_complex 
"[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4

//加速到2倍
fmpeg -i input.mp4 -filter_complex 
"[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4

22.調(diào)整視頻幀率

調(diào)節(jié)視頻的幀率, 比如把本身是60幀每秒的視頻, 降低到30幀.

(1)-r

ffmpeg -i input.mp4 -r 30 output.mp4

(2)-vf fps=

ffmpeg -i input.mp4 -vf fps=30 output.mp4

23.鏡像視頻

把視頻的左邊視頻,鏡像到右邊; 或者把上半部分的視頻, 鏡像到下半部分.
(1)左右鏡像

ffmpeg -i input.mp4 -filter_complex 
"[0:v]pad=w=2*iw[main];
 [0:v]hflip[overlay];
 [main][overlay]overlay=x=w" output.mp4

(2)上下鏡像

ffmpeg -i input.mp4 -filter_complex 
"[0:v]pad=0:h=2*ih[main];
 [0:v]vflip[overlay];[main][overlay]overlay=y=h" out.mp4

24.視頻轉(zhuǎn)碼

設(shè)置視頻的碼率 轉(zhuǎn)換編碼, 或者把編碼格式轉(zhuǎn)換, 比如特定電子設(shè)備的視頻編碼是PCM+mjpeg格式, 轉(zhuǎn)換為AAC+H264的格式,

ffmpeg -i input.mp4 -vcodec h264 -acodec aac -b:v 2600k -b:a 300k output.mp4

25.視頻轉(zhuǎn)Gif

把視頻轉(zhuǎn)換為gif格式的動畫, 支持間隔幾幀讀取, 支持速度調(diào)節(jié),縮放視頻畫面

(1)一般用法

ffmpeg -i input.mp4 -r 15 -vf scale = 640:-1 -f gif output.gif

(2)每一幀使用一個調(diào)色板

ffmpeg -i input.mov -filter_complex  
"[0:v]fps = 15,scale = w = 640:h = -1,split [a] [b];
 [a] palettegen = stats_mode = single [p];
 [b] [p] paletteuse = new = 1" output.gif

文件大小最大,畫面質(zhì)量最好

(3)使用全局調(diào)色板

ffmpeg -i input.mp4 -filter_complex  
"[0:v] fps = 15,scale = w = 640:h = -1,
        setpts=0.5*PTS,select='not(mod(n,\4))',split [a] [b];
 [a] palettegen = stats_mode = diff [p];
 [b] [p] paletteuse = dither = floyd_steinberg" output.gif

(1)scale = w = 640:h = -1 寬=640夫凸,畫面保持原始比例
(2)select='not(mod(n,\4))' 每4幀中取一幀
(3)setpts=0.5*PTS 對視頻加減速來調(diào)節(jié)gif速度
(4)palettegen = stats_mode = diff
默認(rèn)是full, diff模式對比與前一幀的差異浑劳,對畫面中移動的物體支持較好
(5)paletteuse = dither = floyd_steinberg,

dither可以為
floyd_steinberg :最常用
sierra2_4a :默認(rèn)
sierra2 :sierra2_4a的改進(jìn)夭拌,速度較快魔熏,大小較小
none
bayer
heckbert

gif參考:
http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html
https://qiita.com/yusuga/items/ba7b5c2cac3f2928f040

26.MP4附帶文字

在mp4文件里增加一些文字說明, 這些書名捆綁在mp4文件中, 拿到mp4文件后可以讀出這些文字.比如你可以把一些配置,json說明文件, 標(biāo)記字符串捆綁在mp4文件,這樣服務(wù)器端或別的地方拿到這個mp4文件后, 就可以直接解析出對應(yīng)的說明字符串,從而減少傳送多個文件的麻煩.

ffmpeg -i input.mp4 -f ffmetadata -i in.txt -c copy -map_metadata 1 out.mp4

-f ffmetadata要寫在輸入文件-i in.txt之前

ffmetadata 文件格式見:
The ffmetadata format allows you to add chapters to a file.
Have a look at https://ffmpeg.org/ffmpeg-formats.html#Metadata-1 for an example.

27.獲取MP4文字

讀取mp4中的各種附帶的字符串.

ffmpeg -i input.mp4 -f ffmetadata in.txt

ffmpeg -i input.mp4 
-map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata out.txt

(1)-map_metadata 0 全局metadata
(2)-map_metadata:s:v s表示選擇

28.延遲音頻

把聲音比視頻延后一段時間再播放.
(1)單個視頻輸入

ffmpeg  -itsoffset 10 -i input.mp4 -map 0:v -map 0:a -c:a copy -c:v copy output.mp4

-itsoffset 要寫在 -i 輸入之前
(2)一個視頻、一個音頻輸入

ffmpeg -i input.mp4 -itsoffset 10 -i audio.mp3 -map 0:v:0 -map 1:a:0 output.mp4

29.m4a轉(zhuǎn)mp3

把AAC編碼的m4a文件, 轉(zhuǎn)換為mp3編碼格式的音頻文件,支持編碼,通道,采樣率的轉(zhuǎn)換.

ffmpeg -i input.m4a -acodec libmp3lame -ab 128k -ar 48000 -ac 2 -vcodec copy output.mp3

30.mp3轉(zhuǎn)m4a

把mp3格式的音頻,轉(zhuǎn)換為AAC編碼的m4a音頻.支持碼率,通道,采樣率的轉(zhuǎn)換

ffmpeg -i input.mp3 -acodec aac -ab 128k -ar 48000 -ac 2 -vcodec copy output.m4a

-acodec 編碼器
-ab 音頻碼率
-ac 聲道數(shù)

-vcodec copy 如果mp3有封面鸽扁,必須加視頻選項蒜绽,不然報錯如下

[ipod @ 00000000003b4540] Could not find tag for codec h264 in stream #0, codec
not currently supported in container 
 Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
Conversion failed!

有封面mp3信息

Input #0, mp3, from 'zai.mp3':
Metadata:
  album           : 脠錄脡脮錄脜脛爐隆隴路壟脡脮脠脣脡霉
  artist          : 脣茂脗露
  title           : 脭脵露脠脰脴脧脿路錨
Duration: 00:03:29.70, start: 0.000000, bitrate: 128 kb/s
  Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
  Stream #0:1: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown),
 180x180, 90k tbr, 90k tbn, 90k tbc
  Metadata:
    comment         : Cover (front)

31.音頻轉(zhuǎn)單通道wav

把m4a ,mp4, mp3中的聲音, 轉(zhuǎn)換為wav單通道的音頻. (比如一些語音識別的特定格式)

ffmpeg -i input.m4a -f wav -ac 1 output.wav
ffmpeg -i input.mp4 -f wav -ac 1 output.wav
ffmpeg -i input.mp3 -f wav -ac 1 output.wav

32.音頻解碼為wav

把mp4, m4a ,mp3中的聲音轉(zhuǎn)換為wav格式, 支持碼率,通道, 采樣率的轉(zhuǎn)換.

ffmpeg -i input.m4a -f wav -ab 128k -ar 48000 -ac 1 output.wav
ffmpeg -i input.mp4 -f wav -ab 128k -ar 48000 -ac 1 output.wav
ffmpeg -i input.mp3 -f wav -ab 128k -ar 48000 -ac 1 output.wav

額外命令

1.去除Data stream

libavutil      56. 26.100 / 56. 26.100
libavcodec     58. 48.101 / 58. 48.101
libavformat    58. 27.100 / 58. 27.100
libavdevice    58.  7.100 / 58.  7.100
libavfilter     7. 48.100 /  7. 48.100
libswscale      5.  4.100 /  5.  4.100
libswresample   3.  4.100 /  3.  4.100
libpostproc    55.  4.100 / 55.  4.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0000000000633640] Using non-standard frame rate 28/1
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'soul_master.mov':
Metadata:
major_brand     : qt
minor_version   : 537199360
compatible_brands: qt
creation_time   : 2019-05-14T09:29:16.000000Z
 Duration: 00:00:22.76, start: 0.000000, bitrate: 69409 kb/s
Stream #0:0(eng): Video: qtrle (rle  / 0x20656C72), rgb24(progressive), 720x
450, 67504 kb/s, SAR 1:1 DAR 8:5, 27.51 fps, 27.51 tbr, 27506 tbn, 27506 tbc (default)
Metadata:
  creation_time   : 2019-05-14T09:29:16.000000Z
  handler_name    : Apple Video Media Handler
  encoder         : 脗盲廬脕卯陋
  timecode        : 00:00:00:00
Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb/s (default)
Metadata:
  creation_time   : 2019-05-14T09:29:16.000000Z
  handler_name    : Apple Sound Media Handler
  timecode        : 00:00:00:00
Stream #0:2(eng): Data: none (tmcd / 0x64636D74), 0 kb/s (default)
Metadata:
  creation_time   : 2019-05-14T09:29:16.000000Z
  handler_name    : Time Code Media Handler
  timecode        : 00:00:00:00
Unsupported codec with id 0 for input stream 2

(1) 利用-filter_complex和-map

ffmpeg -i input.mp4 -filter_complex "[0:v]null[video_out];[0:a]anull[audio_out]"  \
-map [video_out] -map [audio_out] output.mp4

對stream 2不做-filter_complex和-map

(2) -write_tmcd 0

ffmpeg.exe -i input.mp4 -vcodec copy -write_tmcd 0 output.mp4

如果有格式轉(zhuǎn)換,例如.mov轉(zhuǎn).mp4格式桶现,視頻無法播放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躲雅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巩那,更是在濱河造成了極大的恐慌吏夯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即横,死亡現(xiàn)場離奇詭異噪生,居然都是意外死亡,警方通過查閱死者的電腦和手機东囚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門跺嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事桨嫁≈怖迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵璃吧,是天一觀的道長楣导。 經(jīng)常有香客問我,道長畜挨,這世上最難降的妖魔是什么筒繁? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮巴元,結(jié)果婚禮上毡咏,老公的妹妹穿的比我還像新娘。我一直安慰自己逮刨,他們只是感情好呕缭,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著修己,像睡著了一般恢总。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箩退,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天离熏,我揣著相機與錄音,去河邊找鬼戴涝。 笑死滋戳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啥刻。 我是一名探鬼主播奸鸯,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼可帽!你這毒婦竟也來了娄涩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤映跟,失蹤者是張志新(化名)和其女友劉穎蓄拣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努隙,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡球恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荸镊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咽斧。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堪置,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出张惹,到底是詐尸還是另有隱情舀锨,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布宛逗,位于F島的核電站坎匿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拧额。R本人自食惡果不足惜碑诉,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侥锦。 院中可真熱鬧,春花似錦德挣、人聲如沸恭垦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽番挺。三九已至,卻和暖如春屯掖,著一層夾襖步出監(jiān)牢的瞬間玄柏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工贴铜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粪摘,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓绍坝,卻偏偏與公主長得像徘意,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轩褐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • [TOC] 音視頻&流媒體 是什么促使我要寫這一篇音視頻入門文章椎咧?那是因為和一妹子打賭碼率的概念,結(jié)果輸了把介;對一個...
    AllenWu閱讀 4,824評論 1 24
  • ### YUV顏色空間 視頻是由一幀一幀的數(shù)據(jù)連接而成勤讽,而一幀視頻數(shù)據(jù)其實就是一張圖片。 yuv是一種圖片儲存格式...
    天使君閱讀 3,282評論 0 4
  • 因為正在學(xué)習(xí)音視頻莫矗,從當(dāng)當(dāng)買了關(guān)于FFmpeg的書飒硅,在家補充知識。遇到了一些命令行的使用作谚,我把它從書上移到筆記上三娩,...
    請叫我果爸閱讀 14,644評論 0 18
  • 最近在學(xué)習(xí)一些底層邏輯,不管是人生的還是事業(yè)的妹懒。碰巧有小伙伴推薦了人生算法雀监,很有趣的思考。 上帝不會安排每個人的命...
    杰操哥說閱讀 531評論 0 0
  • 這是心靈對話寫作小組第13篇文章眨唬。 今天的表現(xiàn)自己非常滿意会前,竟然把一個高1米2寬1.4米的大書柜...
    福提之路閱讀 532評論 6 1