测试脚本创建元数据块图片

测试脚本创建元数据块图片

我的系统是 Windows,我使用 Cygwin 来运行 bash 和 shell 文件。检查一个脚本,参见下面的链接,根据其作者的说法,该脚本会创建要附加到 ogg 文件的图像的元数据,但该脚本生成的数据并不完整。

我使用@Gaff 在这里发布的第一个脚本做了一些测试:在 Linux 中通过命令行将专辑封面嵌入 OGG无法正确生成元数据,请参阅以下测试:

元数据根据$EASYTAG脚本变量中定义的选项阻止图片结果。

笔记:

-e当我们运行末尾没有参数的脚本时,$EASYTAG变量将具有值,而当我们运行末尾N带有参数的脚本时,变量将具有值。-e$EASYTAGY

脚本执行命令不带-e结尾:

sh oggart.sh "audio.ogg" "cover.jpg"

使用选项 variable = N 将 ffprobe 输出到音频文件中$EASYTAG,由脚本生成:

[ogg @ 0000023748f0f300] Invalid picture type: -2555936.
[ogg @ 0000023748f0f300] Could not read mimetype from an attached picture.
Input #0, ogg, from 'audio.ogg':
  Duration: 00:03:26.60, start: 0.000000, bitrate: 402 kb/s
  Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 320 kb/s
    Metadata:
      encoder         : Lavc59.12.100 libvorbis
      album           : CMG Clássicos Pop Rock Nacionais
      artist          : Lobão
      date            : 1988
      genre           : Clássico Pop Rock Nacional
      TKEY            : E m
      title           : Cuidado!

脚本执行命令以-e结尾:

sh oggart.sh "audio.ogg" "cover.jpg" -e

使用选项 variable = Y 将 ffprobe 输出到音频文件中$EASYTAG,由脚本生成:

Input #0, ogg, from 'audio.ogg':
  Duration: 00:03:26.60, start: 0.000000, bitrate: 402 kb/s
  Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 320 kb/s
    Metadata:
      encoder         : Lavc59.12.100 libvorbis
      album           : CMG Clássicos Pop Rock Nacionais
      artist          : Lobão
      date            : 1988
      genre           : Clássico Pop Rock Nacional
      TKEY            : E m
      title           : Cuidado!
      COVERART        : /9j/4AAQSkZJRgABAQEASABIAAD/4ROiRXhpZgAASUkqAAgAAAACADIBAgAUAAAAJ
                        gAAAGmHBAABAAAAOgAAAEAAAAAyMDE5OjEwOjE4IDEzOjU4OjU5AAAAAAAAAAMAAw
                        EEAAEAAAAGAAAAAQIEAAEAAABqAAAAAgIEAAEAAAAwEwAAAAAAAP/Y/+AAEEpGSUY
                        AAQEAAAEAAQAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBg

在 $EASYTAG = N 中显示:

[ogg @ 0000023748f0f300] Invalid picture type: -2555936.
[ogg @ 0000023748f0f300] Could not read mimetype from an attached picture.

在 $EASYTAG = Y 时,不显示错误消息,但在元数据字段中包含不完整数据的 COVERART:

COVERART        : /9j/4AAQSkZJRgABAQEASABIAAD/4ROiRXhpZgAASUkqAAgAAAACADIBAgAUAAAAJ
                  gAAAGmHBAABAAAAOgAAAEAAAAAyMDE5OjEwOjE4IDEzOjU4OjU5AAAAAAAAAAMAAw
                  EEAAEAAAAGAAAAAQIEAAEAAABqAAAAAgIEAAEAAAAwEwAAAAAAAP/Y/+AAEEpGSUY
                  AAQEAAAEAAQAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBg

注意:COVERAT 字段仅显示生成的元数据块图片的前 255 个字符...这种情况可能正是因为数据块中缺少与文件标识相关的信息,即在其标题中,程序在其中识别记录并将其作为封面艺术正确插入文件中。

ogg 元数据块图片结构看起来与 flac 的相同。

脚本正在生成不完整的元数据块图片,似乎缺少元数据标头。请注意以下主要信息 --add padding 中的信息。脚本在生成元数据块图片时似乎没有考虑 4 个字节。

--import-picture-from={FILENAME|SPECIFICATION}  
Import a picture and store it in a PICTURE metadata block. 
See the flac option --picture for an explanation of the SPECIFICATION syntax.

--add-padding=# 
Add a padding block of the given length (in bytes). The overall length of the new 
block will be 4 + length; the extra 4 bytes is for the metadata block header.
  
  Note: Maybe that's the problem with your file not being generated with the header.

--dont-use-padding  
By default metaflac tries to use padding where possible to avoid rewriting the entire 
file if the metadata size changes. Use this option to tell metaflac to not take 
advantage of padding this way.

注意:元数据生成错误的另一种可能性,看这里: https://github.com/taglib/taglib

是否没有 ffmpeg 函数或程序可以正确完成转换以便可以在批处理文件中使用?

@Tom Yan,首先我要感谢你的帖子,因为这正是我多天以来一直在寻找的东西,谢谢!

我按照您的步骤运行 vorbis_ca,但是遇到了一些问题:

步骤1:

我在以下路径创建了一个名为 Vorbis 的文件夹:
C:\Users\CMG\Vorbis

