ffmpeg 操作音频视频

下面是一些对ffmpeg的基本使用的,如果有什么不对的地方请指正勿喷,谢谢,共同学习,共同进步

 

 

====================================================声道和音轨=================================================================================
声道与音轨没有任何联系

单声道
双声道(左右声道)
多声道(5.1-杜比ac3 环绕, 7.1环绕)
一般:左右声道是一样的


单音轨:一个音频文件中只有一个音轨
双音轨:一个音频文件中有双音轨
多音轨:一个音频文件中有多音轨
每个音轨中都可以存放:任何声道的的音频


# ffmpeg路径
ffmpeg -i dog1.mp3


====================================================合并音频文件=================================================================================

# 两个音频合成一个音频(混合播放)
ffmpeg -i dog1_stereo.mp3 -i dog2_mono.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 -y /home/audioTest/dog1_dog2.mp3

解释
-i代表输入参数

-f mp3 输出文件格式
inputs代表音轨输入数量
duration确定最终输出文件的长度, longest(最长)|shortest(最短)|first(第一个文件)
dropout_transition代表转换时间为1秒,最后效果是逐渐减淡

# 两个音频合成一个音频(先后播放)
ffmpeg -y -i 'concat:Wolf_gun1.mp3|sheep.mp3' -acodec copy Wolf_gun1_sheep.mp3

 

================================================加速播放======================================================================================

# 加速,范围:0.5-2
ffmpeg -i gun1.mp3 -filter:a 'atempo=2' gun2_2atempo.mp3

 


================================================向视频中插入两个音轨======================================================================================

#给一个视频中添加多个音轨,但是只能播放一个,到底是播放哪一个和播放器有关
ffmpeg -y -i aaa.mp4 -i gun1.mp3 -map 1 -map 0 /home/audioTest/aaa_double_channel.mp4


================================================提取音频文件的声道======================================================================================

# 提取音频文件中的声道(左声道和又声道,一般来说两个声道是一样的)
ffmpeg -i dog1_dog2_gun.mp3 -map_channel 0.0.0 /home/audioTest/dog1_dog2_gun_left.mp3 -map_channel 0.0.1 /home/audioTest/dog1_dog2_gun_right.mp3

# 提取视频中的音轨(前提音频文件存在两个音轨)
可以看到Audio的Stream有2个,分别获取这两个audio音轨的命令是:
ffmpeg -i 冰雪奇缘BD双语双字.mkv -map 0:1 -b:a 64k -f mp3 -vn a.1.mp3
ffmpeg -i 冰雪奇缘BD双语双字.mkv -map 0:2 -b:a 64k -f mp3 -vn a.2.mp3

参数解释:
-i 表示input,即输入文件
-f 表示format,即输出格式
-vn表示vedio not,即输出不包含视频
-b:a 64k为比特率,默认为128K,这里压缩一下,采用64K

 

 

================================================剪切音频文件======================================================================================

# 剪切
ffmpeg -i Wolf.mp3 -vn -acodec copy -ss 00:00:00 -t 00:00:01 Wolf_01.mp3

 

================================================视频/音频中插入音频======================================================================================

# 向音频文件中插入指定时间的音频(一个是linux测试,一个是linux)
ffmpeg.exe -i aaa_test.mp3 -i Wolf.mp3 -i Wolf.mp3 -filter_complex [1]adelay=delays=5s:all=1[aud1];[2]adelay=delays=6s:all=1[aud2];[0][aud1][aud2]amix=inputs=3 -y a_a_a.mp3
ffmpeg -i Wolf.mp3 -i gun1.mp3 -filter_complex '[1:a]adelay=2s[aa];[0:a][aa]amix=inputs=2' -y a.mp3
分析:
1.延迟音频的时间(插入的时间)很灵活,它可以超出原来的音频长度,如果插入的音频超过了原音频的时长,则整个结果音频文件时间延迟。如果延迟的时间超过了原音频的时间,则插入的音频和原音频之间会存在一段静音


#向视频视频中插入指定时间的音频(一个是linux测试,一个是linux)
ffmpeg.exe -i aaa.mp4 -i Wolf.mp3 -filter_complex [1]volume=0.5[aud1];[aud1]adelay=delays=5s:all=1[aud2];[0:a][aud2]amix=inputs=2 -c:v copy -shortest -y a.mp4
/home/ffmpeg/ffmpeg/ffmpeg-linux/ffmpeg -i aaa.mp4 -i Wolf.mp3 -filter_complex '[1]volume=0.5,adelay=5s[aud2];[0:a][aud2]amix=inputs=2' -c:v copy -shortest -y a.mp4


ffmpeg.exe -i aaa.mp4 -i gun1.mp3 -filter_complex [1]volume=1[aud1];[aud1]afade=t=in:st=0:d=2[aud2];[aud2]afade=t=out:st=2:d=2[aud3];[aud3]adelay=delays=5s:all=1[aud4];[0:a][aud4]amix=inputs=2 -c:v copy -shortest -y a.mp4
分析:
1.延迟的音频时间(插入的时间)很灵活,它可以超出原来的音频长度,如果插入的音频超过了原视频的时长,则整个结果文件时间延迟(视频画面卡顿,音频继续播放)。可以通过 -shortest 参数,让砍掉多余的音频信息
2.可以设置插入音频的音量,如果插入的音频音量很大,则会覆盖原音频的音量
3.可以设置插入音频的淡入时间和淡出时间


#给没有音频流的视频中插入指定时间的音频信息
ffmpeg.exe -i aaa_test.mp4 -i gun1.mp3 -filter_complex [1]volume=1[aud1];[aud1]afade=t=in:st=0:d=2[aud2];[aud2]afade=t=out:st=2:d=2[aud3];[aud3]adelay=delays=5s:all=1[aud4];[aud4]amix=inputs=1 -c:v copy -y a.mp4
分析:
1.延迟的音频时间(插入的时间)很灵活,它可以超出原来的音频长度,如果插入的音频超过了原视频的时长,则整个结果文件时间延迟(视频画面卡顿,音频继续播放)。可以通过 -shortest 参数,让砍掉多余的音频信息,但是如个插入的音频的时间,小于原文件的时长,并且存在 -shortest 参数,则插入的音频文件播放完的时间就是结果文件的结束时间
2.可以设置插入音频的音量
3.可以设置插入音频的淡入时间和淡出时间


# 给视频添加背景音乐(该视频问文件存在音频流),如果插入音频的长度小于原视频的长度,则是循环插入
ffmpeg.exe -i aaa.mp4 -i Wolf.mp3 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -ss 0 -t 60 -y a.mp4


分析:
1.这里的开始时间 -ss 和结束时间 -t 表示结果文件的时长,如果不设置开始时间和借宿时间,则表示该文件会一致增大
2.这里的开始时间 -ss 和结束时间 -t 表示结果文件的时长,如果小于原视频时长,则不会出现画面,之后音频,如果大于原视频时长,则多余原视频的时间内会出现画面卡顿,仅仅播放音频

# 给视频添加背景音乐(该视频问文件不存在音频流),如果插入音频的长度小于原视频的长度,则是循环插入
ffmpeg.exe -i aaa_test.mp4 -i a_a_a.mp3 -filter_complex [1:a]aloop=loop=-1:size=2e+09[out];[out]amix=inputs=1 -ss 0 -t 60 -c:v copy -y a.mp4

 

 

================================================音频文件插入封面
======================================================================================
# 为mp3添加封面,即将音频文件转成视频文件
ffmpeg.exe -i aaa_test.mp3 -i zz.jpg -c:v h264 -c:a mp3 aaa_mp3_to_mp4.mp4

 

 

================================================加黑边
和去黑边
======================================================================================

加黑边增加的是画面区域的右侧和下侧。

去黑边切去的是画面区域的右侧和下侧

# 个视频添加黑边框与去黑边框

