博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android手机H264软编码参数优化
阅读量:4183 次
发布时间:2019-05-26

本文共 1611 字,大约阅读时间需要 5 分钟。

做了一段时间的视频后,最先碰到的是花屏,解码端丢包的花屏,先是通过抓取编码后的BITMAP,发现解码出来就是花屏的,所以考虑优化编码来减少因为丢包产生的花屏;另外调整丢包策略规避解码花屏的问题.

1、X264编码参数调整:

H264 FF_PROFILE_H264_BASELINE、 FF_PROFILE_H264_MAIN两种编码差异,其中最明显的差异是profile_idc_baseline没有B帧,而profile_idc_main带B帧,这个差异体现在解码时,带B帧的不仅依赖之前的帧,还依赖之后到来的帧,通常在实时视频类应用中不建议带B帧的编码。

质量和码率控制:

最开始也是用bit_rate 来控制:

encoder.context->bit_rate = (self->encoder.max_bw_kpbs * 1024);// bps

bit_rate是平均码率,总是达不到理想的结果(包括编码后的视频帧大小和质量),后来查看网上关于移动设备X264编码优化,提到了通过CRF来控制质量和码率,认为: x264默认是使用”crf”压缩,  默认值为23, 代表了编码速度,画质与码流的均衡.并且对各种取值做了编码大小和帧率的比较: 

ultrafast baseline crf 28
encoded 467 frames, 58.94 fps, 515.58 kb/s 2006474

superfast baseline crf 26
encoded 467 frames, 41.73 fps, 460.02 kb/s 1790244

superfast baseline crf 28
encoded 467 frames, 43.64 fps, 366.28 kb/s 1425436

配置crf

[cpp]   
  1. if((ret = av_opt_set_double(self->encoder.context->priv_data, "crf", (double)30, 0))){  
  2.             TSK_DEBUG_ERROR("Failed to set x264 crf 28.0");  
  3.         return;  
  4. }  
  5. //ultrafast veryfast superfast  
  6. if((ret = av_opt_set(self->encoder.context->priv_data, "preset""superfast", 0))){  
  7.     TSK_DEBUG_ERROR("Failed to set x264 preset to veryfast");  
  8. }  


编码后视频NALU单元大小控制:

[cpp]   
  1. encoder.context->rtp_payload_size = H264_RTP_PAYLOAD_SIZE;//H264_RTP_PAYLOAD_SIZE大小为1300  
  2. if((ret = av_opt_set_int(self->encoder.context->priv_data, "slice-max-size", H264_RTP_PAYLOAD_SIZE, 0))){  
  3.     TSK_DEBUG_ERROR("Failed to set x264 slice-max-size to %d", H264_RTP_PAYLOAD_SIZE);  
  4. }  

两个I帧之间帧个数的控制:

encoder.context->gop_size = TMEDIA_CODEC_VIDEO(self)->out.fps * TDAV_H264_GOP_SIZE_IN_SECONDS

2、丢包策略:

基于BP的H264编码,P帧只依赖之前的帧就能解码,所以出现丢包时的处理策略会比较简单,如果发现有P帧丢了,则丢弃后面的所有P帧,直到有I帧到来;如果是I帧丢了,则丢弃I帧及之后的P帧,直到有I帧到来。

转载地址:http://rczoi.baihongyu.com/

你可能感兴趣的文章
《Android系统学习》之bug定位
查看>>
《Linux内核编程》第七章:USB CORE与USB键鼠驱动
查看>>
《Android系统学习》之JAVA与C混合编程——JNI
查看>>
《C预处理》之#ifndef
查看>>
《Linux内核编程》第十三章:Linux对进程内存的二级页式管理
查看>>
ARM协处理器
查看>>
《miniOS分析》前言
查看>>
《Linux内核编程》第十四章:Linux驱动基础
查看>>
Linux平台下ARM-Linux交叉编译工具链
查看>>
Window平台下ADS自带ARMCC编译工具链
查看>>
micro2440/tiny6410使用JLINK直接烧录nand flash
查看>>
C编译器、连接器与可执行机器码文件
查看>>
android linker 浅析
查看>>
802.11 traffic id
查看>>
Android系统wifi分析-手动连接过程
查看>>
设置IP别名Shell脚本
查看>>
Source Insight 宏-单行注释
查看>>
levelDB源码分析-Arena
查看>>
levelDB源码分析-SSTable
查看>>
平滑升级Nginx的Shell脚本
查看>>