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
- FFmpeg 音频解码:应用buffer缓冲机制
- ffmpeg音频解码
- FFMPEG音频解码浅析
- FFmpeg - 音频解码过程
- FFmpeg - 音频解码
- FFMPEG 解码音频
- FFMPEG音频解码浅析
- ffmpeg 开源视、音频解码
- FFmpeg解码音频
- ffmpeg库音频解码示例
- ffmpeg 解码音频的方法
- ffmpeg库音频解码示例
- ffmpeg库音频解码示例
- ffmpeg库音频解码示例
- ffmpeg库音频解码示例
- ffmpeg 解码音频的方法
- ffmpeg库音频解码示例
- ffmpeg库音频解码示例
- Android 线性布局属性详解
- c#中TryParse()用法简介
- 使用VS插件在VS2012/2013上编辑和调试Quick-Cocos2d-x的Lua代码
- Mvvm Light Toolkit for wpf/silverlight系列之Command和Events
- Android性能优化典范
- FFmpeg 音频解码:应用buffer缓冲机制
- 将Ext JS 5应用程序导入Web项目中
- linux read/write和fread/fwrite有什么区别
- <span> 无法设置宽度的完美解决方案!
- UITableView 样式的自定义
- php输出时间差
- oracle的TM锁、TX锁
- Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动
- (function ($, undefined){ })(jQuery); 的使用及说明