ffmpeg -threads 16 -i input.mp4 -vf pad=a:b:c:d:black -acodec copy -crf 12 output.mp4

ffmpeg.exe -i aaa.mp4 -vf pad=640:640:0:140:black -acodec copy -y aaa_mp4_black.mp4

ffmpeg -threads 16 -i input.mp4 -vf crop=a:b:c:d -acodec copy -crf 12 output.mp4


一些示例如下
ffmpeg.exe -i aaa_mp4_black__black.mp4 -vf crop=640:380:0:0 -acodec copy -y aaa_mp4_black__black_no.mp4


其中a、b、c、d分别代表的参数是
a为输出的宽度,
b为输出的高度,
c为需要左移的距离,
d为序要上移的距离(单位默认为pixel)

c的值如果大于a与原始视频的宽度差,则只移动a与原始视频的宽度差的距离,

d的值如果大于b与原始视频的高度差,则只移动b与原始视频的高度差的距离,

 

 

# 缩放视频,并添加黑边(输出的分辨率:宽 < 高)
ffmpeg -i input.mp4 -vf "scale=720:(ih*720/iw),pad=720:1280:0:(1280-(ih*720/iw))/2:black" -y output.mp4

ffmpeg.exe -i aaa.mp4 -vf scale=1024:(ih*1024/iw),pad=1024:1024:0:(1024-(ih*1024/iw))/2:black -acodec copy -y aaa_mp4_black.mp4

ffmpeg.exe -i aaa.mp4 -vf scale=640:(ih*640/iw),pad=640:368:0:0:black -acodec copy -y aaa_mp4_black.mp4


// 将视频等比例缩放到720的宽度,再贴到幕布(720x1280)中央。

# 缩放视频,并添加黑边(输出到的辨率:宽> 高)
ffmpeg.exe -i aaa.mp4 -vf scale=(200*iw/ih):200,pad=640:200:(640-(200*iw/ih))/2:0:black -acodec copy -y aaa_mp4_black.mp4

注意:scale=是视频画面的值,pad中的值是最画面进行添加黑边框,因此pad中输出的高度与宽度一定不能小于scale中的高度与宽度


================================================修改音频文件的音量======================================================================================


# 修改音频文件的音频(对当前音量的倍数处理)

方式一(-vol 512):vol:的默认是256,如果增加一倍的音频,则该值是512。如果增加的音量太高,则会导致音量失帧(破音)(该方式,可以实现,但是在使用的时候会提示不建议使用)
ffmpeg.exe -i aaa_test.mp3 -vol 512 -y aaa_test_vol_512.mp3

方式二(-filter: volume=1):volume:的默认是1,如果增加一倍的音频,则该值是2,如果减少1倍,则该值是0.5。如果增加的音量太高,则会导致音量失帧(破音),如果减低太多,则直接静音
ffmpeg.exe -i aaa_test.mp3 -filter: volume=1 -y aaa_test_volume_1.mp3

# 修改音频文件的音频(基于分贝值的处理),如果增加的音量太高,则会导致音量失帧(破音)
方式一(-filter: volume=5dB):volume:的默认是0dB,如果想要将音量提高1分贝,则该是是1dB,如果想要将音量降低1分贝,则该值是-1dB,如果增加的音量太高,则会导致音量失帧(破音),如果减低太多,则直接静音
ffmpeg.exe -i aaa_test.mp3 -filter: volume=5dB -y aaa_test_volume_5dB.mp3

# 音量标准化(可以是破音的音频文件变得不破音),除了上面对音量的整体处理,如降低分贝值或者成倍增加音量,ffmpeg还有对音量标准化的处理功能,即削峰填谷,使整个音频的音量变化跨度降低,变得平滑,可能会听起来更舒服点吧
ffmpeg.exe -i aaa_test_volume_15dB.mp3 -filter:a loudnorm aaa_test_volume_15dB_loudnorm.mp3

