ffmpeg的ac3实时编码处理及优化方案_第1页
ffmpeg的ac3实时编码处理及优化方案_第2页
ffmpeg的ac3实时编码处理及优化方案_第3页
ffmpeg的ac3实时编码处理及优化方案_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ffmpeg的ac3编码代码实现流程不难,基本都是一些固定的API调用,可自行查阅网上实例代码。虽然网上的大都是aac编码示例,但基本大同小异,可举一反三。而如果是在嵌入式设备平台上实现ac3编码的话,我们面临的更多是CPU性能优化问题和合理处理栈内存问题。建议先实现pcm文件编程成ac3文件,这样会基本了解文件读取处理,一些编码参数配置,以及编码封装处理流程。后续有需要的话自行改成实时流输出方案。/*填充/*填充pcm数据,由于海思只出单声道的数据,此处需构建为双声道的pcmstPcmDataNode.size=2*u32Len;//大小扩大到2倍stPcmDataNode.u64Ptsu64AudioPts//记录ptsstPcmDataNode.data=malloc(2*u32Len);//大小扩大到2倍for(u32II=0;u32II<u32Len;u32II+=2)//分两个通道填充pcm数据{memcpy((void*)(stPcmDataNode.data+2*u32II),(void*)&u8data[u32II],2);memcpy((void*)(stPcmDataNode.data+2*u32II+2),(void*)&u8data[u32II],2);}123456789这样处理转成的双声道数据,可能不是理想的立体声。二、音频格式及重采样旧ffmpeg版本的编码和解码接受的音频格式多数是S16(AV_SAMPLE_FMT_S16),是PackedFormat格式,就是左右两个声道是连续排列的,而ffmpeg新版本引进了新的排列格式AV_SAMPLE_FMT_S16P,AV_SAMPLE_FMT_FLTP,这些是PlaneFormat,左右声道是分开两个平面存储的(跟图像将Y,U,V分量分开三个平面存储的方式相似),这样就使处理流程变得复杂了,使原来的代码要改很多东西。AV_SAMPLE_FMT_S16的存贮方式如下图:AV_SAMPLE_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函数的定义如下:intintswr_convert(structSwrContext*s,uint8_t**out,intout_count,constuint8_t**in,intin_count);第一个参数是SwrContext结构体,第二个参数是输出数据保存的地方,第三个参数是out的大小,第四个参数是输入数据就是要待转换的数据,第五个参数是输入数据采样的个数。以下为构建一个音频重采样上下文SwrContext然后实现音频重采样处理:/*/*重采样pcm源数据处理*/asc=swr_alloc_set_opts(asc,av_get_default_channel_layout(channels),AV_SAMPLE_FMT_FLTP,inSsampleRate,//输出格式av_get_default_channel_layout(channels),AV_SAMPLE_FMT_S16outSampleRate, //输入格式567891011121314151617180,0);if(!asc){AC3_ERROR_PRINT("swr_alloc_set_optsgotoac3_err;}ret=swr_init(asc);if(ret<0){AC3_ERROR_PRINT("swr_initerror:%d",ret);gotoac3_err;}indata[indata[0]=(uint8_t*)pstPcmDataNode‐>data;//pcm数据输入intlen=swr_convert(asc,frame‐>data,frame‐>nb_samples,indata,pstPcmDataNode‐>size);if(len<0){AC3_ERROR_PRINT("swr_converterror");gotoac3_err;}19202122232425经过上面处理后的frame->data可作为下一级编程处理所需的输入数据。三、CPU性能优化无论是在进行ac3编码输出文件,还是输出给后一级的音视频复用通道。监控到CPU使用率一直占到70%~80%,这样再加其他进程处理,很容易使CPU使用率爆满,严重影响实时流质量:音视频不同步,有杂音,还可能会直接报段错误,导致进程退出。因此,在实现正常地编码输出前,我们有必要提高CPU性能。可从以下三方面着手:ffmpeg编译时启用相应的优化项ffmpeg提供了一些优化项,其中重点的就有VFP和NEON,即支持基于向量的浮点运算和加速多媒体和信号处理算法。由于音频编码会涉及大量浮点运算,可打开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-avx2\APP编译时启用CPU自身的优化项项目用的是海思平台Hi3516A,它具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,所有Hi3516A板端代码编译时需要在Makefile里面添加以下命令:CFLAGS+=-mcpu=cortex-a7-mfloat-abi=softfp-mfpu=neon-vfpv4CXXFlAGS+=-mcpu=cortex-a7-mfloat-abi=softfp-mfpu=neon-vfpv4其中CXXFlAGS中的XX根据用户Makefile中所使用宏的具体名称来确定,e.g:CPPFLAGS。ffmpeg代码处理优化把一些只需要初始化一次的变量全局化,减小接口内的局部变量,函数内联,这样可大幅度地缩小出入栈带来的系统开销,从而降低CPU的使用率。如:由于每次实时编码均处理一帧音频数据,可把AVCodecContext、AVCodec、AVFrame、AVPacket是资源应该及时回收,缓冲数据清空等处理。通过以上三方面的优化处理,整体性能提升了60%左右。四、ffmpeg的ac3编码命令行示例输入源test.pcm数据信息:单声道、采样率44100Hz、小端字节序、编码格式s16。ffmpeg‐y‐fs16le‐acffmpeg‐y‐fs16le‐ac1‐ar44100‐acodecpcm_s16le‐itest.pcmtest.ac31上面命令行有一点很奇怪,在选项-acodecpcm_s16le中,为何不指定为ac3呢?其实,从以下实际命令行运行打印可看出:pcm数据编码成ac3,需要经过两个编码器组件:Lavf57.56.101和Lavf57.64.101ac3,而音频格式从s16转成fltp,编码格式从pcm_s16le到最终的ac3。可见,ffmpeg命令处理时,先

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论