关键字:ffmpeg 音视频 音频视频

截取

提取视频中的音频(-vn表示no video,-c:a 是codec of audio的意思,copy是直接拷贝视频中的原始的音频,这里不会涉及音频的编解码,速度会很快。)
ffmpeg -i input.mp4 -vn -c:a copy output.aac

导出mp3格式的音频(-c:a mp3)
ffmpeg -i input.mp4 -vn -c:a mp3 output.mp3

删除视频中的音频:(-an表示no audio)
ffmpeg -i input.mp4 -an -c:v copy output.mp4

从第00:01秒开始截取到最后
ffmpeg -ss 00:01 -i input.mp4 -c:v copy -c:a copy output.mp4

从第00:01秒开始截取31秒
ffmpeg -ss 00:01 -i input.mp4 -t 31 -c:v copy -c:a copy output.mp4

从第00:00秒开始截取到14:33
ffmpeg -ss 00:00 -i output.mp4 -to 14:33 -c:v copy -c:a copy output2.mp4

从第00:01秒开始截取到最后
ffmpeg -ss 00:00:01 -i input.mp3 -c:a copy output.mp3

批处理
for /r %i in (*.mov) do ffmpeg -i %i -an -c:v copy %i.mp4

合并

合并ts

ffmpeg -i "concat:0001.ts|0002.ts|0003.ts" -c copy output.mp4

合并mp4

现有a1.mp4,a2.mp4,a3.mp4,想合并成一个a_all.mp4。

创建source_list.txt,内容是

file 'a1.mp4'
file 'a2.mp4'
file 'a3.mp4'

然后使用ffmpeg -f concat -i source_list.txt -c copy a_all.mp4

合并字幕和mp4

merge ass and mp4:

ffmpeg -i input.mp4 -vf ass=abcd.ass -f mp4 output.mp4

ffmpeg -i input.mp4 -vf ass=abcd.ass -f mp4 -vcodec libx264 -crf 2 -y output.mp4

合并音频与视频:

不指定时间(即在第1秒)

ffmpeg.exe -i p1.mp4 -i sound.ogg -vcodec copy -acodec copy p1_with_sound.mp4

指定时间

ffmpeg -i p1.mp4 -i sound.ogg -filter_complex "[1]adelay=5000|5000[a]" -map 0:v:0 -map "[a]" -c:v copy -c:a aac -strict experimental -y output_video.mp4

上面的命令是,不改变p1.mp4时把sound.ogg插入到第5秒(5000毫秒)处播放。

把一个新音频合并到视频(已有音频)中

ffmpeg -i video.mp4 -i new_audio.mp3 -filter_complex "[1:a]adelay=5000|5000[newaud];[0:a][newaud]amix=inputs=2[newmix]" -map 0:v  -map "[newmix]"  -ac 1 -c:v copy -c:a aac -y output_video.mp4

个人理解:[1:a]adelay=5000|5000[newaud]是将第2个音频延迟5秒播放并命名为newaud,[0:a][newaud]amix=inputs=2[newmix]是第一个视频的音频和newaud合并成一个,并命名为newmix,-map "[newmix]"是使用newmix作为输出。

添加水印

图片水印

Adding Watermark at the Bottom-Right Corner

ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" -c:v copy -c:a copy -y p1-with-watermark-image.mp4

this command will decrease video frame rates.

Explanation:

W and H represent the width and height of the video, respectively.
w and h represent the width and height of the watermark image, respectively.
W-w-10 positions the watermark 10 pixels from the right edge.
H-h-10 positions the watermark 10 pixels from the bottom edge.
You can find the original frame rate of the video by running:
Look for the `fps` value in the output, find fps

ffmpeg -i p1.mp4

-c:v libx264 -r 30
# command:
ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=x=W-w-10:y=H-h-10" -c:a copy -c:v libx264 -crf 2  -b:v originalBitrate -r originalFPS -y p1-with-watermark-image.mp4

# example:
ffmpeg -i p1.mp4 -i watermark.png -filter_complex "overlay=x=W-w-10:y=H-h-10" -c:a copy -c:v libx264   -crf 2  -b:v 793k  -r 30 -y p1-with-watermark-image-crf.mp4

video quality is higher when crf is small.

指定时间显示水印:
下面的命令在第2秒~第10秒显示水印

ffmpeg -i p1.mp4 -stream_loop -1 -i click.gif -filter_complex "[0:v][1:v] overlay=x=W-w-90:y=H-h-30:enable='between(t,2,10)':shortest=1" -c:a copy -c:v libx264 -crf 2 -b:v 793k -r 30 -y p1-with-gif-with-duration3.mp4

添加文字水印

# loss fps
ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x=W-text_w-10:y=10:fontsize=36:fontcolor=black@0.5:boxborderw=5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy   -y p1-with-watermark-text.mp4

# more higher quality
ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x=W-text_w-10:y=10:fontsize=36:fontcolor=black@0.5:boxborderw=5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy  -c:v libx264   -crf 2  -b:v 793k  -r 30  -y p1-with-watermark-text.mp4
`box=1` will give watermark text a background.

