在特定秒数之间使用 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没声音)放在一起
- 首先使用 mkvmerge 拆分,所以我不用担心关键帧并获得准确时间
mkvmerge --split timestamps:00:00:45.100 A.MKV -o splitmkm.mkv
- 然后添加条形图(黑色,因为更容易测试):
ffmpeg -i splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill BAR1.MKV
- 合并(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 files
。 drawbox
将音频编解码器从 AC-3 更改为 Vorbis。
现在的程序是:
mkvtoolnix\mkvmerge --split timestamps:00:00:05.100 %1 -o A_splitmkm.mkv
使用 mkvmerge 我当时有一个精确的分割,我不需要学习关键帧。
ffmpeg -i A_splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill:color=red A_BARmkm.MKV
创建栏
ffmpeg -i A_BARmkm.MKV -i A_splitmkm-001.mkv -map 0:v -map 1 -map -1:v -c copy A_BARwithAudio.mkv
使用 drawbox 中更改后的音频重做该步骤
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。
我的计划是在视频后面放一个透明的红色框。这个框应该只出现在第 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没声音)放在一起
- 首先使用 mkvmerge 拆分,所以我不用担心关键帧并获得准确时间
mkvmerge --split timestamps:00:00:45.100 A.MKV -o splitmkm.mkv
- 然后添加条形图(黑色,因为更容易测试):
ffmpeg -i splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill BAR1.MKV
- 合并(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 files
。 drawbox
将音频编解码器从 AC-3 更改为 Vorbis。
现在的程序是:
mkvtoolnix\mkvmerge --split timestamps:00:00:05.100 %1 -o A_splitmkm.mkv
使用 mkvmerge 我当时有一个精确的分割,我不需要学习关键帧。ffmpeg -i A_splitmkm-001.mkv -vf drawbox=0:9*ih/10:iw:ih/10:t=fill:color=red A_BARmkm.MKV
创建栏ffmpeg -i A_BARmkm.MKV -i A_splitmkm-001.mkv -map 0:v -map 1 -map -1:v -c copy A_BARwithAudio.mkv
使用 drawbox 中更改后的音频重做该步骤
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。