我目前正在将我的C#应用程序转移到Qt / C ++。我遇到TagLib的长度问题。我发现奇怪的是TagLib#以毫秒为单位返回音频持续时间,而TagLib以秒为单位返回其(不正确)持续时间。 TagLib只返回零作为长度值,而TagLib#保持正确。
这是我在C#/ TagLib#...
中的来源TagLib.File tagfile = TagLib.File.Create(path);
uint milliseconds = (uint)tagfile.Properties.Duration.TotalMilliseconds;
这就是C ++ / TagLib中应该几乎相同的东西。我甚至强迫它准确阅读。没有成功。
TagLib::FileName fn(path);
TagLib::FileRef fr(fn, true, TagLib::AudioProperties::Accurate);
uint length = fr.audioProperties()->length();
它适用于我的大多数媒体文件。但是,选择的几个音频文件无法返回任何音频属性(标签信息的其余部分读取正常!)。返回完全相同的音频属性,TagLib#没有问题。
任何想法都表示赞赏。感谢。
在赏金结束之前,有没有人有更多想法?
答案 0 :(得分:5)
嗨,有一个taglib的补丁计算长度,以毫秒为单位,这个人添加了一个返回长度的方法(lengthMilliseconds()),以毫秒为单位,这可能对您有用: http://web.archiveorange.com/archive/v/sF3Pjr01lSQjsqjrAC7L
答案 1 :(得分:3)
TagLib#解析音频文件后发生了很多变化,因为它最初被移植过,所以很难说出确切的区别在哪里。您可以检查C ++程序以获取调试消息。
我的猜测是,两个库如何对无效标头做出反应。看来,如果找到的第一个帧头无效,TagLib将不会计算任何音频属性值。另一方面,TagLib#在文件的音频部分的第一个16KiB中查找第一个有效标头。如果它遇到的第一个标题已损坏,它将扫描下一个标题。如果我没记错的话,错误保存的ID3v2标签可能会导致0xFF FF FF FF出现在文件的音频部分的开头。这将触发上述故障类型。
问题出在taglib / mpeg / mpegproperties.cpp的第166行。这可以使用与第171到191行相同的方法来解决,但是如果它真的不是MP3文件,您可能希望更新代码以放弃一个点。
答案 2 :(得分:1)
在撰写本文时,TagLib 1.11 BETA 2本身支持以毫秒为单位获取音频长度。您可以使用以下代码执行此操作:
TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();