Как быстро получить точную длительность любого аудиофайла? - PullRequest
2 голосов
/ 12 марта 2020

Есть много аудио файлов в джокере, закодированных с помощью VBR, которые не имеют точного тега продолжительности, и командная строка FFMpeg выдаст следующее:

Оценка длительности по битрейту, это может быть неточно

(и это действительно так)

Используя libav, мы видим, что это проверено с помощью функции has_duration() из libavformat/utils.c

У меня есть аудиоплеер, который должен получать точную информацию о длительности, используя libav. Я попытался полностью декодировать файл и подсчитать общее количество декодированных семплов, что является обычной рекомендацией (и точной), но это может занять более 10 секунд на 60-минутном аудиофайле, что недопустимо.

Я заметил, что есть некоторые аудиодекодеры с закрытым исходным кодом и приложения для воспроизведения музыки c, которые могут сразу получить точную продолжительность для этих файлов. Должен быть какой-то дешевый способ определения точной продолжительности? Возможно, мне поможет фрагмент или высокоуровневое описание.

1 Ответ

0 голосов
/ 15 марта 2020

Можно очень быстро "демультиплексировать" дорожку и исследовать длительность каждого пакета, чтобы определить общую длительность дорожки, декодирование не требуется.

Простое добавление длительностей в al oop до EOF достигнут:

int read = av_read_frame(pFormatCtx, packet);
durationSeconds = packet->duration * (double) timebase;
...