如何在 Media Foundation 中正确配置 ASF media sink

How can i properly configure ASF media sink in Media Foundation

以下是我尝试配置 ASF 媒体接收器的方式:

// Create media type
ComPtr<IMFMediaType> videoOutputType;
Try(MFCreateMediaType(&videoOutputType));
Try(MFSetAttributeSize(videoOutputType.Get(), MF_MT_FRAME_SIZE, 400, 300));
Try(videoOutputType->SetUINT32(MF_MT_AVG_BITRATE, 626000));
Try(videoOutputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));
Try(videoOutputType->SetUINT32(MF_MT_VIDEO_ROTATION, 0));
Try(MFSetAttributeRatio(videoOutputType.Get(), MF_MT_FRAME_RATE, 30000, 1001));
Try(MFSetAttributeRatio(videoOutputType.Get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1));
Try(videoOutputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));
Try(videoOutputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_WMV3));

// Create profile
ComPtr<IMFASFProfile> asfProfile;
Try(MFCreateASFProfile(&asfProfile));
ComPtr<IMFASFStreamConfig> streamConfig;
Try(asfProfile->CreateStream(videoOutputType.Get(), &streamConfig));
Try(streamConfig->SetStreamNumber(0));
Try(asfProfile->SetStream(streamConfig.Get()));

// Create media sink
ComPtr<IMFMediaSink> asfMediaSink;
ComPtr<IMFByteStream> outputByteStream(new NetworkOutputByteStream(stream));
Try(MFCreateASFStreamingMediaSink(outputByteStream.Get(), &asfMediaSink));

// Set content info
ComPtr<IMFASFContentInfo> asfContentInfo;
Try(asfMediaSink.As(&asfContentInfo));
Try(asfContentInfo->SetProfile(asfProfile.Get()));

// Create sink writer
Try(MFCreateSinkWriterFromMediaSink(asfMediaSink.Get(), NULL, &this->sinkWriter));

但是方法 SetProfile 返回以下错误:E_INVALIDARG One or more arguments are invalid. 所以我假设我以错误的方式配置它。我怎样才能做对?我不确定如何使用 ASF 媒体接收器,因为我找不到任何好的示例。

我可以说你的代码中至少有两个大错误: 1. 你从 0:

索引流

streamConfig->SetStreamNumber(0)

这是一个错误 - 在 Tutorial: 1-Pass Windows Media Encoding 中写道:

if (wStreamNumber < 1 || wStreamNumber > 127 )
{
    return MF_E_INVALIDSTREAMNUMBER;
}

ASF 中最多有 128 个流,但索引为 0 的流是为格式需要保留的。您必须使用大于 0 的索引。

  1. 您尝试通过填充属性来创建媒体类型 - 这不是个好主意 - 首先,您不知道 MediaSink 需要的所有属性;其次,您尝试为 Windows 视频编码器创建 MediaType - 最初它是一个 DMO 编码器,已为 Media Foundation 更改 - 它需要通过 MF_MT_USER_DATA, Configuring a WMV Encoder 为 MediaType 添加特殊的编解码器私有数据 - 这意味着 MediaSink 将尝试为 Windows 媒体编解码器找到此类数据,但找不到。

这是两个错误,对我来说意义重大 - 我认为您应该研究 MSDN 上的教程。

问候。