Вопрос

В настоящее время я нахожусь в процессе перемещения приложения 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#.

Любые идеи ценится. Спасибо.

У кого -нибудь есть еще какие -нибудь идеи до того, как заканчивается щедрость?

Это было полезно?

Решение

Привет, есть патч для тагана, который рассчитывает длину в миллисекундах, этот парень добавил метод (LengthMilliseconds ()), который возвращает длину в миллисекундах, возможно, это может быть полезно для вас:http://web.archiveorange.com/archive/v/sf3pjr01lsqjsqjrac7l

Другие советы

Многое изменилось в анализе аудиофайлов TAGLIB#, так как он был изначально перенесен, поэтому трудно сказать, где именно произойдет разница. Вы можете проверить свою программу C ++ на наличие сообщений отладки.

Я предполагаю, что разница в том, как две библиотеки реагируют на недействительные заголовки. Похоже, что если первый заголовок кадра он обнаружил, является недействительным, Taglib не будет рассчитать любые значения аудио свойства. Taglib #, с другой стороны, ищет первый действительный заголовок в первом 16kib аудиочастотной части файла. Если первый заголовок, который он встречается поврежден, он будет сканировать на следующий. Если я правильно помню, неправильно сохраненный тег ID3V2 может привести к появлению 0xFF FF FF FF в начале аудио раздела файла. Это вызвало бы тип сбоя, описанного выше.

Проблема в строке 166 TAGLIB / MPEG / MPEGPROPERTIES.CPP. Это может быть решено, используя тот же подход, что и линии 171-191, но вы захотите обновить код, чтобы сдаться после того, как точка в случае, если это действительно не MP3 файл.

Начиная с этой стороны, Taglib 1.11 Beta 2 изначально поддерживает получение длины аудио в миллисекундах. Вы можете сделать это со следующим кодом:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top