5.2 Yasea框架介绍
我们这里介绍的推流工作,借鉴于对Yasea来完成。Yasea是一个Android流媒体客户端,它通过移动设备的摄像机和麦克风,把YUV和PCM的视频、音频数据编码,转码为H.264 / AAC的形式,然后把H.264和AAC的数据封装到FLV中,并通过RTMP协议发送到服务器上进行传输。
特性列表
- Android Min API 21 (Android 4.1 Jelly Bean)
- 同时支持 H.264/AAC 硬编码和软编码
- RTMP 推流,事件状态回调
- 手机横竖屏动态切换
- 前后摄像头热切换
- 推流过程随时录制 MP4 ,支持暂停和恢复
- 实时美颜(磨皮)滤镜
框架分析
我们可以先到GitHub上下载源码看一下,项目的下载地址是https://github.com/begeekmyfriend/yasea ,下载完成后我们在Android Studio中导入进来,导入过程中可能会出现SDK等编译错误,大家自行修改一下,这里我们就不详细介绍解决办法了,下面我们先看一下源码里library下这个module的结构。
通过这个结构图大致可以看出源码部分,大致由assets、cpp、java、res组成。assets中主要放的是滤镜需要的图片文件;cpp中主要是JNI所需的文件;java文件夹下的net.ossrs.yasea放的是项目封装的核心代码文件,而com下放的是第三方开源项目SimpleRtmp、x264、Magicfilter、mp4parser等的代码;res下raw放的是滤镜所需要的一些核心文件。
使用介绍
我们集成的过程中主要用到的是net.ossrs.yasea包下yasea框架提供的方法,其他类、方法在这里就不给大家详细介绍了,大家感兴趣的话可以在GitHub上了解一下。具体使用过程中我们主要用到的是SrsCameraView和SrsPublisher类中的方法,下面我们给大家介绍一下这两个类中常用、重要的方法。
//设置编码状态的回调方法
public void setEncodeHandler(SrsEncodeHandler handler) {
mEncoder = new SrsEncoder(handler);
if (mFlvMuxer != null) {
mEncoder.setFlvMuxer(mFlvMuxer);
}
if (mMp4Muxer != null) {
mEncoder.setMp4Muxer(mMp4Muxer);
}
}
//设置录像状态的回调方法
public void setRecordHandler(SrsRecordHandler handler) {
mMp4Muxer = new SrsMp4Muxer(handler);
if (mEncoder != null) {
mEncoder.setMp4Muxer(mMp4Muxer);
}
}
//设置rtmp推流时状态回调
public void setRtmpHandler(RtmpHandler handler) {
mFlvMuxer = new SrsFlvMuxer(handler);
if (mEncoder != null) {
mEncoder.setFlvMuxer(mFlvMuxer);
}
}
//设置预览分辨率
public void setPreviewResolution(int width, int height) {
int resolution[] = mCameraView.setPreviewResolution(width, height);
mEncoder.setPreviewResolution(resolution[0], resolution[1]);
}
//设置推流分辨率
public void setOutputResolution(int width, int height) {
if (width <= height) {
mEncoder.setPortraitResolution(width, height);
} else {
mEncoder.setLandscapeResolution(width, height);
}
}
//设置传输率
public void setVideoHDMode() {
mEncoder.setVideoHDMode();
}
public void setVideoSmoothMode() {
mEncoder.setVideoSmoothMode();
}
//开启美颜(其他滤镜效果在MagicFilterType中查看,目前提供多种选择方案,如NONE,FAIRYTALE,SUNRISE,SUNSET,WHITECAT等)
public boolean switchCameraFilter(MagicFilterType type) {
return mCameraView.setFilter(type);
}
//打开摄像头,开始预览(未推流)
public void startCamera() {
mCameraView.startCamera();
}
//选择软编码
public void switchToSoftEncoder() {
mEncoder.switchToSoftEncoder();
}
//选择硬编码
public void switchToHardEncoder() {
mEncoder.switchToHardEncoder();
}
//开始推流 rtmpUrl
public void startPublish(String rtmpUrl) {
if (mFlvMuxer != null) {
mFlvMuxer.start(rtmpUrl);
mFlvMuxer.setVideoResolution(mEncoder.getOutputWidth(), mEncoder.getOutputHeight());
startEncode();
}
}
//stopPublish停止推流
public void stopPublish() {
if (mFlvMuxer != null) {
stopEncode();
mFlvMuxer.stop();
}
}