首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >媒体基金会:将G711 PCMU写成mp4

媒体基金会:将G711 PCMU写成mp4
EN

Stack Overflow用户
提问于 2020-02-12 16:43:32
回答 1查看 658关注 0票数 2

我们有一个要求(Windows应用程序)以mp4存储从摄像机接收到的音频和视频数据。视频格式是h264,音频是g711 pcmu

我们使用媒体基金会(c#使用MF .Net) sinkWriter将视频数据写入mp4,这很好。我想知道如何写音频样本到mp4。我尝试了以下方法:

代码语言:javascript
复制
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.If,那么是否有任何windows c# API可以这样做呢?一旦解码完成,输出pcm中每个样本的位数是多少。是16号吗?

2)即使以pcm作为输入类型,SetInputMediaType也会返回MF_E_INVALIDMEDIATYPE错误。这是因为aac编码器只支持44.1 &48 the的采样率。(mp3支持32 Khz,.)如果我的理解是正确的,我如何克服这个问题。我该上个样品吗。如果是的话,怎么做?

(3)是否有更简单的方法将pcmu(每秒8000个样本,每个样本8位)与视频帧一起写入mp4?

EN

Stack Overflow用户

发布于 2020-02-13 20:06:57

( 1)和3)改为:只播放音频到-mp4-ffmpeg-失败

( 2)

  • 将G711解码为PCM (CLSID_MULawCodecWrapper : 92B66080-5E2D-449E-90C4-C41F268E5514)
  • 使用音频重放器(音频放大器DSP)
  • 编码PCM重放至AAC (AAC编码器)

也许CLSID_MULawCodecWrapper能够做重采样。也许您会出现音频/视频同步问题。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60193224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档