在特定秒数之间使用 ffmpeg 创建抽屉(无需重新编码整个视频 - 更快)

Create drawbox with ffmpeg between specific seconds (without reencoding whole video - faster)

我的计划是在视频后面放一个透明的红色框。这个框应该只出现在第 1-45 秒。 但是如果是3个小时的视频,虽然只需要45秒,但是处理时间会很长。

我第一次尝试的时间太长了:

ffmpeg -i %1 -vf drawbox=0:9*ih/10:iw:ih/10:t=fill:color=red@0.5:enable='between(t,1,45)' "%~dp0transpred\%~n1%~x1

然后我试着把视频分成两部分。把盒子放在第一个视频上,然后再把两个放回去。

ffmpeg -ss 00:00:00.0000 -i %1 -to 00:00:45.0000 -vf drawbox=0:9*ih/10:iw:ih/10:t=fill:color=red@0.5:enable='between(t,1,45)' "%~dp0transpred\%~n1A%~x1"

FFMpeg -ss 00:00:45.0000 -i %1 -c:v copy -c:a copy -avoid_negative_ts make_zero "%~dp0transpred\%~n1B%~x1"

但我什至不必尝试将这两个放在一起,因为它们在第二个时并没有完全分开。我读到这是由于“时间戳”和不同的视频和音频流造成的。

现在我正在尝试一种方法来创建带有栏的流,然后将其与完成的视频叠加。我还没有完全做到这一点,我不知道它是否更快。 剪短视频非常快

编辑(添加为稍后评论的替换)

感谢您的帮助,我几乎已经用稍微不同的方法完成了。不幸的是,第二部分现在总是没有声音。不管我把A和B(B没声音)还是B和A(A没声音)放在一起

  1. 首先使用 mkvmerge 拆分,所以我不用担心关键帧并获得准确时间 mkvmerge --split timestamps:00:00:45.100 A.MKV -o splitmkm.mkv
  2. 然后添加条形图(黑色,因为更容易测试): ffmpeg -i splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill BAR1.MKV
  3. 合并(mkvmerge 以错误结束): ffmpeg -safe 0 -f concat -i list.txt -c copy output1.mkv

编辑(对 kesh 的回答)

这是错误 Again, audio codec config's must match across all your concat filesdrawbox 将音频编解码器从 AC-3 更改为 Vorbis。

现在的程序是:

  1. mkvtoolnix\mkvmerge --split timestamps:00:00:05.100 %1 -o A_splitmkm.mkv 使用 mkvmerge 我当时有一个精确的分割,我不需要学习关键帧。
  2. ffmpeg -i A_splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill:color=red A_BARmkm.MKV 创建栏
  3. ffmpeg -i A_BARmkm.MKV -i A_splitmkm-001.mkv -map 0:v -map 1 -map -1:v -c copy A_BARwithAudio.mkv 使用 drawbox
  4. 中更改后的音频重做该步骤
  5. ffmpeg -safe 0 -f concat -i list.txt -map 0 -c copy A_output1.mkv合并

现在一切正常。 非常感谢!

看看这是否适合你:

ffmpeg  -ss 00:00:00.0000 -to 00:00:45.0000 -i %1 \
        -vf "color=c=red:r=1:d=1[red];color=c=0x808080:r=1:d=1,format=y8,[red]alphamerge[fore]; \
            [fore][0:v]scale2ref=w=iw:h=ih/10[f][b]; \
            [b][f]overlay=0:H-h:enable='between(t,1,45)'" \
        "%~dp0transpred\%~n1A%~x1"
  • color=c=red行:形成一个未调整大小的红色semi-transparent框,持续1帧超过1秒
  • [fore][back]scale2ref行:将红色框的大小调整到框架
  • [b][f]overlay行:需要时应用红框

因为stream前景流(以[f]结尾)只持续1帧,ffmpeg只会计算一次box,而overlay过滤器会重用那个帧直到所有输入视频处理帧。

drawbox。因为你需要一个填充框,所以上面是更简单的 IMO 实现。如果您需要边界,我面临的问题是它与透明框架不兼容。此限制使其无法与预成型方法一起使用。 [编辑:要使 drawbox 使用透明框架,您需要设置选项 replace=1]

在您的替代拼接方法中,如果您在关键帧处剪切视频,您应该能够使其正常工作。要找到关键帧,您需要使用 ffprobe。如果你想继续这个,请参阅 my recent answer to another question