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

问题描述 投票:0回答:3

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

ffmpeg -i input.mp4 -f mp3 -ab 320000 -vn output.mp3 

但是当我从 python 中调用相同的方法时

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

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

[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

有什么想法吗?

python ffmpeg subprocess
3个回答
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'])

注意:

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


1
投票

注意 - 此错误不是 ffmpeg 定义的致命错误,这意味着您可以在代码中捕获错误,并且转换将继续,并且 mp4 将可以播放。它将丢失“失败”信息,但很可能这对用户来说是不可见的。


0
投票

我正在将 hls 的 .ts 转码为多比特率,但出现以下错误,导致冻结和音频抖动。我的命令是

ffmpeg -i /mnt/hls/x9k3/seg587.ts -r 25 -g 50 -c:v libx264 -preset Medium -b:v 1500000 -minrate 1500000 -maxrate 1500000 -bufsize 3000000 -s 640x360 -copyts -f mpegts /mnt/hls/x9k3/mystream/360_seg587.ts -c:v libx264 -preset Medium -b:v 2500000 -minrate 2500000 -maxrate 2500000 -bufsize 5000000 -s 1280x720 -copyts -f mpegts /mnt/hls/x9k3/mystream /720_seg587.ts -c:v libx264 -preset Medium -b:v 4000000 -minrate 4000000 -maxrate 4000000 -bufsize 8000000 -s 1920x1080 -copyts -f mpegts /mnt/hls/x9k3/mystream/1080_seg587.ts

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.