ffmpeg - Webm 是否支持封面艺术?
问题描述
我正在将 MP3 转换为 Webm,并且 MP3 文件包含用于封面艺术的视频流。
ffprobe filename.mp3
...
Stream #0:0: Audio: mp3, 22050 Hz, stereo, fltp, 64 kb/s
Stream #0:1: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 300x300, 90k tbr, 90k tbn, 90k tbc (attached pic)
使用ffmpeg
with libopus
codec 转换文件会导致 VP9 视频流无法正常工作。我注意到:
- VLC Player 不显示持续时间,播放时进度条不移动。
- Android 媒体播放器不显示曲目封面的图像。
ffprobe filename.webm
...
Input #0, matroska,webm, from 'webm_bad/B01___01_Matthew_____ENGWEBN2DA.webm':
...
Stream #0:0: Video: vp9 (Profile 1), yuv444p(tv, progressive), 300x300, SAR 1:1 DAR 1:1, 1k tbr, 1k tbn, 1k tbc (default)
如果我尝试使用-vcodec copy
选项,则会收到此错误:
[webm @ 0x7fdddf028e00] Only VP8 or VP9 or AV1 video and Vorbis or Opus audio and WebVTT subtitles are supported for WebM.
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Error initializing output stream 0:1 --
WebM 是否支持封面艺术?如果是这样,我如何使用 ffmpeg(或其他工具)传输 MP3 封面艺术?
解决方案
不,WebM 不支持封面艺术。
从常见问题解答:
WebM 文件结构基于 Matroska 媒体容器。
Matroska 容器中的封面艺术存储在附件中:
Attachment Elements
可用于存储相关的封面艺术,[...]
WebM 容器不支持附件:
附件
网络管理支持 元素名称 描述 不支持 附件 包含附加文件。 不支持 附件文件 一个附件。 不支持 文件描述 附加文件的人性化名称。 不支持 文件名 附加文件的文件名。 不支持 文件MimeType 文件的 MIME 类型。 不支持 文件数据 文件的数据。 不支持 文件 UID 代表文件的唯一 ID,尽可能随机。 不支持 文件推荐 需要附件时轨道/编解码器可以引用的二进制值。 不支持 FileUsedStartTime DivX 字体扩展 不支持 文件使用结束时间 DivX 字体扩展
也许您可以考虑使用不同的容器。Opus 音频流,如 WebM 容器中的音频流,由其他容器支持:
Opus 最初被指定用于封装在Ogg容器中
如果您仍想使用 WebM,另一种方法是创建带有静止图像的视频流和音频流。FFmpeg wiki 在幻灯片页面中涵盖了该主题。将它与解释如何提取 MP3 文件的封面艺术的这个答案结合起来,您可以执行以下操作:
ffmpeg -i filename.mp3 -an -c:v copy cover.jpeg
ffmpeg -loop 1 -i cover.jpeg -i filename.mp3 -c:v libvpx-vp9 -c:a libopus -b:a 64k -shortest filename.webm
64k
是您在 ffprobe 的输出中显示的比特率。
第二个命令的编码可能很慢。FFmpeg wiki 中的Encode/Youtube 页面-framerate 2
显示了一个示例命令,用于使用该选项创建带有静止图像的视频,如下所示:
ffmpeg -loop 1 -framerate 2 -i cover.jpeg -i filename.mp3 -c:v libvpx-vp9 -c:a libopus -b:a 64k -shortest filename.webm
由于某种我不知道的原因,我的 VLC 无法再现最后一个命令的输出视频,并且播放器崩溃。是没有使我的播放器崩溃6
的最小值,所以要小心。-framerate
推荐阅读
- python - 如何从字典列表中提取键
- php - 如何在 MySQL 中使用 ROW_NUMBER 来检查每位员工每天的行数?
- cucumber - 组织黄瓜测试场景和特点
- sql - 在 Oracle SQL 中重新排列值
- python - 移除反应 DiscordBot
- python - 如何将 JSON 响应对象(来自烧瓶的 jsonify)转换为字典以进行处理
- javascript - 如何使用时间指示器创建引导自动隐藏模式?
- windows - 如何使用 shell 脚本获取管道命令的正则表达式匹配?
- docker - 此错误“无法解决(110:操作超时)”的原因可能是什么?
- javascript - 我们可以在不使用 JavaScript 中的 Object.freeze() 的情况下冻结对象吗?