超级搬砖工 2019-01-23 17:26 采纳率: 100%
浏览 1419
已采纳

为什么用libfaac编码的aac音频文件用播放器播放时速度却比正常速度快?

我采集原始的PCM帧数据(16KHZ采样)用libfaac库编码成AAC帧(ADTS格式)
然后写成.aac文件,当我用播放器播放时发现声音比正常速度要快,移植找不到原因,望大神指导,万分感谢!

一些基本参数如下:

PCM : 16000HZ 160采样为1帧

 //使用 faac 库
    aac_config.EncHandle =  faacEncOpen(aac_config.SampleRate, \
                                        aac_config.Channels, \
                                        &aac_config.InputSamples, \
                                        &aac_config.MaxOutputBytes);
    if(aac_config.EncHandle == NULL)
    {
        DEBUG_LOG("failed to call faacEncOpen()\n");
        return NULL;
    }

    aac_config.PCMBuffer_size =  aac_config.InputSamples * (aac_config.PCMBitSize / 8);//PCM_BUF_SIZE;

    aac_config.PCMBuffer = (unsigned char*)malloc(aac_config.PCMBuffer_size * sizeof(unsigned char));
    aac_config.AACBuffer = (unsigned char*)malloc(aac_config.MaxOutputBytes * sizeof(unsigned char));
    memset(aac_config.PCMBuffer, 0, aac_config.PCMBuffer_size);
    memset(aac_config.AACBuffer, 0, aac_config.MaxOutputBytes);


    //获取当前配置参数
     faacEncConfigurationPtr pConfiguration = faacEncGetCurrentConfiguration(aac_config.EncHandle);

    //调整配置参数
    #if 1 
        pConfiguration->inputFormat = FAAC_INPUT_16BIT;
        pConfiguration->outputFormat = 1; /*0 - raw; 1 - ADTS*/
        pConfiguration->bitRate = PCM_SAMPLE_RATE;  //库内部默认为64000
        pConfiguration->useTns = 0;
        pConfiguration->allowMidside = 1;
        pConfiguration->shortctl = SHORTCTL_NORMAL;
        pConfiguration->aacObjectType = LOW;
        pConfiguration->mpegVersion = MPEG4;//MPEG2
        //pConfiguration->useLfe = 1;
    #endif  

    //重新设置回去
    ret = faacEncSetConfiguration(aac_config.EncHandle,pConfiguration);
    if(ret != 1)
    {
        ERROR_LOG("failed to call faacEncSetConfiguration()\n");
        return NULL;
    }
  • 写回答

2条回答 默认 最新

  • 超级搬砖工 2019-01-24 09:06
    关注

    问题已经解决:
    我的原始PCM数据有部分数据帧丢失,我使用的是海思3516EV100的处理器,使用的海思的SDK,问题出在我配置的采集PCM数据的参数上,采样率在16000HZ的情况下,PCM数据帧采样点数设置成160采样/帧,这样就会造成每秒产生16000/160 = 100帧的帧率,这个帧率太高,每帧PCM数据帧我都需要调用处理函数去进行AAC编码,这样会造成大量的函数入栈出栈,几乎1000/100 = 10ms就需要完成一帧PCM数据调用AAC编码接口,频率太高,况且libfaac库本来就有点耗CPU,造成了丢帧(原始PCM数据帧部分丢失),这样在原始PCM数据部分丢失的情况下,编码出来的AAC数据播放时产生了倍速效应。

    解决方式:将PCM帧的帧长加长即可 160samples/frame--->480samples/frame

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。