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
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ù)
音量設(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格式桶现,視頻無法播放