2016-12-29 61 views
1

這裏是如何我嘗試配置的ASF媒體宿:我怎樣才能正確地配置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媒體接收器,因爲我找不到任何有關它的好樣品。

+0

我想流應該有一個媒體類型附加。它與MF不完全相關 - WMF(ASF)配置文件在流上具有完全限定的媒體類型。所以我想應該有'IMFASFStreamConfig :: SetMediaType'調用的地方。 –

+0

但'CreateStream'方法將媒體類型附加到流中。我認爲有理由再次附加媒體類型。 – pawel

回答

1

我可以說,在你的代碼至少有兩大失誤: 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編碼器 - 它需要通過MF_MT_USER_DATA添加特殊的編解碼器私有數據的MediaType,Configuring a WMV Encoder - 這意味着MediaSink將嘗試找到適用於Windows這樣的數據類型媒體編解碼器,但不會找到它。

這是兩個錯誤,對我來說是可標記的 - 我認爲你應該在MSDN上研究教程。

問候。