# 横向跑马灯效果
ffmpeg -i p1.mp4 -filter_complex "drawtext=text='Watermark':fontfile=msyh.ttc:x='if(gte(t,1),mod(t*100, W+tw)-tw, NAN)':y=10:fontsize=36:fontcolor=black@0.5:box=1:boxcolor=black@0.4:shadowcolor=black" -c:a copy  -c:v libx264   -crf 2  -b:v 793k  -r 30  -y p1-with-watermark-text-横向跑马灯效果.mp4
`x='if(gte(t,1),mod(t*100, W+tw)-tw, NAN)': This expression moves the text horizontally across the screen starting at 1 second. mod(t*100, W+tw)-tw ensures the text moves from left to right and loops around.`

Copy 微软雅黑字体(msyh.ttc) to current directory.
I use c:/windows/font/msyh.ttc, but it does not work.

转换

aac转mp3

ffmpeg -i input.aac -acodec libmp3lame input.mp3

音频处理

音频拼接

ffmpeg -i "concat:test.mp3|radio.mp3" -acodec copy output.mp3

将多个MP3按顺序拼接生成一个mp3

补白

手动生成一条10秒长的空白音频

ffmpeg -f lavfi -t 10 -i anullsrc test.mp3 -y

添加转场

ffmpeg -i p1.mp4 -i p2.mp4 -filter_complex xfade=transition=rectcrop:duration=2s:offset=8s -y output_3.mp4

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex xfade=transition=rectcrop:duration=1:offset=5 -y 3.mp4

duration 持续时间 (设置交叉淡出持续时间,以秒为单位。默认为1秒)

offset 偏移量 (设置交叉淡入开始相对于第一个输入流的秒。默认偏移量为0)

transition 过渡效果

custom | fade | wipeleft | wiperight | wipeup | wipedown | slideleft | slideright | slideup | slidedown | circlecrop | rectcrop | distance | fadeblack | fadewhite | radial | smoothleft | smoothright | smoothup | smoothdown | circleopen | circleclose | vertopen | vertclose | horzopen | horzclose | dissolve | pixelize | diagtl | diagtr | diagbl | diagbr | hlslice | hrslice | vuslice | vdslice | hblur | fadegrays | wipetl | wipetr | wipebl | wipebr | squeezeh | squeezev | zoomin

图片转视频

单张图片转视频

ffmpeg -r 25 -f image2 -loop 1 -i input2.jpg -vcodec libx264 -pix_fmt yuv420p -s 732x1200 -r 25 -t 10 -crf 2 -y output_3_png.mp4

这里需要注意-r 25 参数的位置,在-i input2.jpg前面和在后面的效果是不一样的。放在-i后面只会改变输出的视频帧率,而输入的还是默认值25。所以需要两次

多张图片转视频

ffmpeg -framerate 0.33 -f image2 -loop 1 -i images/a_%2d.jpeg -vcodec libx264 -pix_fmt yuv420p -s 1080*1920 -r 25 -t 30 -y output_images2mp4_1.mp4

-r 25  帧率,表示每秒播放帧数,默认帧率为25,也就是1秒钟拼接25张图片,我们可以通过调整帧率的大小来控制最终生成视频的时长。
-framerate 0.33  每秒播放图片张数,算法:round(1 / (视频总时长 / 图片总张数), 2)
-f image2  输入流文件格式
-loop 1  输入流循环次数,仅对图片有效,0表示无限循环
-i fps_%d.jpg  文件名,%d、%2d表示匹配数字序列
-vcodec libx264  视频编码,缺少时h5中可能无法播放
-pix_fmt yuv420p  视频格式,缺少时h5中可能无法播放
-s 1080*1920  视频分辨率,生成的视频最终尺寸
-t 30  视频总时长,以秒为单位
-y fps.mp4  覆盖视频文件

视频画中画

https://www.nxrte.com/jishu/8456.html

# 1. 创建主画面视频素材
ffmpeg -f lavfi -i testsrc2=s=800x480 -vcodec libx264 -t 10 input1.mp4
# 2. 创建子画面素材
ffmpeg -f lavfi -i testsrc2=s=320x240 -vcodec libx264 -t 5 input2.mp4
# 3. 开始画中画操作
ffmpeg -i input1.mp4 -filter_complex  "movie=input2.mp4[in2];[in2]setpts=PTS+2/TB[out2];[0:v][out2]overlay=x=20:y=120:enable='between(t,2,4)':shortest=1" picture_in_pic.mp4
# 我们解析一下命令行参数:
# 输入的主文件是 input1.mp4
# 输入的子文件是 input2.mp4
# 将子画面的所有的时间戳都加上 2 秒钟的偏移
# 将子画面显示在主画面的 x 坐标为 20,y 坐标为 120 的位置
# 子画面在主画面显示时间段是第 2 秒到第 4 秒之间
# 以主画面和子画面中时长最短的那个视频流长度为结束点(input1.mp4是10秒,input2.mp4是5秒,picture_in_pic.mp4是setpts的2s+shortest的5秒=7秒)shortest=0即是以最长的视频长度为结束点
# 生成的视频有声音,是第二个视频的
ffmpeg -i input1.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=x=W-w-10:y=H-h-30,format=yuv420p[out]" -map "[out]" -map 1:a -c:v libx264 -crf 2 -r 25 -y picture_in_pic_1.mp4
作者:张三  创建时间:2024-12-08 12:18
最后编辑:张三  更新时间:2025-02-22 20:09