您的位置:首页 > Web前端

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

2015-01-20 11:20 459 查看
如需转载请注明出处!

之前文章有介绍,在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指令对代码进行优化。对内存访问是没有逻辑影响的,后续需要关注下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: