我正在寻找一个在linux上运行的命令行视频工具,它是可编写脚本的,它可以提供一个带有马赛克视频的输出视频。问题是,马赛克视频必须在输出内部发生变化。想象一个 4*4 的马赛克视频,但输入视频比 16 多,因此例如每 10 秒我必须将马赛克中的一个图块更改为另一个视频。
我找到了可以生成马赛克输出的命令行 VLC 工具和 avisynth,但正如我所见,它们不支持上述不断变化的视频。
有人知道其他选择吗?
提前致谢!
我正在寻找一个在linux上运行的命令行视频工具,它是可编写脚本的,它可以提供一个带有马赛克视频的输出视频。问题是,马赛克视频必须在输出内部发生变化。想象一个 4*4 的马赛克视频,但输入视频比 16 多,因此例如每 10 秒我必须将马赛克中的一个图块更改为另一个视频。
我找到了可以生成马赛克输出的命令行 VLC 工具和 avisynth,但正如我所见,它们不支持上述不断变化的视频。
有人知道其他选择吗?
提前致谢!
AviSynth 可以加入视频,因此您可以随时在脚本中更改视频源。
例如,在以下示例中,四个输入的左上角视频将在 6 秒后变为不同的视频:
v11 = AviSource("SomeSampleVideo.avi", false). \
Crop(0, 0, 320, 240).AssumeFPS(25).ConvertToRGB32.Trim(0, 150).FadeOut(25, $FF0000)
v12 = AviSource("AnotherSampleVideo.avi", false). \
Crop(40, 10, 320, 240).AssumeFPS(25).ConvertToRGB32.FadeIn(25, $FF0000)
v1 = v11 + v12
v2 = ImageReader("SomeSampleBitmap.bmp").Crop(20, 10, 320, 240).ConvertToRGB32
v3 = AviSource("YetAnotherVideo.avi", false).Crop(30, 30, 320, 240).ConvertToRGB32
v4 = v1.Subtract(v2)
return StackVertical(StackHorizontal(v1, v2), StackHorizontal(v3, v4))
不过,我可能误解了要求..
一种解决方法可能是通过 VLC 生成的 UDP 流运行您的视频,例如:
vlc -vvv $YOUR_INPUT_VIDEO_AS_A_VARIABLE --sout='#transcode{vcodec=h264, vb=768, fps=25.0, width=1920, height=1080, scale=1, acodec=aac, ab=128, samplerate=32000}:standard{access=udp, mux=ts, dst=239.0.0.1}'
然后将此 udp 流包含在您的 VLC 马赛克中,例如:
setup video1 input udp://@239.0.0.1
后来我想您可以编写一个脚本,该脚本使用一个变量作为新视频的路径($YOUR_INPUT_VIDEO_AS_A_VARIABLE)最终杀死早期的 VLC 实例并使用新视频重新启动它,并将其发送到相同的 udp 地址。在您的情况下,您需要考虑端口,例如将视频 1 发送到 239.0.0.1:1234;视频 2 至 239.0.0.1:1236;视频 3 到 239.0.0.1:1238 - 依此类推。
UDP 不在乎是否没有发送任何内容,所以我猜您将有一小段时间没有播放视频(杀死旧 VLC 实例并流式传输新视频所需的时间)。
同样,这是一种解决方法。所以也许这会有所帮助,否则忘记它。