我将 vorbis_ca.c 复制到 Vorbis 文件夹中并编译该文件:
gcc vorbis_ca.c -o vorbis_ca.exe

我把路径改成了我的桌面,也就是图片在我的电脑上的位置:
cd“C:/Users/CMG/Desktop”

我在图像上运行了文件命令:
file cover.jpeg

输出文件命令:

Exif Standard: [TIFF image data, little-endian, direntries=2, datetime=2019:10:18 13:58:59], baseline, 
precision 8, 1018x1023, components 3

第2步:

我运行了 ./vorbis_ca 命令:
$ ./vorbis_ca 1018 1023 cover.jpeg | hexdump -C

输出./vorbis_ca 命令:
-bash: ./vorbis_ca: No such file or directory

所以我尝试了:

"C:/Users/CMG/Vorbis/"./vorbis_ca 1018 1023 cover.jpeg | hexdump -C

输出./vorbis_ca 命令插入完整路径:

00000000  00 00 00 03 00 00 00 09  69 6d 61 67 65 2f 6a 70  |........image/jp|
00000010  67 00 00 00 00 00 00 03  fa 00 00 03 ff 00 00 00  |g...............|
00000020  18 00 00 00 00 00 04 39  24                       |.......9$|
00000029

./vorbis_ca仅当我输入完整路径时才运行。

笔记:

当我编译位于路径中的文件夹中的 vorbis_ca.c 时:C:\Users\CMG\Vorbis我无法在任何位置运行生成的 ./vorbis_ca,如何使 ./vorbis_ca 运行而无需输入完整路径?例如在filecover.jpeg 命令中,我不需要输入它的完整路径即可使其工作。

步骤3:

运行vorbiscomment命令:请注意,我必须在此命令中输入./vorbis_ca 的完整路径。

$ vorbiscomment -w -t "METADATA_BLOCK_PICTURE=$(("C:/Users/CMG/Vorbis/"./vorbis_ca 1018 1023 cover.jpeg; cat cover.jpeg) | base64 -w 0)" "audio_cover.ogg"

输出 vorbiscomment 命令:

-bash: /cygdrive/c/vorbis-tools-master/bin/x64/vorbiscomment: Argument list too long

为什么我运行 vorbiscomment 时会出现上述消息?

还有一个问题:在第 2 步中,我运行了该命令./vorbis_ca 1018 1023 cover.jpeg | hexdump -C,而您的最后一条命令又出现了 ./vorbis_ca 1018 1023 cover.jpeg。该命令需要运行两次,还是您只是作为示例详细展示了它?

也就是说官方命令是最后一个命令,对吗?

答案1

正如我在评论中提到的那样,METADATA_BLOCK_PICTURE预计不会包括只是图像文件。您需要按照以下说明在图像文件中添加一些元数据字节作为前缀规范

以下是一个例子C 程序输出这样的前缀:

$ ./vorbis_ca 
Usage: ./vorbis_ca width height image_file

图像的宽度和高度可以通过例如获取file(请注意,它们位于输出的末尾;不要与混淆density):

$ file test_ca.jpg 
test_ca.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 300x300, segment length 16, comment: "Created with GIMP", progressive, precision 8, 600x600, components 3

用来hexdump -C查看它实际输出的内容(字节):

$ ./vorbis_ca 600 600 test_ca.jpg | hexdump -C
00000000  00 00 00 03 00 00 00 09  69 6d 61 67 65 2f 6a 70  |........image/jp|
00000010  67 00 00 00 00 00 00 02  58 00 00 02 58 00 00 00  |g.......X...X...|
00000020  18 00 00 00 00 00 00 37  e6                       |.......7.|
00000029

(不过,FFmpeg 并不真正关心前缀中的宽度和高度,所以如果您不关心文件的标准一致性/可移植性,那么您也可以对它们都使用 0)

重现您遇到的问题:

$ vorbiscomment -w -t "METADATA_BLOCK_PICTURE=$(cat test_ca.jpg | base64 -w 0)" test.ogg 
$ ffprobe /tmp/test.ogg 
ffprobe version n5.0 Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 11.2.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-shared --enable-version3
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
[ogg @ 0x55910a096700] Invalid picture type: -2555936.
[ogg @ 0x55910a096700] Could not read mimetype from an attached picture.
Input #0, ogg, from '/tmp/test.ogg':
  Duration: 00:00:10.00, start: 0.000000, bitrate: 19 kb/s
  Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 112 kb/s

添加前缀后,问题解决了:

$ vorbiscomment -w -t "METADATA_BLOCK_PICTURE=$((./vorbis_ca 600 600 test_ca.jpg; cat test_ca.jpg) | base64 -w 0)" test.ogg 
$ ffprobe /tmp/test.ogg 
ffprobe version n5.0 Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 11.2.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-shared --enable-version3
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, ogg, from '/tmp/test.ogg':
  Duration: 00:00:10.00, start: 0.000000, bitrate: 19 kb/s
  Stream #0:0: Audio: vorbis, 44100 Hz, stereo, fltp, 112 kb/s
  Stream #0:1: Video: mjpeg (Progressive), yuvj444p(pc, bt470bg/unknown/unknown), 600x600 [SAR 300:300 DAR 1:1], 90k tbr, 90k tbn (attached pic)
    Metadata:
      comment         : Cover (front)
$ 

(请注意,前缀也是经过 base64 编码的)

相关内容