【问题标题】:Adding Sound and Input Sound on Media Foundation Sink Writer在 Media Foundation Sink Writer 上添加声音和输入声音
【发布时间】: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


    【解决方案1】:

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

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

    一旦您有了媒体样本,IMFSinkWriter::WriteSample 会将其发送到编码。

    【讨论】:

    • 创建内存缓冲区会增加我的应用程序的 cpu 使用率。我想知道是否可以像我在 texture2d 中所做的那样,在没有内存缓冲区的情况下直接向 sinkwriter 提供声音。我使用 MFCreateVideoSampleFromSurface 创建样本,使用 MFCreateDXGISurfaceBuffer 获取 mediabuffer 并将其写入 sinkwriter
    • 你不应该担心这个,真的。这里甚至不是视频与音频方面,而是软件编码的事实以及您通过 SharpDX 的开销及其开销使 MFCreateSample 变成几乎零费用的电话。
    • 我尝试了你的建议,但我不知道如何将数据从我的设备传递到接收器。在媒体基础中是否有一种简单的方法可以做到这一点?
    • 您好 Roman,我一直在互联网上搜索,我很惊讶我正在寻找的参考是这个网站。 alax.info,我看到你是作者。我看到你的一篇文章是alax.info/blog/1716 我相信该应用程序是使用 C++ 编写的并且能够捕获音频。该来源在您的网站上不可用,我想知道您是否计划将其发布用于教育目的。顺便说一句,这是我的电子邮件。 gvon18@yahoo.com 谢谢
    • 代码被重新用于另一个项目,因此源代码不可用。对不起!
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多