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. Возможно, у вас установлен кодек (пакет) с ошибками.