2017-01-03 6 views
-1

Windows Media Foundationを使用してH264ビデオをエンコードしています。 (私はC#経由でMFNetラッパーを使用しています)。Media Foundation MP4エンコーディング:IMFSinkWriterはPCM入力を受け付けません

ビデオエンコーディングは完全に機能します。私はH264ビデオでMP4を出します。

今、私はオーディオを追加しようとしています。私はメモリから圧縮されていないPCMを渡し、符号化されたAACを取り出したいと思う。私は私のSinkWriterにaudiostreamを追加します。 öしかし、SetInputMediaTypeに電話するときはMF_E_INVALIDMEDIATYPEになります。

なぜですか?

は、ここに私のコードです:

IMFMediaType audioTypeOut, audioTypeIn, videoTypeOut, videoTypeIn; 
IMFSinkWriter sinkWriter; 

Check = MFCreateSinkWriterFromURL(outputFile.Replace(".avi",".mp4"), null, attributes, out sinkWriter); // the assignment to "Check" throws an exception if a method fails. 

//[ ... setup video input & output - works perfectly ...] 
Check = sinkWriter.AddStream(videoTypeOut, out videoStreamIndex); 
Check = sinkWriter.SetInputMediaType(videoStreamIndex, videoTypeIn, null); 

// Now setup Audio: 
// Input PCM from memory 
Check = MFExtern.MFCreateMediaType(out audioTypeIn); 
Check = audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio); 
Check = audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.PCM); // this .PCM enum value is equal to MFAudioFormat_PCM in the C++ api (I checked) 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BLOCK_ALIGNMENT, 4); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100 * 4); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_ALL_SAMPLES_INDEPENDENT, 1); 

// and output AAC to the MP4 file 
Check = MFExtern.MFCreateMediaType(out audioTypeOut); 
Check = audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio); 
Check = audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.AAC); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_ALL_SAMPLES_INDEPENDENT, 0); 

// pass it to the sinkWriter 
Check = sinkWriter.AddStream(audioTypeOut, out audioStreamIndex); 
Check = sinkWriter.SetInputMediaType(audioStreamIndex, audioTypeIn, null); // this call fails 

、私はAACに合格しようとすると、セットアップコードは完璧に動作します。 PCMのIMFMediaTypeを誤って設定していると思うようになりますが、エラーを特定できません。

+1

FYI在庫AACエンコーダの入力は 'MFAudioFormat_PCM'でなければなりません。あなたのLPCMは自動的に利用できない変換が必要な場合があります。 –

+0

@RomanR。ありがとう、私はそれをPCMに変更しました。変更なし - 同じエラーが表示されます。 (そして、私はC#apiの私の "PCM"が公式SDKのMFAudioFormat_PCMと同じ値を持っていることを確認しました) – LTR

+1

次はAACタイプの 'MF_MT_ALL_SAMPLES_INDEPENDENT'です。なぜあなたはそれを完全にコメントアウトしないのですか? –

答えて

1

オーディオメディアタイプは次のように初期化することができます。

// Input PCM from memory 
Check = MFExtern.MFCreateMediaType(out audioTypeIn); 
Check = audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio); 
Check = audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.PCM); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100); 
Check = audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16); 

// and output AAC to the MP4 file 
Check = MFExtern.MFCreateMediaType(out audioTypeOut); 
Check = audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio); 
Check = audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.AAC); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100); 
Check = audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16); 

他の属性は導出され、元のコードスニペットでMF_MT_ALL_SAMPLES_INDEPENDENTの誤った使用は、コーデックの初期化から防ぐことができます。

関連する問題