繁体   English   中英

如何在 ffmpeg-python 中使用“最短”参数

[英]How to use the 'shortest' argument with ffmpeg-python

我第一次使用ffmpeg-python 我试图在ffmpeg.output()中使用 shortest shortest=1参数,但是当我使用它时,我的程序不断给我错误。

我想用来自 bar.webm 的音频替换来自foo.mp4的音频,同时保持bar.webm的视觉foo.mp4 我得到了这个工作,但问题是ffmpeg.concat默认情况下会继续播放来自foo.mp4的音频,而来自bar.webm的视觉效果已经停止播放。 根据此 FFmpeg 文档页面,这是预期的行为:“concat 过滤器将使用每个段中最长的 stream 的持续时间(最后一个除外),并在必要时用静音填充较短的音频流。”

我希望 output 视频在视觉停止播放时停止,所以我希望它切断音频,但我无法让它工作。 该页面还指出,我应该能够添加shortest作为参数以获得我想要的结果:“如果设置为 1,则在最短输入终止时强制 output 终止。默认值为 0。” 不过,我无法让它工作。 下面代码块中的第二行包含shortest=1 ,我希望它可以工作,但我得到了这个错误:

[NULL @ 000001d50dfdea80] Unable to find a suitable output format for '1'1: Invalid argument

正如预期的那样,使用shortestfoo反而会给我这个错误:

Unrecognized option 'shortestfoo'. Error splitting the argument list: Option not found

这告诉我shortest的参数是一个可能的参数,但是我分配给它的1值是错误的。 将它设置为None我的程序运行,但音频仍然不会被设置为None被切断,当然。

我应该在这里使用什么shortest的值? 我在评估我只是使用错误的shortest值时是否正确? 非常感谢!

编辑:尝试使用True而不是 1。尝试使用**{'shortest': 1}**{'shortest': True} 这些也没有用。

import ffmpeg

input_video_name = 'foo'
input_video_extension = '.mp4'

input_audio_name = 'bar'
input_audio_extension = '.webm'

input_video = ffmpeg.input('input videos/' + input_video_name + input_video_extension)
input_audio = ffmpeg.input('input audio/'+ input_audio_name + input_audio_extension)

stream = ffmpeg.concat(input_video, input_audio, v=1, a=1)

stream = ffmpeg.output(stream, 'output videos/' + input_video_name + '.mp4', shortest=1)
ffmpeg.run(stream)

找到了答案这个人为我的问题提供了解决方案。 我不知道为什么这确实有效,所以我在原始代码中缺少什么:

video_part = ffmpeg.input('video.mp4')
audio_part = ffmpeg.input('audio.mp3')
(
    ffmpeg
    .output(audio_part.audio, video_part.video, 'output-video.mp4', shortest=None, vcodec='copy')
    .run()

)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM