TAG_ID3(来自低音 2.4.4)无法正常工作
TAG_ID3 (from Bass 2.4.4) doesn't work properly
我正在尝试使用"BASS.dll"(通过bass.lib和bass.h(从mp3文件中读取ID3v1标签。
它可以正常工作.mp3直到文件的标题(或艺术家(有 30 个字符。
相反Happy Times (Feat. Margaux Bos
我Happy 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
字段还有一个需要注意的注意事项:
而第 29 个字符为 null,则第 30 个字符是曲目编号,注释仅限于前 28 个字符。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程