使用同步读取器检索媒体示例
[与此页面关联的功能 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));
相关主题