编写示例

[与此页面关联的功能 Windows Media Format 11 SDK 是一项旧功能。 它已被源读取器和接收器编写器取代。 源读取器和接收器编写器已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用源读取器和接收器编写器,而不是 Windows Media 格式 11 SDK。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

确定并配置正在写入的文件的输入后,可以开始向编写器传递示例。 如果可能,应按演示时间顺序传递示例,以提高编写过程的效率。

在传递任何示例之前,必须通过调用 IWMWriter::BeginWriting 将编写器设置为接受它们。

若要将示例传递给编写器,请执行以下步骤:

  1. 通过调用 IWMWriter::AllocateSample 来分配缓冲区并检索指向 INSSBuffer 接口的指针。
  2. 通过调用 INSSBuffer::GetBuffer 检索步骤 1 中创建的缓冲区的地址。
  3. 将示例数据复制到缓冲区位置,确保传递的样本适合分配的缓冲区。 可以使用任何内存复制函数来复制数据。 常见的选择是 memcpy,它包含在标准 C 运行时库中。
  4. 通过调用 INSSBuffer::SetLength 更新缓冲区中使用的数据量,以反映样本的实际大小。
  5. 使用 IWMWriter::WriteSample 方法将缓冲区接口以及输入号和采样时间传递给编写器。 输入的所有音频样本都表示相同的内容持续时间,因此可以通过将样本持续时间添加到运行总数来计算采样时间。 对于视频,需要根据帧速率计算时间。

WriteSample 以异步方式工作,在应用程序准备好再次调用方法之前,可能无法完成从缓冲区写入数据。 因此,对于每次调用 WriteSample ,必须调用一次 AllocateSample。 但是,可以在调用 WriteSample 后立即释放 INSSBuffer 接口。

完成传递示例后,调用 IWMWriter::EndWriting

注意 请务必将文件中所有流中的样本相互同步传递到编写器。 也就是说,应尽可能在 IWMWriterAdvanced::SetSyncTolerance 中指定的同步容差内,按演示时间顺序将样本传递给编写器。 将数据以 1 秒或更短的单位传送到每个流时,将获得最佳结果。

流也应该大致在同一时间结束。 例如,不应编写长度为 45 秒的音频流和长度为 50 秒的视频流的文件。 如果使用未更改的输入对此类文件进行编码,则流末尾的某些音频数据将被删除 (,即使它是) 较短的流。 若要使文件编码正常工作,应向音频输入添加 5 秒的静音,以便一个流不会在另一个流之前几秒钟结束。 具有间歇性样本(如文本或图像流)的流类型不必以这种方式填充。 脚本命令流还应遵循所有这些规则。

INSSBuffer 接口

IWMWriter 接口

编写 ASF 文件