将 ffmpeg 与 python 一起使用,在找到 END 元素之前输入缓冲区已耗尽

Kon*_*tin 7 python subprocess ffmpeg

当我从命令行运行它时一切都很好

ffmpeg -i input.mp4 -f mp3 -ab 320000 -vn output.mp3 
Run Code Online (Sandbox Code Playgroud)

但是当我从 python 调用相同的

subprocess.call(['ffmpeg', '-i', 'input.mp4', '-f', 'mp3', '-ab', '320000', '-vn', 'output.mp3'])
Run Code Online (Sandbox Code Playgroud)

几秒钟转换后,我收到此错误

[aac @ 0x7fb3d803e000] decode_band_types: Input buffer exhausted before 
END element found
Error while decoding stream #0:1: Invalid data found when processing 
input
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb3d8000000] stream 1, offset 0x80011d: 
partial file
input.mp4: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 2

您需要添加-dn&-ignore_unknown-sn选项(如果字幕导致编码失败)。

-dn指没有数据编码。

-sn指的是无字幕编码

-ignore_unknown指忽略未知流(SCTE 35, 128数据)

无论输入流如何,-dn -sn&-ignore_unknown选项都将起作用。

那会解决你的问题。

如果您想保留数据、字幕流,还有其他选择。

-c:d copy指的是复制数据流。

-c:s copy指复制字幕流。

您可以使用-copy_unknown选项将未知流添加到输出中。

您的最终代码如下所示。

subprocess.call(['ffmpeg', '-i', 'input.mp4', '-f', 'mp3', '-ab', '320000', '-vn', '-sn', '-dn', '-ignore_unknown', 'output.mp3'])
Run Code Online (Sandbox Code Playgroud)

注意:-copy_unknown该选项仅适用于 ffmpeg 4.x 或更高版本。