我正在尝试将视频文件切成更小的块。 (每一个都是视频中说的一个词,所以它们的大小并不相同)
我尝试了很多不同的方法来尽可能提高效率,但我无法使运行时间低于原始视频长度的 2/3。这是一个问题,因为我正在尝试处理 400 多个小时的视频。
有没有更有效的方法来做到这一点?或者我注定要运行几周?
这是迄今为止我最好的尝试的命令
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -ss start_timestamp -t to_timestamp -i file_name -vf "fps=30,scale_cuda=1280:720" -c:v h264_nvenc -y output_file
注意运行代码的机器有4090 然后通过 python 执行该命令,这为 for 循环中的每个较小的剪辑提供了正确的时间戳和文件路径
我认为每次调用新进程都会浪费大量时间,但是我无法使用分割过滤器获得更好的结果;但这是该尝试的 ffmpeg-python 代码:
创建流:
inp = (
ffmpeg
.input(file_name, hwaccel="cuda", hwaccel_output_format="cuda")
.filter("fps",fps=30)
.filter('scale_cuda', '1280','720')
.filter_multi_output('split')
)
然后在 for 循环中调用
(
ffmpeg
.filter(inp, 'trim', start=row[1]['start'], end=row[1]['end'])
.filter('setpts', 'PTS-STARTPTS')
.output(output_file,vcodec='h264_nvenc')
.run()
)
运行 ffmpeg 之前你知道所有的修剪吗?如果是这样,我最好的选择是使用带有分割过滤器的复杂过滤器图和并行的一堆修剪设置过滤器链,以在单次 FFmpeg 运行中生成多个输出。
这将消除每次生成新的 FFmpeg 子进程和每次查找视频的时间。此外,FFmpeg 可以利用更多线程。话虽这么说,请记住最可能的瓶颈是存储访问。因此,这可能是您未达到绩效目标的原因。
输出为null时,处理文件从头到尾需要多长时间?如果这没有运行 < 2/3 duration, no optimization will help. Also, just out of curiosity, have you benchmarked CPU/GPU filtering approaches to see which one is faster by how much?