FFmpeg 音频解码:应用buffer缓冲机制
2015-01-20 11:20
459 查看
如需转载请注明出处!
之前文章有介绍,在FFmpeg成功编译并采用精简configure配置项方案后,成功实现了所需音频格式的解码,并开发实现了解码器的demo,能够对本地的音频文件进行解码输出,限于项目属性不便公开源码。为了实现解码器同播放器的衔接,需要实现decoder的buffer 缓冲解码机制,即播放器传递音频压缩数据给decoder,decoder解码后将PCM数据输出。
流程如下图所示:
实现过程中有查阅相关资料,结合测试发现在FFmpeg编译配置protocol时,该解码场景只需要configure protocol=file即可。同时参考了FFmpeg 雷神的提示,主题部分如下:
Code scope:
在编译解码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
根据上述代码段,在FFmpeg编译configure时,尝试了将-enable-memalign-hack 选项去掉,发现能正常工作了。不过,暂时还不清楚为什么会这样~~~
从逻辑上来讲,--enable-memalign-hack是指编译时,使用内存对齐方式,这样以便编译时用mmx或者sse指令对代码进行优化。对内存访问是没有逻辑影响的,后续需要关注下。
之前文章有介绍,在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指令对代码进行优化。对内存访问是没有逻辑影响的,后续需要关注下。
相关文章推荐
- 【FFmpeg 3.x API应用三】音频解码
- 音频编解码应用系统设计(二)
- [转]ffmpeg库音频解码示例
- iOS开发 ( iPhone/iPad):利用ffmpeg 实现音频解码、声音播放
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(2)
- ffmpeg库音频解码示例
- DirectX的Vertex Buffer顶点缓冲的理解和应用 Shader必知必会
- ffmpeg库音频解码示例
- Node.js高级编程:用Javascript构建可伸缩应用(4)2.4 核心API基础-使用Buffer处理,编码,解码二进制数据
- 使用ffmpeg解码音频文件到PCM格式
- ffmpegMP3音频格式解码的优化
- FFmpeg浅尝辄止(四)——音频的解码和编码
- ffmpeg库音频解码示例
- ffmpeg--音频的解码和编码
- ffmpeg 解码音频的方法
- ffmpeg库音频解码示例
- FFmpeg 视频、音频编解码的例子
- Android本地视频播放器开发--ffmpeg解码视频文件中的音频(1)
- ffmpeg解码音频数据时,进行重采样(即改变文件原有的采样率)