虽然距离第一次总结ffmpeg指令与剪辑视频相关的姿势 (github.com)已经过去了三年,但是依旧是非常业余的水平。仅作个人记录,谨慎参考,表述有问题的地方欢迎讨论指正。
视频剪切
需求是尽可能无损剪切,精确时间。
根据视频关键帧的情况,分两种方案
极速方案,无损截取出视频两个关键帧之间的片段。
ffmpeg -ss [start_time] -to [end_time] -accurate_seek -i [in_file] -codec copy -avoid_negative_ts 1 -map_metadata -1 [out_file] ## example ffmpeg -ss 00:42:50 -to 00:46:02 -accurate_seek -i input.mp4 -codec copy -avoid_negative_ts 1 -map_metadata -1 output.mp4
注意:start_time,end_time的选取,需要是关键帧时刻之后的时间点。(印象在ffmpeg官方文档力看过这个说明)
PotPlayer中快捷键Ctrl+Shift+←/→,可以跳转前后关键帧;G 显示当前时刻。
如果关键帧所在时刻不符合要求,则无法使用。
慢速方案,对视频重编码进行精确剪切
指令与上一个差不多,但输出编码不使用copy。进行重编码的同时,可以对视频格式、码率进行修改。
(视频格式,应该是要与编码格式进行对应,这个还不太了解)
命令举例如下
ffmpeg -ss [start_time] -to [end_time] -i [in_file] -c:v [libx264] -c:a [aac] -b:v [num] -b:a [num] -strict experimental -map_metadata -1 [out_file] ## example ffmpeg -ss [start] -to [end] -i "ML4th DAY3.mkv" -c:v libx264 -c:a aac -b:v 5M -b:a 320K -strict experimental -map_metadata -1 -y output.mp4
-c:v 是 -vcodec的缩写,指定输出视频编码格式
-c:a 是 -acodec的缩写,指定输出音频编码格式(-codec 就是二者的合体)
-b 指定音视频整体码率,或者分别指定音视频码率
-b:v 视频码率
-b:a 音频码率
注意:在某些情况下这样截切出来的视频时间也不准?原因未知?
查阅可知【链接?】,将输入视频参数放在时间之前,则可以精确剪切。不过这样会更慢。
ffmpeg -i [in_file] -ss [start_time] -to [end_time] -c:v [libx264] -c:a [aac] -strict experimental -map_metadata -1 [out_file]
总之,记得剪完视频后检查开始与结束时间点是否有问题。
字幕压制
同时可以结合上面的一些其他参数,音视频编码格式或码率等
ffmpeg -i output.mp4 -vf "ass=ass_test.ass" result.mp4
ffmpeg -i output.mp4 -vf subtitles=srt_test.srt result.mp4
视频片段合并
准备一个合并列表文件,如filelist.txt。(仅在两个视频编码方式一致的情况下测试过)
file 'ML2nd-day1-1.mp4'
file 'ML2nd-day1-2.mp4'
然后运行
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
增加空白音频片段
生成目标长度的空白音频,参考link
ffmpeg -f lavfi -i anullsrc=channel_layout=2.0:sample_rate=44100 -t 1 silence.m4a
将空白音频与原音频合并
ffmpeg -f concat -i input.txt -codec copy meru_short_sil.m4a
# input.txt file 'silence.m4a' file 'meru_short.m4a'
音视频轨道合并
ffmpeg -i meru2.mp4 -i meru_short_sil.m4a -c:v copy -c:a aac -strict experimental output.mp4
调用硬件加速
需要安装CUDA -hwaccel_device 0
表示调用第0块显卡
示例如下:
ffmpeg -hwaccel cuvid -hwaccel_device 0 -i new.mp4 -c:v h264_nvenc -c:a copy -strict experimental -map_metadata -1 -y new_gpu.mp4
m1 macbook调用硬件加速
ffmpeg -i new.mp4 -c:v hevc_videotoolbox -c:a copy -strict experimental -map_metadata -1 -y new_gpu.mp4
以下久未测试,仅作备份记录
一图流音视频
广播剧 一图流时用的
-r 30
30帧
ffmpeg -r 30 -f image2 -loop 1 -i 0017.png -i drama.wav -s 1280x720 -t 1472 -vcodec libx264 -acodec copy -b:a 1.4M -y drama.mp4
使用其他音轨
-map 0:0 -map 0:3
这个?
ffmpeg -ss 2:38:41 -to 02:43:55 -accurate_seek -i in.mp4 -codec copy -avoid_negative_ts 1 -map 0:0 -map 0:3 -map_metadata -1 -y re_test.mp4
1
1
1
555
555
1
1
1
555
555
1
555