Android投屏帧率码率

录屏流程:

Display 可以“投影”到一个 VirtualDisplay
通过 MediaProjectionManager 取得的 MediaProjection创建VirtualDisplay
VirtualDisplay 会将图像渲染到 Surface中,而这个Surface是由MediaCodec所创建的
MediaMuxer 将从 MediaCodec 得到的图像元数据封装并输出到MP4文件中

SZ流程:

客户端原始帧编码为H264裸流(MediaCodec,Android API) —> 再封装为FLV格式的视频流(Java) —> 按照rtmp流媒体协议通过librtmp(JNI + C)推流到RTMP流媒体服务器 —> 客户端播放器解码观看

pedro流程:

在rtmp模块中,创建视频和音频的RTP数据包,将其封装在flv数据包中,然后发送到服务器。
该库使用MediaCodec Android类进行硬件编码。

帧率控制:

使用MediaProjection / VirtualDisplay 来进行录屏的话,官方并不提供帧率的控制(MediaFormat里面的.setFloat(MediaFormat.KEY_FRAME_RATE, fps);设置后,不准确),这需要用到OpenGL ES将VirtualDisplay中的surface进行绘制到MediaCodec中的surface。

中间加上一个surface作为缓冲,他的作用只能是限制最大帧率,而不能无缘无故增加帧。
比如你在一个静止页面,一秒只有3帧,那么最后也只能输出3帧。

帧是系统的 MediaProjection 丢出来的,屏幕刷新了,就有新的帧丢过来。以多少帧丢出来,是安卓决定的。
比如王者开30帧,那么页面只有30帧每秒丢过来。那么就算我加了opengl的缓存surface,设置输出最大60帧,那么最后也只有30帧的数据。



码率控制:

固定码率视频编码算法是通过利用缓冲器状态改变量化器步长来实现的。当图像细节丰富时,为了确保缓冲器不溢出,就得加大量化步长,减少编码比特数,从而保证输出码流的码率恒定。这是以牺牲视频质量为代价的。因为加大量化步长会损伤图像的高频细节和低频背景,甚至产生“块效应”和图像细节模糊现象。
MediaFormat里面的码率控制,设置的是平均码率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值