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

StackOverflow https://stackoverflow.com/questions/9516818

Вопрос

Я пытаюсь получить продолжительность файла Media с 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 файлов, Track.duration становится 11-12 минут.Я пытался на несколько файлов и эффект всегда одинаково.Что может быть причиной?

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

Решение

You normally use IMediaPosition interface (instead of IMediaSeeking) from the application side. Duration is reported always in seconds. However this is unlikely to make a difference, and what might make it is reading duration from ID3 tags instead, using Windows Media API, ID3 Tag Support.

Are there more reliable ways to get exact duration of media file with DirectShow API?

Windows Media Player plays MP3 files through Media Foundation, a non-DirectShow API, so you don't have an option here to expect or do exactly the same from DirectShow.

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

From the documentation:

Depending on the source format, the duration might not be exact. For example, if the source contains a variable bit-rate (VBR) stream, the method might return an estimated duration.

Are you using a VBR stream, by any chance?

You can try the same on a clean windows installation. It might be possible you have a codec(pack) installed which is buggy.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top