对于1)和3),请阅读:muxing-only-audio-into-mp4-ffmpeg-failed
我们要求(Windows UWP应用程序)以mp4格式存储从摄像机接收的音频和视频数据(RTP数据包。视频格式为h264,音频为g711 pcmu>]] >> 我们正在使用media Foundation(c#using MF .Net) sinkWriter将视频数据写入mp4,效果很好。我想知道如何将音频样本写入mp4。我尝试了以下方式:private void SetupAudioMediaType(out IMFMediaType mediaType, in Guid audioSubType)
{
HResult hr = HResult.S_OK;
hr = MFExtern.MFCreateMediaType(out mediaType);
if (!hr.Succeeded())
{
Debug.Fail("MFCreateMediaType for audio failed " + hr.ToString());
return;
}
hr = mediaType.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Audio);
if (!hr.Succeeded())
{
Debug.Fail("Set MF_MT_MAJOR_TYPE media-out failed " + hr.ToString());
return ;
}
hr = mediaType.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, audioSubType);
if (!hr.Succeeded())
{
Debug.Fail("Set MF_MT_SUBTYPE media-out failed " + hr.ToString());
return ;
}
hr = mediaType.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000);
if (!hr.Succeeded())
{
Debug.Fail("Set MF_MT_AUDIO_SAMPLES_PER_SECOND media-out failed " + hr.ToString());
return
}
hr = mediaType.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_NUM_CHANNELS, 1);
if (!hr.Succeeded())
{
Debug.Fail("Set MF_MT_AUDIO_NUM_CHANNELS media-out failed " + hr.ToString());
return ;
}
hr = mediaType.SetUINT32(MFAttributesClsid.MF_MT_AUDIO_BITS_PER_SAMPLE, 8);
if (!hr.Succeeded())
{
Debug.Fail("Set MF_MT_AUDIO_BITS_PER_SAMPLE media-out failed " + hr.ToString());
return ;
}
return errorCode;
}
private MultiplexerErrorCode SetupAudio()
{
HResult hr = HResult.S_OK;
IMFMediaType mediaTypeOut = null;
IMFMediaType mediaTypeIn = null;
SetupAudioMediaType(out mediaTypeOut, MFMediaType.AAC); // or mp3 (MP4 in windows support mp3 or aac)
if (errorCode != MultiplexerErrorCode.Success)
{
Debug.Fail("setupAudioMediaType output failed:", errorCode.ToString());
}
else
{
hr = sinkWriter.AddStream(mediaTypeOut, out audioStreamIndex);
if (!hr.Succeeded())
{
Debug.Fail("AddStream audio failed " + hr.ToString());
}
else
{
Guid PcmuAudioSubType = (new FourCC(7,0,0,0)).ToMediaSubtype(); //PCMU
SetupAudioMediaType(out mediaTypeIn, PcmuAudioSubType);
hr = sinkWriter.SetInputMediaType(audioStreamIndex, mediaTypeIn, null);
if (!hr.Succeeded())
{
Debug.Fail("SetInputMediaType audio failed " + hr.ToString());
}
}
}
return ;
}
SetInputMediaType返回错误MF_E_INVALIDMEDIATYPE。根据我的分析,以下是错误的原因
1)我认为不支持PCMU输入类型。它应该是PCM。这是理解核心吗?如果是的话,这意味着我必须将PCMU解码为PCM。如果是的话,是否有任何Windows c#API可以做到这一点?解码完成后,输出pcm中每个样本的位数是多少。是16岁吗?
2)即使我提供pcm作为输入类型,SetInputMediaType也会返回MF_E_INVALIDMEDIATYPE错误。是因为aac编码器仅支持44.1和48Khz的采样率。 (mp3支持32 Khz,...)。如果我的理解是正确的,那么我该如何解决这个问题。我应该上采样吗?如果可以,怎么办?
3]有没有更简单的方法将pcmu(每秒8000个样本,每个样本8位)与视频帧一起写入mp4
[我们有一个要求(Windows UWP app)将从摄像机接收的音频和视频数据(RTP数据包)存储为mp4。视频格式为h264,音频为g711 pcmu,我们正在使用媒体基础(使用MF的c#语言。] >
对于1)和3),请阅读:muxing-only-audio-into-mp4-ffmpeg-failed
对于2)
也许CLSID_MULawCodecWrapper可以重新采样。也许您会遇到音频/视频同步问题。
对于1)和3),请阅读:muxing-only-audio-into-mp4-ffmpeg-failed