libmp4v2不完全指南封装g711a的坑

libmp4v2不完全指南封装g711a的坑

1 添加audio track

int mp4v2_mp4_writer_init_g711(uint32_t sampleRate, uint32_t timeScale)
{
    if(g_mp4v2.mp4handle == MP4_INVALID_FILE_HANDLE || RD_STREAM_INIT_STATUS != g_mp4v2.astatus)
    {
        return -1;
    }

    g_mp4v2.atrack_id = MP4AddALawAudioTrack(g_mp4v2.mp4handle, u32SampleRate);
    //g_mp4v2.atrack_id = MP4AddAudioTrack(g_mp4v2.mp4handle, u32SampleRate, 800, MP4_ALAW_AUDIO_TYPE);
    if(0 == g_mp4v2.atrack_id)
    {
        printf("create audio track success,g_mp4v2.atrack_num:%d\n", g_mp4v2.atrack_id);
        return -1;
    }
    else
    {
        printf("create audio track success,g_mp4v2.atrack_num:%d\n", g_mp4v2.atrack_id);
    }

    MP4SetAudioProfileLevel(g_mp4v2.mp4handle, 0x2);

    return 0;
}

看似平平无奇的一段代码对吧,实际上有两个大坑浪费了我半天的时间

一开始搜索add audio track,看到这个接口

MP4TrackId MP4AddAudioTrack(
    MP4FileHandle hFile,
    uint32_t      timeScale,
    MP4Duration   sampleDuration,
    uint8_t       audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE) );

俺寻思着是不是只要audioType指定MP4_ALAW_AUDIO_TYPE就万事大吉了?没想到视频录出来看音频信息,是AAC编码的,原来这个接口的作用是把audioType形式的音频流按AAC编码保存下来,这显然是不符合需求的

如果想保存g711a的音频,并且在pc上显示的音频编码也是g711a的话,就要用这个接口

MP4TrackId MP4AddALawAudioTrack(
    MP4FileHandle hFile,
    uint32_t timeScale);

明显可以看出,这个接口参数没有sampleDuration,于是这就是我要说的第二个大坑

接口实现在

mp4v2-2.0.0/src/mp4file.cpp:1886:MP4TrackId MP4File::AddALawAudioTrack(    uint32_t timeScale)

MP4TrackId MP4File::AddALawAudioTrack(    uint32_t timeScale)
{
	memcpy(m_cAudioType, "Alaw", 5);
    uint32_t fixedSampleDuration = (timeScale * 20)/1000; // 20mSec/Sample

    MP4TrackId trackId = AddTrack(MP4_AUDIO_TRACK_TYPE, timeScale);

    ...

    return trackId;
}

发现什么没有?没错!这个接口写死了duration为一秒50帧,如果你的音频流和这里不一样,那么就会出现音频缺失的问题,比如我的音频是25帧,录出来的文件就是前半段有声音而后半段没有声音的

想解决这个问题倒也简单,改源码就行,需要按你编码器实际情况修改

uint32_t fixedSampleDuration = (timeScale * 40)/1000; // 40mSec/Sample

改完之后重新交叉编译

2 封装

音频的封装就平平无奇了

MP4WriteSample(pgpac->mp4handle, 
               pgpac->atrack_id, 
               pdata, 
               data_size, 
               MP4_INVALID_DURATION, 
               0, 
               1);

唯一需要注意的是编码器输出的音频流是不是也带了什么奇奇怪怪的头,如果有,记得剥掉,MP4WriteSample写的是裸流

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值