gpt4 book ai didi

c++ - 如何使用 IMFSinkWriter 写入内存中的 PCM 数据?

转载 作者:行者123 更新时间:2023-11-30 05:19:19 26 4
gpt4 key购买 nike

大家好,伟大的黑客们。

我可以使用 IMFSinkWriter 混合从文件中读取的音频和视频数据,但我找不到如何使用 IMFSinkWriter 将内存中的原始 PCM 数据混合到最终媒体文件。

我想内存中的原始 PCM 数据将通过任何方法生成。

我对 sinkwriter 使用了下面的设置,目标音频格式是 MP3。

hr = writer->AddStream(mt_aud_in, &speech_stream_ind);
mytrace(L"speech_stream_ind = %d\n", speech_stream_ind);
HRTrace(hr);

hr = MFCreateMediaType(&mt_aud_speech);
HRTrace(hr);
hr = mt_aud_speech->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
HRTrace(hr);
hr = mt_aud_speech->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
HRTrace(hr);
hr = mt_aud_speech->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, 2);
HRTrace(hr);
hr = mt_aud_speech->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
HRTrace(hr);
hr = mt_aud_speech->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
HRTrace(hr);
hr = writer->SetInputMediaType(speech_stream_ind, mt_aud_speech, NULL);
HRTrace(hr);

问候,

最佳答案

我通过设置 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 属性解决了这个问题。

Sink Writer 将使用的解析器需要这个属性。

但是 MSDN 并没有说这个重要的事情。

HRESUlT hr = MFCreateMediaType(&mt_aud_speech_in);
hr = mt_aud_speech_in->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
hr = mt_aud_speech_in->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
hr = mt_aud_speech_in->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, 2);
hr = mt_aud_speech_in->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
hr = mt_aud_speech_in->SetUINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 4);
hr = mt_aud_speech_in->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
hr = mt_aud_speech_in->SetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 44100*2*2);

关于c++ - 如何使用 IMFSinkWriter 写入内存中的 PCM 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com