在Media Foundation Sink Writer上添加声音和输入声音

时间:2017-06-16 02:57:38

标签: c# audio ms-media-foundation sharpdx

我可以使用我的屏幕录制应用程序生成mp4文件,但它只捕获屏幕并且没有声音。现在我希望它也使录音输出成为一个音频。我想要的是对来自电脑的直接声音进行编码,并将其与来自麦克风的声音混合。我使用sharpdx和mediafoundation.net下面是我的代码如何初始化sharpdx中的audiodevice

        var audioDevices = SharpDX.DirectSound.DirectSoundCapture.GetDevices();
        SharpDX.DirectSound.DirectSound dxSoundCapture = new SharpDX.DirectSound.DirectSound(audioDevices.First().DriverGuid);

及以下是我如何在mediafoundation中初始化音频的媒体类型

    IMFMediaType audioTypeIn = null;
IMFMediaType audioTypeOut = null;

// Create the Audio input type 
if (Succeeded(hr)) hr = (int)MFExtern.MFCreateMediaType(out audioTypeOut);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.AAC);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
if (Succeeded(hr)) hr = (int)audioTypeOut.SetUINT32(MFAttributesClsid.MF_MT_ALL_SAMPLES_INDEPENDENT, 1);
if (Succeeded(hr)) hr = (int)sinkWriter.AddStream(audioTypeOut, out streamAudIndex);

// Create the Audio input type 
if (Succeeded(hr)) hr = (int)MFExtern.MFCreateMediaType(out audioTypeIn);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.PCM);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 2);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
if (Succeeded(hr)) hr = (int)audioTypeIn.SetUINT32(MFAttributesClsid.MF_MT_ALL_SAMPLES_INDEPENDENT, 1);
if (Succeeded(hr)) hr = (int)sinkWriter.SetInputMediaType(streamAudIndex, audioTypeIn, null);

我的问题是如何将音频样本提供给我的清算器?在我的视频中,我基本上提供了来自SharpDX的texture2d并从中制作了一个样本缓冲区。

1 个答案:

答案 0 :(得分:0)

您正在准备Sink Writer接受以下配置的PCM音频流:44100样本/秒,立体声,16位/样本。

您应该获取具有相应数据的媒体样本,或者使用MFCreateSample和朋友自己创建。另请参阅MSDN上的Working with Media Samples

获得媒体样本后,IMFSinkWriter::WriteSample会将其发送给编码。