Различия в длине в TagLib # (C #) и TagLib (C ++) - PullRequest
3 голосов
/ 29 ноября 2010

Я сейчас нахожусь в процессе переноса моего приложения на 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 #.

Любые идеи приветствуются.Спасибо.

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

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

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

3 голосов
/ 24 июля 2011

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

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

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

1 голос
/ 16 ноября 2016

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

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
...