Получение примеров мультимедиа с помощью синхронного средства чтения

[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Она была заменена средствами чтения источника и модуля записи приемников. Средство чтения источника и модуль записи приемников оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде средство чтения исходного кода и модуль записи приемников вместо пакета SDK для Windows Media Format 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));

Интерфейс IWMSyncReader

Чтение файлов с помощью синхронного средства чтения