2012-03-01 2 views
0

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

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; 
} 

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

+0

Mp3-файлы с vbr и без правильных заголовков xing могут быть рассчитаны неправильно. Дополнительная информация: http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 –

ответ

2

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

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

Windows Media Player воспроизводит файлы MP3 через Media Foundation, не-DirectShow API, так что вы не имеете возможность здесь, чтобы ожидать или сделать точно же от DirectShow.

+0

Вы изменили IMediaPosition и IMediaSeeking. Документация на http://msdn.microsoft.com/en-us/library/dd406977(VS.85).aspx указывает, что «приложения должны использовать IMediaSeeking вместо IMediaPosition». –

+0

Хорошо, я бы сказал, что это не очень хороший совет. На стороне графика доступны оба интерфейса, а 'IMediaPosition' определенно проще в использовании, не говоря уже о том, что он получен из' IDispatch'. Таким образом, ответ стоит, как указано выше. –

2

От the documentation:

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

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

+0

Привет, нет, это файл с фиксированным битрейтом MP3; поэтому, насколько я понимаю, документация никогда не обещает, что продолжительность будет правильной, но как Windows Media Player знает продолжительность? Есть ли более надежные способы получения точной продолжительности медиафайла с помощью DirectShow API? – Vitaliy

+0

@VASoftOnline: Хм ... не знаю в этом случае. Я бы действительно ожидал, что это будет нормально, если это фиксированная ставка ... –

0

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

Смежные вопросы