使用Sink Writer编码音频
Encode Audio using Sink Writer
我找到了一篇解释如何使用Media Foundation对视频进行编码的文章。
我正在尝试使用上述链接中使用的原理对音频进行编码。
我被困在设置一个正确的输入媒体类型的接收器写入器。
这是那部分:
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);
我的代码在最后一行设置输入媒体类型时失败。
请帮忙,如何处理这个问题?
谢谢。
您还需要在媒体类型中提供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。
最重要的是,如果你需要将音频编码为AAC,在调用SetMediaType之前,你需要调用Sink Writer上的AddStream,通过调用MFTranscodeGetAudioOutputAvailableTypes函数枚举输出音频类型。
MFCreateSinkWriterFromURL可能无法猜到您需要从m4a扩展编码到mp4容器。在调用MFCreateSinkWriterFromURL时,您可能需要使用MF_TRANSCODE_CONTAINERTYPE属性提供MFTranscodeContainerType_MPEG4包含类型。另一种选择是使用mfcreatatempeg4mediasink和MFCreateSinkWriterFromMediaSink。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 用c++阅读音频
- 为什么这个音频包络不能通过开关的情况?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- FFMpeg库:如何在音频文件中精确查找
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- 需要反转音频步进公式
- boost 是否有按特殊类型值编码状态"compact optional"?
- FFmpeg:编码PCM 16音频数据分配错误
- FFmpeg音频编码器新增编码功能
- QMultimedia - 支持哪些视频/音频编码和容器
- 试图解码音频上编码的类似调频的信号
- 在输入和输出之间使用不同数量的样本对音频ffmpegc++进行编码
- 使用Sink Writer编码音频
- 使用Media Foundation从未压缩的IEEE浮点音频编码到AAC
- 音频 MP2 编码和解码产生一半的数据C++和 FFMPEG
- libav音频编码从原始pcm到OGG Vorbis的例子