如何在Media Foundation中正确配置ASF媒体接收器

时间:2016-12-29 12:27:26

标签: c++ ms-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 :(得分:2)

我可以说在你的代码中至少有两个重大错误: 1.您从0开始索引流:

  

streamConfig-&GT; 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 - 最初它是为Media Foundation更改的DMO编码器 - 它需要通过MF_MT_USER_DATAConfiguring a WMV Encoder为MediaType添加特殊的编解码器私有数据 - 这意味着MediaSink将尝试为Windows Media编解码器查找此类型数据,但无法找到它。
  2. 这是两个错误,对我来说很明显 - 我认为你应该在MSDN上研究教程。

    的问候。