webrtc 截取视频流

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_gles20函数中拿到I420的数据,然后采用ios集成的yuvtoimage方法将I420的数据保存到UIImage中,然后UIImageJPEGRespresentation函数保存为jpg图像,最后UIImageWriteToSavedPhotosAlbum保存到系统相册中;
3、windows终端:同样在render里面拿到I420数据,调用FFmpeg的函数将I420数据压缩为jpeg数据保存起来(涉及到的知识点为怎样引入FFmpeg库,以及I420数据的宽高和stride不一致的问题);

以上为软件编解码可以在render端拿到解码后的I420的数据时保存为图像的方法,但是在android TV端采用是硬件编解码拿不到解码后的I420数据,因为硬件编解码一般是解码和显示在一体的,解码后直接opengl显示了。因此只能在接收端拿到编码后的码流数据,当需要截流保存图像时就在此处拿申请I帧,拿到I帧的数据后放入解码器进行解码(此处的解码器为自己新建的软件解码器)解码后的数据保存就可以用到android端软件编解码的保存图像流程保存为jpg图像(此处会用到线程创建和结束,解码器创建等知识点)。

你可能感兴趣的:(学习)