Получение медиа-образцов с помощью синхронного ридера
[Возможность, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменён компонентами Source Reader и Sink Writer. Source Reader и Sink Writer оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код средства чтения исходного кода и записи приемников вместо пакета SDK для Windows Media 11, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Необходимо запрашивать каждый образец поочередно из синхронного считывателя. Это дает вам больше контроля над получаемыми образцами и при их получении.
Используйте метод IWMSyncReader::GetNextSample для получения примера. Основное, что вам нужно сделать, это передать указатели на переменные, которые будут заполнены информацией о выборке, извлеченной в виде параметров. Единственным входным параметром является wStreamNum. Если передать номер потока, GetNextSample вернёт следующий образец с указанным номером потока. Если вы передаете ноль для wStreamNum, извлекается следующая выборка, которая идёт по хронологии в файле.
По умолчанию синхронное средство чтения извлекает все примеры из выходных данных в файле в хронологическом порядке. Если вы вызываете GetNextSample и больше нет примеров для извлечения, он вернет NS_E_NO_MORE_SAMPLES, что является кодом ошибки, означающим неудачу. Таким образом, при программировании можно просто перебирать образцы, пока метод не даст сбой.
Заметка
Чтобы убедиться, что синхронное средство чтения предоставляет правильные сроки выборки для видеопотоков, необходимо сначала настроить выходные данные потока. Вызовите метод IWMSyncReader::SetOutputSetting, чтобы задать для параметра g_wszVideoSampleDurations значение TRUE.
Пример кода
В следующем примере кода показано, как использовать GetNextSample для получения всех примеров в файле.
// Loop through all the samples in the file.
do
{
// Get the next sample.
hr = pSyncReader->GetNextSample(0,
&pMyBuffer,
&cnsSampleTime,
&cnsSampleDuration,
&dwFlags,
&dwOutputNumber,
NULL);
if(SUCCEEDED(hr))
{
// TODO: Process the sample in whatever way is appropriate
// to your application. When finished, clean up.
pMyBuffer->Release();
pMyBuffer = NULL;
cnsSampleTime = 0;
cnsSampleDuration = 0;
dwFlags = 0;
dwOutputNumber = 0;
}
}
while (SUCCEEDED(hr));
Связанные разделы