一、前言
在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进行二次处理,例子中主要使用了对每一帧数据进行格式转化:NV21转化成ARGB格式,然后生成一张图片,然后添加水印效果。那么本文就来开始介绍如何将摄像头视频源数据的每一帧进行二次处理,然后推流到服务端。推流现在有很多种方式,但是更多的是基于FFMpeg,而现在各个云服务平台已经推出了直播SDK了,本文就来介绍一下金山云SDK,看看如何使用金山云SDK来进行推流,但是在使用之前,我们肯定得先了解他的原理,不过先来看一张效果图:
看到了吧,这里使用手机后置摄像头采集数据,然后推流到服务端,然后本地使用VLC进行观看,因为制作gif的关系,所以画面会有点模糊和卡顿。并不是是本生视频数据采集和推流造成的。
二、分析金山云SDK的功能
上面也看到效果,下面就来分析他的实现原理,因为他只有demo,和几个jar包,而文档写的也是很简单:
那么本文就采用反编译的方法来解读他的jar文件,他有三个jar包:
本文只看直播推流工具包ksylive3.0.jar,这里还可以看到了,他有一些so文件,有两个文件比较起眼,一个是libksystreamer.so他是底层的推流核心功能,我们使用IDA打开查看其native方法:
看到了,这里和Java层的FFmpegWrapper类交互,推流编码等核心功能就在这里实现了,而这里会看到他底层使用了现阶段开源的视频编解码工具类FFmpeg,以及添加水印等视频二次处理效果。
还有一个就是libksyyuv.so,这个主要是用于YUV数据格式转化,在之前的一篇文章中介绍了,获取到视频的每一帧数据之后是需要做格式转化的,但是这些转化工作放在Java层效率是个问题,一般都会放到native层做处理的。
三、金山云SDK的核心类
在讲解他的原理实现之前,先来看一下SDK的简单用法吧,用法很简单,
1、KSYStreamer类,进行编码推流。
2、KSYBgmPlayer类,是播放背景音乐流,可以在推流的过程中给视频添加背景音乐。
3、KSYMediaPlayer类,播放流类,这个类主要适用于画中画效果的。
4、KSYStreamerConfig.Builder类,设置推流的配置信息类。
第一个:KSYStreamerConfig.Builder类
KSYStreamerConfig.Builder builder = new KSYStreamerConfig.Builder();
1、setmUrl方法:设置推流地址
2、setFrameRate方法:设置推流帧率
3、setMaxAverageVideoBitrate方法:设置最高码率,即目标码率
4、setMinAverageVideoBitrate方法:设置最低码率
5、setInitAverageVideoBitrate方法:设置初始码率
6、setAudioBitrate方法:设置音频码率
7、setVideoResolution方法:设置推流视频的尺寸:360P/480P/540P/720P
8、setEncodeMethod方法:设置视频编码方式:硬编码/软编码
9、setSampleAudioRateInHz方法:设置音频的频率
10、setDefaultLandscape方法:设置推流视频方向:横屏/竖屏
11、setFrontCameraMirror方法:设置摄像头方向:前置/后置
第二个:KSYStreamer类