Добавление звука и входного звука в Media Foundation Sink Writer
Я могу создать файл mp4 с помощью моего приложения для записи экрана, но оно только захватывает экран и не имеет звука. Теперь я хочу, чтобы запись также выводила звук. Я хочу закодировать звук, исходящий от компьютера, который является прямым звуком, и смешать его со звуком, исходящим из микрофона. Я использую 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);
У меня вопрос, как я могу передать аудиосэмпл на мой приемник? В своем видео я в основном предоставляю texture2d из SharpDX и делаю из него буфер сэмплов.
1 ответ
Вы готовите Sink Writer для приема аудиопотока PCM следующей конфигурации: 44100 сэмплов / сек, стерео, 16 бит / сэмпл.
Вы должны либо получить образцы медиа с соответствующими данными, либо создать их самостоятельно, используя MFCreateSample
и друзья. См. Также Работа с образцами мультимедиа в MSDN.
Как только у вас есть образец медиа, IMFSinkWriter::WriteSample
отправляет его в кодировку.