TAG_ID3(来自低音 2.4.4)无法正常工作

TAG_ID3 (from Bass 2.4.4) doesn't work properly

本文关键字:常工作 工作 ID3 TAG      更新时间:2023-10-16

我正在尝试使用"BASS.dll"(通过bass.lib和bass.h(从mp3文件中读取ID3v1标签。
它可以正常工作.mp3直到文件的标题(或艺术家(有 30 个字符。
相反Happy Times (Feat. Margaux BosHappy Times (Feat. Margaux BosEmigrate添加了
Emigrate(这是艺术家标签(。

如何在不添加艺术家标签的情况下使其正常工作?
这是我的源代码:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "bass.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
BASS_Init(-1, 44000, 0, 0, 0);
if(OpenDialog1->Execute())
{
HSTREAM stream = BASS_StreamCreateFile(false, OpenDialog1->FileName.c_str(), 0, 0, 0);
TAG_ID3 *tags = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);
Edit1->Text = tags->title;
}
}

TAG_ID3结构的文本字段不保证以 null 结尾,但您的代码将它们视为 null 终止,因此当不存在 null 终止符时,它最终会读入下一个字段。 要解决此问题,您必须考虑它们的最大长度,例如:

Edit1->Text = AnsiString().sprintf("%.*s", sizeof(tags->title), tags->title);

或:

Edit1->Text = AnsiString(tags->title, sizeof(tags->title)).TrimRight();

与所有其他文本字段相同:

  • id: 3 个字符
  • title: 30 字符
  • artist: 30 字符
  • album: 30 字符
  • year: 4 个字符
  • comment: 30 字符

您可以使用简单的模板包装器来帮助您:

template<size_t N>
String toString(char (&arr)[N])
{
return AnsiString().sprintf("%.*s", N, arr); 
/* or:
return AnsiString(arr, N).TrimRight();
*/
}
Edit1->Text = toString(tags->title);

请注意,comment字段还有一个需要注意的注意事项:

如果第 30 个字符为非 null,

而第 29 个字符为 null,则第 30 个字符是曲目编号,注释仅限于前 28 个字符。