【发布时间】:2017-06-16 02:57:38
【问题描述】:
我可以使用我的屏幕录制应用程序制作 mp4 文件,但它只能捕获屏幕并且没有声音。现在我希望它也使录音输出成为音频。我想要的是对来自 pc 的音频进行编码,这是直接的声音,并将其与来自麦克风的声音混合。我正在使用sharpdx 和mediafoundation.net 下面是我如何在sharpdx 中初始化音频设备的代码
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);
我的问题是如何将音频样本提供给我的 sinkwriter?在我的视频中,我基本上提供了来自 SharpDX 的 texture2d,并从中制作了一个样本缓冲区。
【问题讨论】:
标签: c# audio ms-media-foundation sharpdx