2016-11-05 13 views
0

Я нашел this статью, в которой объясняется, как кодировать видео с помощью Media Foundation.Кодировка звука с использованием Sink Writer

Я пытаюсь кодировать аудио, используя принцип, используемый в приведенной выше ссылке.

Я застреваю при настройке правильного типа входного носителя для записывающего устройства.

Вот та часть:

if (SUCCEEDED(hr)) 
    hr = MFCreateMediaType(&pMediaTypeIn); 

if (SUCCEEDED(hr)) 
    hr = pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); 

if (SUCCEEDED(hr)) 
    hr = pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float); 

if (SUCCEEDED(hr)) 
    hr = pMediaTypeIn->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, cChannels); 

if (SUCCEEDED(hr)) 
    hr = pMediaTypeIn->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, sampleRate); 

if (SUCCEEDED(hr)) 
    hr = pSinkWriter->SetInputMediaType(streamIndex, pMediaTypeIn, NULL); 

Мой код не будет работать на последней строке во время установки типа входного носителя.

Любая помощь, как с этим справиться?

Спасибо.

+1

Как вы создали SinkWriter? Вы пытались с MFAudioFormat_PCM? – VuVirt

+0

MFCreateSinkWriterFromURL (L "output.m4a", NULL, NULL, & pSinkWriter); Да, я попробовал как PCM, так и Float. Они не могут быть установлены – mbaros

+1

Я думаю, вам также необходимо указать MF_MT_AUDIO_BITS_PER_SAMPLE в типе носителя. Он должен быть установлен в 16. Проверьте требования к типам входных данных здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/dd742785(v=vs.85).aspx Частота выборки должна быть либо 44100, либо 48000. Подтип должен быть MFAudioFormat_PCM. – VuVirt

ответ

2

Вам также необходимо указать MF_MT_AUDIO_BITS_PER_SAMPLE в типе носителя. Он должен быть установлен в 16. Проверьте требования к типам входных данных здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/dd742785(v=vs.85).aspx. Частота выборки должна быть равна 44100 или 48000. Подтип должен быть MFAudioFormat_PCM.

Самого главного, что вам нужно вызвать AddStream на Writer Sink, перед вызовом SetMediaType, с типом выводом аудио перечисленного вызовом функции MFTranscodeGetAudioOutputAvailableTypes с MFAudioFormat_AAC подтипом, если вам нужно для кодирования аудио в AAC.

MFCreateSinkWriterFromURL может быть не в состоянии догадаться, что вам нужно кодировать контейнер mp4 из расширения m4a. Возможно, вам потребуется указать тип MFTranscodeContainerType_MPEG4, используя атрибут MF_TRANSCODE_CONTAINERTYPE при вызове MFCreateSinkWriterFromURL. Другой вариант - вместо этого использовать MFCreateMPEG4MediaSink и MFCreateSinkWriterFromMediaSink.

+0

Всего один комментарий. MFCreateSinkWriterFromURL может угадать правильный контейнер из имени вывода. – mbaros