webrtc集成video_engine模块,该模块中集成video_capture,video_send,video_render,video_reveive以及video_render等模块,根据截取视频流的不同目的可以在不同的模块中截取,如需截取采集端的视频流保存,只需capture后截取视频流就可以了,如果要接收端截取视频流的话就要在reveive端拿到视频流了,但是在reveive拿到的是未解码的数据流,很难进行处理,因此如果可以在绘制端拿到解码后的数据流就不用对再进行解码,直接保存为可查看的视频或者图像就好了。
本次主要总结webrtc拿到数据后的在各个终端的保存显示模块,且主要针对264编解码的条件下进行的,终端主要包括:1、android手机端;2、ios手机端;3、pc端;4、android TV端。其中android手机端和ios手机端以及pc端都是软件编解码android TV端是硬件编解码,硬件编解码时不能再render模块拿到解码后的码流的,所以只能在reveive端拿到码流,然后进行解码保存为可以观看的视频或者图像。
本次主要讲述在接收端截取视频流保存为图像的功能,针对前三种软编的情况,可以在render端拿到解码后的视频流保存,webrtc集成了各个终端的render模块,在解码成为I420帧后进行保存就好了,保存bmp图像简单一些,只需加入图像头就好了,但是bmp文件太大。保存jpeg相对麻烦一些,但是jpeg具有文件小,兼容性强的特点。下面简单介绍一下三种软编情况
下的终端保存jpg的方法:
1、android终端:android端在底层render端(video_render_surface_view)拿到解码后的I420数据后,在底层采用libyuv的ConvertFromI420函数,将I420数据转为RGB565类型数据,然后通过jni接口调用java端的保存jpeg函数bitmap.compress保存为jpg图像,bitmap存放的数据为通过jni接口传送的RGB565数据(此处涉及jni方法的调用,以及java端bitmap的创建和压缩为jpg的参数设置);
2、ios终端:ios端在video_render_ios_gles20的open_gles2