DirectShow GetDuration дает неправильное значение продолжительности

Я пытаюсь получить продолжительность медиа-файла с DirectShow. Я использую следующий код (C#):

var seekingParser = filter as IMediaSeeking;
if (seekingParser != null)
{
   long duration;
   if (seekingParser.SetTimeFormat(TimeFormat.MediaTime) == 0
       && seekingParser.GetDuration(out duration) == 0)
       track.Duration = duration / 10000000f;
}

получить длительность медиа-файла в секундах. Тем не менее, когда я пытаюсь открыть 3-4 минуты MP3-файлов, трек. Длительность становится 11-12 минут. Я пробовал несколько файлов, и эффект всегда одинаков. В чем может быть причина?

3 ответа

Решение

Вы обычно используете IMediaPosition интерфейс (вместо IMediaSeeking) со стороны приложения. Продолжительность сообщается всегда в секундах. Однако это вряд ли что-то изменит, и что может повлиять на чтение длительности из тегов ID3, используя Windows Media API, поддержку тегов ID3.

Существуют ли более надежные способы получения точной продолжительности мультимедийного файла с помощью DirectShow API?

Проигрыватель Windows Media воспроизводит файлы MP3 через Media Foundation, API, отличный от DirectShow, поэтому у вас нет возможности ожидать или сделать то же самое с DirectShow.

Из документации:

В зависимости от исходного формата продолжительность может быть не точной. Например, если источник содержит поток с переменным битрейтом (VBR), метод может вернуть приблизительную длительность.

Вы используете поток VBR, случайно?

Вы можете попробовать то же самое на чистой установке Windows. Возможно, у вас установлен кодек (пакет) с ошибками.

Другие вопросы по тегам