begeekmyfriend / yasea

RTMP live streaming client for Android
MIT License
4.86k stars 1.32k forks source link

小屏幕推流导致拉流清晰度低 #854

Open whb-create opened 1 year ago

whb-create commented 1 year ago

您好,请问一下,因为获取到的视频帧数据是预览帧,导致小屏幕获取的帧数据比较小,如果要提高清晰度到1080,该怎么处理呢

begeekmyfriend commented 1 year ago

预览是从手机摄像头获取的图像,所以关键是摄像头是否支持1080p大小的分辨率,如果不支持那么也就无从处理。

whb-create commented 1 year ago

预览是从手机摄像头获取的图像,所以关键是摄像头是否支持1080p大小的分辨率,如果不支持那么也就无从处理。

从camera的支持参数可以获取到,录制视频支持的参数最高可以达到1920*1080,但是预览支持的最高参数是和屏幕大小一样的,我现在的设备很小,所以支持的预览参数只有标清的480p。那是不是说明摄像头不支持1080p的数据,或者说我是否应该在获取到480p的回调帧数据之后类似于使用ffmpeg或者neon去进行放大处理才是正确的选择。

whb-create commented 1 year ago

预览是从手机摄像头获取的图像,所以关键是摄像头是否支持1080p大小的分辨率,如果不支持那么也就无从处理。

从camera的支持参数可以获取到,录制视频支持的参数最高可以达到1920*1080,但是预览支持的最高参数是和屏幕大小一样的,我现在的设备很小,所以支持的预览参数只有标清的480p。那是不是说明摄像头不支持1080p的数据,或者说我是否应该在获取到480p的回调帧数据之后类似于使用ffmpeg或者neon去进行放大处理才是正确的选择。

因为在Android提供的mediarecorder可以设置1920*1080的视频,录制清晰度也高很多,但是当我需要获取帧数据,再使用Android提供的mediacodec硬编码就发现,传递到编码器的数据会直接影响输出数据,但是因为小屏幕的原因,只能输入预览的帧数据,也就是获取到的480p大小的btye数据进行编码。所以我很疑惑,为什么高度封装的mediarecorder录制的视频可以不在意屏幕预览的分辨率去录制视频。

begeekmyfriend commented 1 year ago

既然摄像头支持1080p那么推流数据是可以达到该分辨率的,SrsCameraView.java里面调用OpenGL ES,所以获取的数据实际上是在FBO里面,你可以看glReadPixels读取数据的分辨率,这是实际数据大小,SrsCameraView.java会从FBO的软件缓存中去拿数据加入mGLIntBufferCache队列,再用异步线程从mGLIntBufferCache队列里面送往编码器

whb-create commented 1 year ago

既然摄像头支持1080p那么推流数据是可以达到该分辨率的,SrsCameraView.java里面调用OpenGL ES,所以获取的数据实际上是在FBO里面,你可以看glReadPixels读取数据的分辨率,这是实际数据大小,SrsCameraView.java会从FBO的软件缓存中去拿数据加入mGLIntBufferCache队列,再用异步线程从mGLIntBufferCache队列里面送往编码器

通过glReadPixels获取到的mGLFboBuffer数据大小打印出来其实还是480p的数据长度,直播流程是没有问题的,因为直播数据采集设备是类似于行车记录仪这样的小型设备,直播到网页上显示,网页显示画面清晰度会很低,我目前正在寻找,是否可以将摄像头获取到的yuv数据进行扩充,从而提高分辨率?因为其实从camera回调开始打印数据传递过程中的大小,一直到网页显示,数据都是480p长度的数据,没有变化,那最大的可能就是需要对采集到的数据进行扩充处理了。

begeekmyfriend commented 1 year ago

yasea的c++代码里是有libyuv的,不过需要你自己定制。