gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:27 26 4
gpt4 key购买 nike

这是我尝试配置 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 一个或多个参数无效。 所以我假设我以错误的方式配置它。我怎样才能做对?我不确定如何使用 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 为 MediaType 添加特殊的编解码器私有(private)数据。 , Configuring a WMV Encoder - 这意味着 MediaSink 将尝试为 Windows Media 编解码器查找此类数据,但不会找到它。

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

问候。

关于c++ - 如何在 Media Foundation 中正确配置 ASF media sink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41379742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com