0

我需要以编程方式(使用 python)将缩略图(专辑封面)添加到 mp3(和其他)文件中,并将 ffmpeg 输出保存在内存中(以便能够将结果字节发送到另一个进程)。

请注意'-f', 'mp3', 'pipe:1'最后一个例子。除非您为结果流设置格式,否则 Ffmpeg 会中断使用管道。

我现在拥有的: 1. 这个示例 bash oneliner 按预期工作,使用缩略图制作正确的 mp3 文件(Telegram 播放音频并显示缩略图):

ffmpeg -i qwe.mp3 -i asd.png -acodec copy -map 0 -map 1 -disposition:v:1 attached_pic out.mp3
  1. 此 python 代码执行相同的结果相同:
subprocess.run(['ffmpeg', '-i', 'qwe.mp3', '-i', 'asd.png', '-acodec', 'copy', '-map', '0', '-map', '1', '-disposition:v:1', 'attached_pic', 'out.mp3'])
  1. 但我需要字节,而不是文件系统上的文件,所以我执行以下操作并获取字节。但是,如果我将这些字节保存到文件中,则会导致 mp3 文件损坏。我不能用 Deadbeef 和 Telegram 玩它。
audio_data = subprocess.run(['ffmpeg', '-i', 'qwe.mp3', '-i', 'asd.png', '-acodec', 'copy', '-map', '0', '-map', '1', '-disposition:v:1', 'attached_pic', '-f', 'mp3', 'pipe:1'], stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

len(audio_data.stdout)
2621690  # 2,6 Mbytes, it's ok


with open('out.mp3', 'wb') as f:                                                                                                                                                                                                                                     
    f.write(audio_data.stdout)

最后一个例子给了我一个损坏的 mp3 文件。它不能在 deadbeef 和 Telegram 中播放。

我建议问题出在几个流(-map 参数)或/和-f mp3指令的某个地方(因为我在 mp3 流或类似的东西中有一个图像)。

我尝试设置额外的 id2v3 标签并更改其他选项,但没有运气。这有什么建议吗?

4

0 回答 0