#对音频文件中的某一段进行调音(调试文件中部份声音),volume=1表示原文件的声音,volume=0表示静音, volume=2表示音量翻倍(可能会破音)
ffmpeg.exe -i aaa_test.mp3 -af volume=enable='between(t,3,5)':volume=0 -y a.mp3

#对视频也适用(一个windows测试,一个是linux测试)
ffmpeg.exe -i aaa.mp4 -af volume=enable='between(t,3,5)':volume=0 -c:v copy -y a.mp4
ffmpeg -i aaa.mp4 -af volume=enable='between(t\,3\,5)':volume=0 -c:v copy -y a.mp4

 

==================================================音频的淡入淡出=================================================================================
ffmpeg -y -i gun1.mp3 -filter_complex '[0]afade=t=in:st=0:d=5[aa],[aa]afade=t=out:st=1:d=2' a.mp3

分析:
1.设置5.5秒的黑场,然后开始0.5秒的淡入:fade=t=in:st=5.5:d=0.5
3.如果音频淡入和淡出的时间与淡出的时间交替了,则会出现这种情况:音频还没有完全淡出就开始淡出了,并且如果淡出的时间小于原视频的结束时间,那么音频淡出之后就是静音了

 

==================================================视频的淡入淡出=================================================================================

ffmpeg -y -i aaa.mp4 -filter_complex [0:v]fade=t=in:st=0:d=5[aa],[aa]fade=t=out:st=25:d=5 -filter_complex [0:a]afade=t=in:st=0:d=5[bb],[bb]afade=t=out:st=30:d=5 a.mp4

分析:
1.设置5.5秒的黑场,然后开始0.5秒的淡入: fade=t=in:st=5.5:d=0.5
2.如果画面淡入和淡出的时长与淡出的时长交替了,则会出现这种情况:画面还没有完全淡入就开始淡出了,并且如果淡出的时间小于原视频的结束时间,那么画面淡出之后仅仅只有声音了
3.如果音频淡入和淡出的时间与淡出的时间交替了,则会出现这种情况:音频还没有完全淡出就开始淡出了,并且如果淡出的时间小于原视频的结束时间,那么音频淡出之后仅仅只有画面了

 

==================================================处理视频的图片水印================================================================================

ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v] scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4

