C++ 使用TagLib写入ID3v2元数据

C++ 使用TagLib写入ID3v2元数据,c++,mp3,metadata,taglib,C++,Mp3,Metadata,Taglib,我正在写一部音乐开膛手,已经写了好几天了。除了设置元数据外,其他一切都正常工作。我正在下载原始PCM数据,使用ffmpeg.exe将其编码为MP3,然后将元数据设置为文件。我知道ffmpeg.exe可以写入元数据,但它不适合我的需要,因为在命令行中指定元数据时我无法写入字符(“)。此外,ffmpeg.exe将我的数据最多剪切到30个字符,这也是我在使用TagLib时的问题: TagLib::FileRef f("some_mp3.mp3"); f.tag()->setArtist("Lo

我正在写一部音乐开膛手,已经写了好几天了。除了设置元数据外,其他一切都正常工作。我正在下载原始PCM数据,使用ffmpeg.exe将其编码为MP3,然后将元数据设置为文件。我知道ffmpeg.exe可以写入元数据,但它不适合我的需要,因为在命令行中指定元数据时我无法写入字符(“)。此外,ffmpeg.exe将我的数据最多剪切到30个字符,这也是我在使用TagLib时的问题:

TagLib::FileRef f("some_mp3.mp3");

f.tag()->setArtist("Loooooooooooooooooooooooooooooooooooong Artist");
f.tag()->setAlbum("Loooooooooooooooooooooooooooooooooooong Album");
f.tag()->setTitle("Loooooooooooooooooooooooooooooooooooong Title");
f.tag()->setTrack(37);

f.save();

似乎这段代码使用的是ID3v1,因为它将长字符串裁剪为仅30个字符,是的,我读过一些维基百科:p我需要它来使用ID3v2来提供长数据。有什么想法吗?

您可以使用TagLib::MPEG::File类来打开文件,使用ID3v2Tag来获得ID3v2标记。 您的代码将变为:

  TagLib::MPEG::File f("some_mp3.mp3");
  f.ID3v2Tag()->setArtist("Loooooooooooooooooooooooooooooooooooong Artist");
  f.ID3v2Tag()->setAlbum("Loooooooooooooooooooooooooooooooooooong Album");
  f.ID3v2Tag()->setTitle("Loooooooooooooooooooooooooooooooooooong Title");
  f.ID3v2Tag()->setTrack(37);
  f.save();

希望这有帮助,因为我从ffmpeg文档中了解到ffmpeg.exe使用lame编解码器。因此,您可能想检查如何配置lame而不是ffmpeg。lame有ID3标记的选项,请查看他们的主页:

仍然将字符串剪切为30个字符。任何其他能够设置这四种元数据的库如果没有其他解决方案,长字符串也适用于我:)我刚刚发现这两个代码似乎都存储了整个字符串,而Windows资源管理器和我的MP3播放器只显示前30个字符。如果我使用Windows资源管理器设置元数据,它会在我的MP3播放器上显示完整长度,当然也会在Windows中显示。因此我想这样做e与代码中的相同。Ahh,“Windows资源管理器和Windows Media Player无法在任何版本(包括Windows 7/Windows Media Player 12)中处理ID3v2版本2.4标记。[5]Windows可以理解ID3v2版本(包括2.3版)“看来我需要特别的ID3v2.3,对……编码很好,我只需要设置元数据。在我的情况下,这可以是一个单独的通行证。我目前正在寻找ID3lib,在那里我可以设置长文本值,但我在设置UTF-8文本时遇到问题。