ffmpeg的ac3实时编码处理及优化方案.docx

上传人:暗伤 文档编号:96637248 上传时间:2024-02-01 格式:DOCX 页数:4 大小:75.99KB
返回 下载 相关 举报
ffmpeg的ac3实时编码处理及优化方案.docx_第1页
第1页 / 共4页
ffmpeg的ac3实时编码处理及优化方案.docx_第2页
第2页 / 共4页
点击查看更多>>
资源描述

《ffmpeg的ac3实时编码处理及优化方案.docx》由会员分享,可在线阅读,更多相关《ffmpeg的ac3实时编码处理及优化方案.docx(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、ffmpeg的ac3编码代码实现流程不难,基本都是一些固定的API调用,可自行查阅网上实例代码。虽然网上的大都是aac编码示例,但基本大同小异,可举一反三。而如果是在嵌入式设备平台上实现ac3编码的话,我们面临的更多是CPU性能优化问题和合理处理栈内存问题。建议先实现pcm文件编程成ac3文件,这样会基本了解文件读取处理,一些编码参数配置,以及编码封装处理流程。后续有需要的话自行改成实时流输出方案。/* 填充pcm数据,由于海思只出单声道的数据,此处需构建为双声道的pcm数据 */ stPcmDataNode.size = 2*u32Len; / 大小扩大到2倍stPcmDataNode.u6

2、4Pts = u64AudioPts; / 记录ptsstPcmDataNode.data = malloc(2*u32Len); / 大小扩大到2倍for(u32II = 0; u32II u32Len; u32II+=2) / 分两个通道填充pcm数据memcpy(void *)(stPcmDataNode.data+2*u32II), (void*)&u8datau32II, 2);memcpy(void *)(stPcmDataNode.data+2*u32II+2), (void*)&u8datau32II, 2);123456789以下重点说明关键处理和遇到问题的解决方案。一、单声

3、道pcm数据构建双声道处理这样处理转成的双声道数据,可能不是理想的立体声。二、音频格式及重采样旧ffmpeg版本的编码和解码接受的音频格式多数是S16(AV_SAMPLE_FMT_S16),是Packed Format格式,就是左右两个声道是连续排列的,而ffmpeg新版本引进了新的排列格式AV_SAMPLE_FMT_S16P,AV_SAMPLE_FMT_FLTP,这些是Plane Format,左右声道是分开两个平面存储的(跟图像将Y,U,V分量分开三个平面存储的方式相似),这样就使处理流程变得复杂了,使原来的代码要改很多东西。AV_SAMPLE_FMT_S16的存贮方式如下图:AV_SAM

4、PLE_FMT_FLTP的存储方式如下图:AV_SAMPLE_FMT_S16是非平坦的,左右声道以LRLR的方式连续的存在一个数组里面,AV_SAMPLE_FMT_FLTP是平坦的存贮方式,左右声道是分开存在两个数组里面的。如何将以 CHANNEL_IN_STEREO(双声道) ENCODING_PCM_16BIT(AV_SAMPLE_FMT_S16) 录制方式用ffmpeg 用AV_SAMPLE_FMT_FLTP编码为ac3音频数据?其实ffmepg 已经提供了这样的接口,就是swr_convert 函数。swr_convert 函数的定义如下:1 int swr_convert(struc

5、t SwrContext *s,2 uint8_t *out,3 int out_count,4 const uint8_t *in ,5 int in_count);第一个参数是SwrContext 结构体,第二个参数是输出数据保存的地方,第三个参数是out的大小,第四个参数是输入数据就是要待转换的数据,第五个参数是输入数据采样的个数。以下为构建一个音频重采样上下文SwrContext然后实现音频重采样处理:1 /* 重采样pcm源数据处理 */2 asc = swr_alloc_set_opts(asc,3 av_get_default_channel_layout(channels),A

6、V_SAMPLE_FMT_FLTP, inSsampleRate, /输出格式4 av_get_default_channel_layout(channels),AV_SAMPLE_FMT_S16, outSampleRate,/输入格式567891011121314151617180, 0);if (!asc)AC3_ERROR_PRINT(swr_alloc_set_opts failed); goto ac3_err;ret = swr_init(asc); if (ret data; /pcm数据输入int len = swr_convert(asc, framedata, frame

7、nb_samples, indata,pstPcmDataNodesize);if(len data可作为下一级编程处理所需的输入数据。三、CPU性能优化无论是在进行ac3编码输出文件,还是输出给后一级的音视频复用通道。监控到CPU使用率一直占到70%80%,这样再加其他进程处理,很容易使CPU使用率爆满,严重影响实时流质量:音视频不同步,有杂音,还可能会直接报段错误,导致进程退出。因此,在实现正常地编码输出前,我们有必要提高CPU性能。可从以下三方面着手:(1) ffmpeg编译时启用相应的优化项ffmpeg提供了一些优化项,其中重点的就有VFP和NEON,即支持基于向量的浮点运算和加速多媒

8、体和信号处理算法。由于音频编码会涉及大量浮点运算,可打开NEON组件和VFP组件,其它不作介绍。编译选项如下:-enable-inline-asm -enable-yasm -enable-asm -enable-shared -enable-gpl -enable-pthreads -enable-neon -enable-mipsfpu - enable-mmx -enable-mmxext -enable-sse -enable-sse2 -enable-sse3 -enable-ssse3 -enable-sse4 -enable- sse42 -enable-avx -enable-

9、avx2 (2) APP编译时启用CPU自身的优化项项目用的是海思平台Hi3516A,它具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,所有Hi3516A板端代码编译时需要在Makefile里面添加以下命令:CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 CXXFlAGS +=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 其中CXXFlAGS中的XX根据用户Makefile中所使用宏的具体名称来确定,e.g:CPPFLAGS。(3) f

10、fmpeg代码处理优化把一些只需要初始化一次的变量全局化,减小接口内的局部变量,函数内联,这样可大幅度地缩小出入栈带来的系统开销,从而降低CPU的使用率。如:由于每次实时编码均处理一帧音频数据,可把AVCodecContext、AVCodec、 AVFrame、AVPacket等全局化,而编码接口只保留音频重采样跟编码输出处理,需要注意的是资源应该及时回收,缓冲数据清空等处理。通过以上三方面的优化处理,整体性能提升了60%左右。四、ffmpeg的ac3编码命令行示例输入源test.pcm数据信息:单声道、采样率44100Hz、小端字节序、编码格式s16。ffmpeg y f s16le ac

11、1 ar 44100 acodec pcm_s16le i test.pcm test.ac31上面命令行有一点很奇怪,在选项-acodec pcm_s16le中,为何不指定为ac3呢? 其实,从以下实际命令行运行打印可看出:pcm数据编码成ac3,需要经过两个编码器组件:Lavf57.56.101和Lavf57.64.101 ac3,而音频格式从s16转成fltp,编码格式从pcm_s16le到最终的ac3。可见,ffmpeg命令处理时,先把pcm数据通过pcm_s16le编码处理成通用的pcm数据,可能经历了重采样处理。接着,再解析输出音频格式,若为ac3,则调用ac3编码处理成最终的ac3文件输出。这样就合理地解释为什么使用API时指定音频编码ID为AV_CODEC_ID_AC3,而命令行却用pcm_s16le。Author: Jiaqian.LinDate: 2019-4-17

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