Получение позиции при проигрывании звука...
От: LtSolo  
Дата: 04.11.04 17:26
Оценка:
Добрый день.

Такой вопрос возник: при проигрывании звука в DirectShow требуется получать точное время того, что сейчас звучит. Рекомендуемый способ это GetCurrentPosition у IMediaSeeking полученном от IGraphBuilder. Так вот... этот метод выдаёт время с некоторым постоянным временным интервалом (опережение) отличным от того, что дожно быть и после того как в программе выполняется SetPositions у IMediaSeeking он начинает выдавать время уже с другим постоянным временным интервалом (запаздывание). Возникло подозрение, что время, которое он выдаёт — это время в считываемом файле (который иногда считывается заранее, иногда нет), а не в выходном потоке. Вопрос: как узнать "правильное" время? Обращу внимание, что эти задержки порядка 300-500 мсек, а потому обычно на них забивают. Но что делать, если нужно именно точно...
Re: Получение позиции при проигрывании звука...
От: romson  
Дата: 04.11.04 19:21
Оценка:
Здравствуйте, LtSolo, Вы писали:

LS> Добрый день.


LS> Такой вопрос возник: при проигрывании звука в DirectShow требуется получать точное время того, что сейчас звучит. Рекомендуемый способ это GetCurrentPosition у IMediaSeeking полученном от IGraphBuilder. Так вот... этот метод выдаёт время с некоторым постоянным временным интервалом (опережение) отличным от того, что дожно быть и после того как в программе выполняется SetPositions у IMediaSeeking он начинает выдавать время уже с другим постоянным временным интервалом (запаздывание). Возникло подозрение, что время, которое он выдаёт — это время в считываемом файле (который иногда считывается заранее, иногда нет), а не в выходном потоке. Вопрос: как узнать "правильное" время? Обращу внимание, что эти задержки порядка 300-500 мсек, а потому обычно на них забивают. Но что делать, если нужно именно точно...


Быть может, если взять IMediaSeeking непосредственно с аудио рендерера, то он будет показывать более точное время?
Re[2]: Получение позиции при проигрывании звука...
От: LtSolo  
Дата: 05.11.04 05:25
Оценка:
Спасибо за ответ, однако это то, что я пытался делать:

        IMediaPosition * streamF;
        hr = OutFilter->QueryInterface(IID_IMediaPosition, (void **)&streamF);
        REFTIME rtTime;
        hr = streamF->get_CurrentPosition(&rtTime);
        hr = streamF->Release();
        float timeMsec = ((float) rtTime / 10000.0);


Так вот rtTime завсегда равен нулю. :no:
...в обычном виндовом API (waveOutOpen, waveOutPrepareHeader, waveOutWrite) я знал какая порция звука только что закончилась и делал интерполяцию зная nAvgBytesPerSec. Здесь же такого метода нет или он хорошо упрятан.

Так что вопрос открыт...
Re[3]: Получение позиции при проигрывании звука...
От: Аноним  
Дата: 14.11.04 14:03
Оценка:
Чувак смотри Пост "Как при Rate > 1 получитть текущую позицию"

потом читай про IReferenceClock и про метод Advise так можно получать
время с точностью 100 нанасекунд ...

или более подробно накатай письмо по твоей проблеме на bb@netsib.com

Удачи ... на пересдаче
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.