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を誤って設定していると思うようになりますが、エラーを特定できません。
FYI在庫AACエンコーダの入力は 'MFAudioFormat_PCM'でなければなりません。あなたのLPCMは自動的に利用できない変換が必要な場合があります。 –
@RomanR。ありがとう、私はそれをPCMに変更しました。変更なし - 同じエラーが表示されます。 (そして、私はC#apiの私の "PCM"が公式SDKのMFAudioFormat_PCMと同じ値を持っていることを確認しました) – LTR
次はAACタイプの 'MF_MT_ALL_SAMPLES_INDEPENDENT'です。なぜあなたはそれを完全にコメントアウトしないのですか? –