Audio 使用唱片集艺术从ffmpeg播放时,mp3中的元数据不起作用

Audio 使用唱片集艺术从ffmpeg播放时,mp3中的元数据不起作用,audio,ffmpeg,Audio,Ffmpeg,在我的程序中,我将一个webm从流传输到ffmpeg,然后将输出传输到http请求。这个过程的一部分是为mp3添加元数据。到目前为止,这项工作效果很好。然而,在将一张图片添加为相册艺术之后,它开始表现出意想不到的行为 首先,这是我在程序中使用的命令行: val parameters = listOf("ffmpeg", "-i", "-", "-i", albumImage.absolutePath, "-map",

在我的程序中,我将一个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(官方音乐视频)”-metadata-album=“YouTube”-metadata-artist=“Spinnin”Records”-metadata:s:v title=“唱片封面”-metadata:s:v comment=“封面(front)”输出3.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(官方音乐视频)”-metadata-album=“YouTube”-metadata-artist=“Spinnin”Records”-metadata:s:v title=“唱片封面”-metadata:s:v comment=“封面(front)”-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(官方音乐视频)”-metadata-album=“YouTube”-metadata-artist=“Spinnin”Records”-metadata:s:v title=“专辑封面”-metadata:s:v comment=“封面(front)”output3.mp3.mp3 现在元数据又开始工作了。当硬编码输入视频和管道输出时,它又消失了

总之,当管道输出ffmpeg时,文件中的元数据不能正常工作。有趣的是,ffmpeg的stderr输出看起来非常相似

硬编码输出3.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标头大小&输出不可查看

通过告诉ffmpeg不要快速刷新数据,您仍然可以在一定程度上解决这个问题。但是,如果ffmpeg的缓冲区超过256 kB,它将刷新。为ID3头的其他部分留一点余量,这样就为图像的最大大小提供了一个上限


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(官方音乐视频)”-metadata-album=“YouTube”-metadata-artist=“Spinnin”Records”-metadata:s:v title=“专辑封面”-metadata:s:v comment=“封面(正面)”-flush_packets 0->output3.mp3

我注意到,在管道传输时,ID3头有一个大小字段,其值为
0
(但元数据在文件中),但在写入文件时,该字段填充了有效值,我不确定这是否是因为ffmpeg会返回并写入它在管道中可能无法写入的值