audio - 从 ffmpeg 与专辑封面进行管道传输时,mp3 中的元数据不起作用

标签 audio ffmpeg

在我的程序中,我将 webm 从流传输到 ffmpeg,然后将输出传输到 http 请求。该过程的一部分是为 mp3 添加元数据。到目前为止,这工作得很好。然而,在将图像添加为专辑封面后,它开始表现出意料之外。

首先这是我在程序中使用的命令行:

    val parameters = listOf("ffmpeg",
            "-i", "-",
            "-i", albumImage.absolutePath,
            "-map", "0",
            "-map", "1",
            "-c:v", "copy",
            "-f", "mp3",
            "-id3v2_version", "4",
            "-metadata", "title=${info.title}",
            "-metadata", "album=YouTube",
            "-metadata", "artist=${info.author}",
            "-metadata:s:v", "title=Album Cover",
            "-metadata:s:v", "comment=Cover (front)",
            "-"
    )

它创建了一个有效的 mp3 文件,我可以在 mp3 文件中找到元数据和图像,但是在播放它时,它们都没有显示在 VLC 或其他任何地方。为了测试各种配置,我将其转换为命令行。

在第一次尝试中,我保存了视频和图像并完全停止使用管道,结果如下:
ffmpeg -i video.webm -i image.jpeg -map 0 -map 1 -c:v copy -f mp3 -id3v2_version 4 -metadata title="Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)" -metadata album="YouTube" -metadata artist="Spinnin' Records" -metadata:s:v title="Album Cover" -metadata:s:v comment="Cover (front)" output3.mp3
在这种情况下,包括专辑封面在内的所有元数据都显示在 VLC 中。

然后我重新创建了与我的程序中相同的东西,管道视频输入和音频输出,如下所示:
ffmpeg -i - -i image.jpeg -map 0 -map 1 -c:v copy -f mp3 -id3v2_version 4 -metadata title="Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)" -metadata album="YouTube" -metadata artist="Spinnin' Records" -metadata:s:v title="Album Cover" -metadata:s:v comment="Cover (front)" - < video.webm > output3.mp3
该文件与我的程序输出相同。既不显示标题也不显示专辑和专辑图像(但它可以播放文件)

为了测试更多选项,我对输出文件进行了硬编码,但输入文件如下所示:

ffmpeg -i - -i image.jpeg -map 0 -map 1 -c:v copy -f mp3 -id3v2_version 4 -metadata title="Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)"-metadata album="YouTube"-metadata 艺术家="Spinnin' Records"-metadata:s:v title="专辑封面"-metadata:s:v comment="封面(正面)"output3.mp3 < video.webm

现在元数据又开始工作了。当硬编码输入视频和管道输出时,它又消失了。

总结一下:当管道 ffmpeg 的输出时,文件中的元数据无法正常工作。有趣的是,ffmpeg 的 stderr 输出看起来非常相似

硬编码 output3.mp3:
ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers
Input #0, matroska,webm, from 'pipe:':
  Metadata:
    encoder         : google/video-file
  Duration: 00:03:39.58, start: -0.007000, bitrate: N/A
    Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Input #1, image2, from 'image.jpeg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 1466 kb/s
    Stream #1:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 320x180, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (opus (native) -> mp3 (libmp3lame))
  Stream #1:0 -> #0:1 (copy)
Output #0, mp3, to 'output3.mp3':
  Metadata:
    TPE1            : Spinnin' Records
    TIT2            : Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)
    TALB            : YouTube
    TSSE            : Lavf57.83.100
    Stream #0:0(eng): Audio: mp3 (libmp3lame), 48000 Hz, stereo, fltp (default)
    Metadata:
      encoder         : Lavc57.107.100 libmp3lame
    Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 320x180, q=2-31, 25 tbr, 25 tbn, 25 tbc
    Metadata:
      title           : Album Cover
      comment         : Cover (front)

带管道输出:
ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers
Input #0, matroska,webm, from 'pipe:':
  Metadata:
    encoder         : google/video-file
  Duration: 00:03:39.58, start: -0.007000, bitrate: N/A
    Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)
Input #1, image2, from 'image.jpeg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: 1466 kb/s
    Stream #1:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 320x180, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (opus (native) -> mp3 (libmp3lame))
  Stream #1:0 -> #0:1 (copy)
Output #0, mp3, to 'pipe:':
  Metadata:
    TPE1            : Spinnin' Records
    TIT2            : Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)
    TALB            : YouTube
    TSSE            : Lavf57.83.100
    Stream #0:0(eng): Audio: mp3 (libmp3lame), 48000 Hz, stereo, fltp (default)
    Metadata:
      encoder         : Lavc57.107.100 libmp3lame
    Stream #0:1: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 320x180, q=2-31, 25 tbr, 25 tbn, 25 tbc
    Metadata:
      title           : Album Cover
      comment         : Cover (front)

最佳答案

是的,当 ID3v2 元数据必须分两步写入(例如必须插入图像数据包时)且输出不可搜索时,无法填写 ID3 header 大小。

您仍然可以通过告诉 ffmpeg 不要快速刷新数据来解决这个问题。但是,如果 ffmpeg 的缓冲区超过 256 kB,它将刷新。为 ID3 header 的其他部分留出一点余地,这为您提供了图像最大尺寸的上限。
ffmpeg -i - -i image.jpeg -map 0 -map 1 -c:v copy -f mp3 -id3v2_version 4 -metadata title="Tiësto & KSHMR feat. Vassy - Secrets (Official Music Video)" -metadata album="YouTube" -metadata artist="Spinnin' Records" -metadata:s:v title="Album Cover" -metadata:s:v comment="Cover (front)" -flush_packets 0 - > output3.mp3 < video.webm

关于audio - 从 ffmpeg 与专辑封面进行管道传输时,mp3 中的元数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973987/

相关文章:

python - 这是什么音频数据类型,如何将其转换为wav/l16?

audio - 将复合视频录制到音频文件

streaming - 如何将RTP/H264流写入文件

c# - Console.Beep可以替代Win8 x64吗?

audio - 信号处理: FFT overlap processing resources

audio - 使用 ffmpeg 从视频中提取每个音频和字幕

FFMPEG 添加另一个命令

php - 通过 ffmpeg.exe 创建缩略图

asp.net - 创建 m3u8 并从服务器流式传输

javascript - 如何在 Javascript 中播放相同的音频两次?