python - 无法使用 ffmpeg 将缩略图图像设置为 mp3 文件,将其输出发送到控制台(ffmpeg 管道:1)
问题描述
我需要以编程方式(使用 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
- 此 python 代码执行相同的结果相同:
subprocess.run(['ffmpeg', '-i', 'qwe.mp3', '-i', 'asd.png', '-acodec', 'copy', '-map', '0', '-map', '1', '-disposition:v:1', 'attached_pic', 'out.mp3'])
- 但我需要字节,而不是文件系统上的文件,所以我执行以下操作并获取字节。但是,如果我将这些字节保存到文件中,则会导致 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 标签并更改其他选项,但没有运气。这有什么建议吗?
解决方案
推荐阅读
- google-apps-script - 当列不为空时自动包含/删除复选框
- java - 如何使用 for 循环打印对象的名称
- node.js - Microsoft bot 未从 Firebase 云功能做出响应
- google-sheets - 加入 importrange 和 Query
- angular - Angular,将选择器存储数据发送到子组件
- python - 当我尝试创建多个分支时,它不断给我一个名称错误
- python - delta_time 如何在 python 街机上工作?
- python - 使用 Flask 将多个按钮单击附加到列表
- php - 在 Wordpress 中对来自外部 API 的数据进行排序
- c# - 不同字符串上的解密错误不一致