FFmpeg 音频解码:应用buffer缓冲机制

来源:互联网 发布:人工智能自然语言处理 编辑:程序博客网 时间:2024/06/17 17:38

如需转载请注明出处!


之前文章有介绍,在FFmpeg成功编译并采用精简configure配置项方案后,成功实现了所需音频格式的解码,并开发实现了解码器的demo,能够对本地的音频文件进行解码输出,限于项目属性不便公开源码。为了实现解码器同播放器的衔接,需要实现decoder的buffer 缓冲解码机制,即播放器传递音频压缩数据给decoder,decoder解码后将PCM数据输出。

 
流程如下图所示:





实现过程中有查阅相关资料,结合测试发现在FFmpeg编译配置protocol时,该解码场景只需要configure protocol=file即可。同时参考了FFmpeg 雷神的提示,主题部分如下:

Code scope:

FILE *fp_open;int fill_iobuffer(void * opaque,uint8_t *buf, int buf_size){  if(!feof(fp_open)){  int true_size=fread(buf,1,buf_size,fp_open);  return true_size;  }else{  return -1;  }  }  int main(){............unsigned char * iobuffer=(unsigned char *)malloc(32768);  AVIOContext *avio =avio_alloc_context(iobuffer, 32768,0,NULL,fill_iobuffer,NULL,NULL);  pInFmtCtx->pb=avio;  if (avformat_open_input(&pInFmtCtx, "nothing", NULL, NULL) != 0)<span style="white-space:pre"></span>printf("avformat_open_input error");............while (av_read_frame(pInFmtCtx, &packet) >= 0){    //decode wok}


在编译解码demo并链接FFmpeg库文件是能够通过,但是运行时总是报错(直接解码本地文件方式不会有此错误):

Assertion v>0 && v<=(0 ? 32 : 16) failed at libavutil/mem.c:226
Aborted (core dumped)

这个问题排查了很久,尝试protocol添加data和cache还是不行。


出错代码段:
libavutil/mem.c:226

void av_free(void *ptr){#if CONFIG_MEMALIGN_HACK    if (ptr) {        int v= ((char *)ptr)[-1];        av_assert0(v>0 && v<=ALIGN);        free((char *)ptr - v);    }#elif HAVE_ALIGNED_MALLOC    _aligned_free(ptr);#else    free(ptr);#endif}

根据上述代码段,在FFmpeg编译configure时,尝试了将-enable-memalign-hack 选项去掉,发现能正常工作了。不过,暂时还不清楚为什么会这样~~~

从逻辑上来讲,--enable-memalign-hack是指编译时,使用内存对齐方式,这样以便编译时用mmx或者sse指令对代码进行优化。对内存访问是没有逻辑影响的,后续需要关注下。


0 0