当前位置: 首页 > 知识库问答 >
问题:

mp3中的元数据不工作时,从ffmpeg管道与专辑艺术

陆弘光
2023-03-14

在我的程序中,我通过管道将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或其他任何地方。为了测试各种配置,我将其转换为命令行。

在第一次尝试中,我保存了视频和图像,并完全停止使用管道,结果是:

在这种情况下,所有元数据包括相册艺术都显示在VLC中。

然后,我重新创建了与我的程序中相同的内容,通过管道传输视频输入和音频输出,如下所示:

ffmpeg-i-i image.jpeg-map 0-map 1-c:v copy-f mp3-id3v2_version 4-元数据title=“tiësto和KSHMR feat.Vassy-Secrets(官方音乐视频)”-元数据album=“YouTube”-元数据artist=“spinnin'记录”-元数据:s:v title=“专辑封面”-元数据:s:v comment=“封面(front)”- 输出3.mp3

此文件与我的程序输出相同。既不显示标题,也不显示相册,也不显示相册图像(但它可以播放文件)

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

ffmpeg-i-i image.jpeg-map 0-map 1-c:v copy-f mp3-id3v2_version 4-元数据title=“tiësto和KSHMR feat.Vassy-Secrets(官方音乐视频)”-元数据album=“YouTube”-元数据artist=“spinnin'记录”-元数据:s:v title=“专辑封面”-元数据:s:v comment=“封面(front)”输出3.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)

共有1个答案

朱伯寅
2023-03-14

是的,当必须分两步写入ID3v2元数据时(例如,必须插入图像包时),ID3报头大小无法填写&输出是不可查询的。

您仍然可以通过告诉ffmpeg不要快速刷新数据来解决这个问题。但是,如果ffmpeg的缓冲区超过256 KB,则ffmpeg将刷新。为ID3标题的其他部分留一点余地,这样就可以为图像的最大大小设置上限。

ffmpeg-i-i image.jpeg-map 0-map 1-c:v copy-f mp3-id3v2_version 4-元数据title=“tiësto和KSHMR feat.vassy-secrets(官方音乐视频)”-元数据album=“YouTube”-元数据artist=“spinnin'记录”-元数据:s:v title=“专辑封面”-元数据:s:v comment=“封面(front)”-flush_packets 0->output3.mp3

 类似资料:
  • 我从安装了这个版本http://ffmpeg.org/releases/ffmpeg-2.5.3.tar.bz2 还尝试了yum版本,但对于youtube-dl来说还不够新。 我尝试了,PHP/Apache仍然找不到ffmpeg。 Apache用户在CentOS 6.5上运行PHP脚本<打电话给我的youtube dl。以根用户身份从php命令行调用php(使用FFmpeg) 调用my youtu

  • 我拥有网站www.goploom。com类似于youtube,允许用户上传和观看视频。上传的视频被转换为mp4格式,以与我们网站的html5视频播放器兼容。我的问题是,虽然FFmpeg成功地从上传的视频生成视频缩略图并将图像存储在适当的目录中,但我的代码的视频转换方面不会产生任何输出。我已经对代码进行了几个小时的调整,但我无法解决这个问题,但是,有人告诉我,我可以使用html、php和ffmpeg

  • 我正在开发一个音乐播放器应用程序。我正在尝试用专辑《歌曲艺术》填充一个。我用下面给出的代码成功地做到了这一点。但有些歌曲没有嵌入唱片集,文件夹中也没有任何唱片集。因此,我试图在将专辑艺术添加到之前检查它是否为空。如果相册艺术为空,应用程序将自动从互联网上获取它。我试着检查相册艺术是否为空,但每次它都会给我一个是否有相册艺术可用。 从Mediastore获取专辑艺术的代码: albumArtUri的

  • 我想执行FFmpeg命令,从应用程序的资产文件夹中的视频中提取MP3格式的音频。有关更多信息,请参阅http://writingminds.github.io/ffmpeg-android-java/ 但是我犯了一个错误。请提出解决方案。 JAVA木卫一。IOException:运行exec()时出错。命令:[/data/data/com.example.bansi_vasundhara.vide

  • 我在控制台上得到这个JS错误: app.js:167未捕获的引用错误:未定义接收器ID 这是我的完整代码: 私家车控制员: PrivateMessageEvent: Bootstrap.js 频道。php 拉威尔回声服务器。json 在后台队列中:work和laravel echo服务器已在运行 触发该事件后,我在laravel echo服务器控制台上收到以下消息: 笔记: > 我成功地收听了公共

  • 我试图设置jenkins管道使用gCloud,但我得到以下错误: /service-account-creds.json警告:无法在 /.config/gcloud/logs中设置日志文件,(错误:无法创建目录[/. config/gCloud/logs/2019.02.07]:权限被拒绝。 守则: Jenkins使用imagen Jenkins/Jenkins在容器中运行