# 添加一张图片图片水印
ffmpeg.exe -i aaa.mp4 -i zz.jpg -filter_complex [1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0 -y a.mp4

#添加一张图片水印,并设置淡入时间,但是显示的是黑色框
ffmpeg.exe -i aaa.mp4 -i zz.jpg -filter_complex [1:v]fade=in:0:1[2:v];[2:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0 -y a.mp4

#添加一张图片水印,并设置淡入淡出时间,但是现实的是黑色框
ffmpeg.exe -i aaa.mp4 -i 0.png -filter_complex [1:v]split=4[wm1][wm2][wm3][wm4];[wm1]fade=in:st=1:d=1:alpha=1,fade=out:st=3:d=1:alpha=1[ovr1];[wm2]fade=in:st=2:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[ovr2];[wm3]fade=in:st=3:d=1:alpha=1,fade=out:st=5:d=1:alpha=1[ovr3];[wm4]fade=in:st=4:d=1:alpha=1,fade=out:st=6:d=1:alpha=1[ovr4];[0:v][ovr1]overlay=0:0[base1];[base1][ovr2]overlay=0:0[base2];[base2][ovr3]overlay=0:0[base3];[base3][ovr4]overlay=0:0[out] -map [out] -t 10 -c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4

#给水印图片设置淡入淡出时间(成功设置淡入淡出时间)(单个图片水印)
ffmpeg -i aaa.mp4 -loop 1 -i zz.jpg -filter_complex '[1:v]scale=176:144,fade=in:st=0:d=7:alpha=1,fade=out:st=25:d=6:color=red:alpha=1[logo];[0:v][logo]overlay=x=30:y=30:enable=between=(t\,0\,30):shortest=1' -y a.mp4
分析:
1.淡入淡出滤镜设置为可在Alpha channel 上运行,但是JPEG没有Alpha,因此需要将图像转换为具有Alpha channel 的像素格式
2.如果设置了alpha,则淡入淡出的颜色不起作用
3.图像是无限循环的(参数 -loop的作用),因此当主视频结束时,会添加最短的图像以停止覆盖(参数-shortest的作用)。
4.设置图片的开始显示的时间:图片在视频中消失的时间时间是有enable=between(t,a,b)函数和淡出的时间(开始淡入时间:x,结束淡入时间:m)共同决定的。开始显示的时间是有最大的时间决定 的(a与z),因此a与z的值尽量保持相同
6.设置图片的结束显示的时间:图片在视频中消失的时间时间是有enable=between(t,a,b)函数和淡出的时间(开始淡出时间:y,结束淡出时间:n)共同决定的。 结束显示的时间是与最小的时间决定的(b与n)

# 加多个图片,并设置淡入淡出时间(多个图片水印)
ffmpeg -i aaa.mp4 -loop 1 -i 0.png -loop 1 -i 0.png -filter_complex '[1:v]format=rgba,scale=176:144,fade=in:st=0:d=7:alpha=1,fade=out:st=25:d=2:alpha=1[logo];[2:v]scale=176:144,fade=in:st=0:d=7:alpha=1,fade=out:st=25:d=2:alpha=1[logo2];[0:v][logo]overlay=x=30:y=30:enable=between=(t\,0\,30):shortest=1[rr];[rr][logo2]overlay=x=100:y=30:enable=between=(t\,0\,30):shortest=1' -y a.mp4
分析:
1.如果在多个图片水印中,并没每个图片水印存在重复,则谁后编码(上面命中,谁先执行overlay,谁就先编码),谁在上面,即后面的图片遮挡前面的图片

# 设置水印图片的旋转角度
ffmpeg -i aaa.mp4 -loop 1 -i zz.jpg -filter_complex '[1:v]scale=176:144,fade=in:st=0:d=7:alpha=1,fade=out:st=25:d=2:alpha=1,rotate=-45*PI/180:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo];[0:v][logo]overlay=x=200:y=200:enable=between=(t\,0\,30):shortest=1' -y a.mp4

分析:rotate=-45*PI/180:ow=hypot(iw\,ih):oh=ow:c=0x00000000
1.角度:正的表示顺时针转正多少度,负的表示逆时针旋转多少度
2.长度:旋转后的长度 ow=hypot(iw\,ih):oh=ow。其中hypot(x, y) 计算斜边(直角三角形最长边)等效于sqrt(xx + yy),如果不设置ow,oh则旋转之后溢出边框部分之间被裁剪掉了
3.图片旋转后的填充色,c=0x00000000,表示将其设为透明色,但是有些也说c=none也可以设置为透明色,但是经过测试c=0x00000000,效果更好
4.PI就是π,等于180度,因此(-45*PI/180)等价(-45)
5.如果将(-45*PI/180)写成(-45*PI/180*t),则表示每秒逆时针旋转45度
6.当图片随着时间旋转时,如果不添加format=rgba 参数,则旋转的效果肯能会存在锯齿
7.转速与角度的关系:如果转速为n=180 r/s

#设置gif图片水印
ffmpeg -i aaa.mp4 -ignore_loop 0 -i gif.gif -filter_complex '[1:v]format=rgba,scale=176:144,fade=in:st=0:d=7:alpha=1,fade=out:st=25:d=2:alpha=1,rotate=-45*PI/180*t:ow=hypot(iw\,ih):oh=ow:c=0x00000000[logo];[0:v][logo]overlay=x=20:y=20:enable=between=(t\,0\,30):shortest=1' -y a.mp4

分析:gif图片水印需要注意的是
1.想要gif一直动,则不能使用 -loop 1,要使用-ignore_loop 0


==================================================提取视频中的音频与画面================================================================================

 

posted @ 2021-06-29 19:56  千严-Jonty  阅读(919)  评论(0编辑  收藏  举报