使用同步读取器检索媒体示例

[与此页面关联的功能 Windows Media Format 11 SDK 是旧版功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用源读取器和接收器编写器,而不是 Windows Media Format 11 SDK。 如果可能,Microsoft 建议重写使用旧 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 接口

使用同步读取器读取文件