EasyRTMP:RTMP直播推流安卓Android EasyRTMP介绍
EasyRTMP是什么?
EasyRTMP是由青犀开放平台开发的一套RTMP直播推送功能组件,内部集成了包括:基本RTMP协议、断线重连、异步推送、环形缓冲区、推送网络拥塞自动丢帧、缓冲区关键帧检索、事件回调(断线、音视频数据回调),通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送或者客户端流程,只需要调用EasyRTMP的几个API接口,就能轻松、稳定地进行流媒体音视频数据的推送,支持市面上绝大部分的RTMP流媒体服务器,包括Wowza、Red5、nginx-rtmp、crtmpserver等主流RTMP服务器,全平台支持:Windows、Linux、ARM(各种交叉编译工具链)、Android、iOS。
我们有专门的使用EasyRTMP library 实现的安卓版本的EasyRTMP,可直接将手机摄像头或者桌面以RTMP协议推送到相关服务器,简单易用、易于集成。EasyRTMP的APP界面如图所示:
可以看到,在首页有如下的功能元素:
- 切换分辨率
- 录像
- 切换摄像头
- 帧率码率显示
- 开启、关闭摄像头推送
- 开启、关闭屏幕推送
- 设置
在此逐一介绍下:
切换分辨率
切换分辨率,即切换摄像头的预览分辨率。
首先,通过如下方式获取到摄像头支持的分辨率:
```
List<Camera.Size> supportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
```
通过如下方式设置预览分辨率:
```
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
...
mCamera.setParameters(parameters);
```
切换分辨率时,先关闭预览重新设置分辨率,再开启预览即可:
```
mCamera.stopPreview();
// 设置新分辨率
...
mCamera.startPreview();
```
录像
录像是通过EasyMuxer来进行录像的,EasyMuxer是对MediaMuxer进行的一个封装,通过简单的一些接口即可进行便捷录像、更换文件、关闭录像等功能。同时,EasyMuxer可对PCM音频格式进行录像,这样任何类型的音频编码数据都可以在先解码后,再编成AAC来录像成MP4格式。EasyMuxer的介绍见博客文章:Android MediaMuxer录像(支持G711音频)
切换摄像头
切换摄像头跟切换分辨率类似,都是先把当前预览关闭再重新打开。不同的是,切换摄像头时,需要将摄像头release再重新open,而切换分辨率只用stopPreview再startPreview即可。
```
stopPreview();
destroyCamera();
if (mCameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
//现在是后置,变更为前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
createCamera();
startPreview();
break;
}
} else {
//现在是前置, 变更为后置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表摄像头的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
mCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
createCamera();
startPreview();
break;
}
}
```
显示帧率码率
为了方便处理,帧率码率的统计放在了推送端,即统计某一时间段内发送的视频帧数和字节数,然后除以时间段得出结果。这里使用EventBus POST出去即可,上层捕获到该Event后进行展示。
```
mTotal += length;
if (type == 1){
mTotalFrms++;
}
long interval = System.currentTimeMillis() - pPreviewTS;
if (interval >= 3000){
long bps = mTotal * 1000 / (interval);
long fps = mTotalFrms * 1000 / (interval);
Log.i(TAG, String.format("bps:%d, fps:%d", fps, bps));
pPreviewTS = System.currentTimeMillis();
mTotal = 0;
mTotalFrms = 0;
BUS.post(new StreamStat((int)fps, (int)bps));
}
```
上层捕获并显示:
```
@Subscribe
public void onStreamStat(final StreamStat stat) {
streamStat.post(new Runnable() {
@Override
public void run() {
streamStat.setText(getString(R.string.stream_stat, stat.fps, stat.bps / 1024));
}
});
}
```
开启、关闭摄像头推送
当未推送的时候,点击按钮即可发起推送,这时候初始化Pusher库,初始化成功后,得到Pusher句柄,后续的Push接口里会根据该值来判断是否进行真正的推送动作。
当推送开始时,点击按钮可关闭推送,相应地进行反初始化,这样在Push接口就不会进行推送了。
开启、关闭屏幕推送
推送屏幕主要在RecordService服务里进行的,点击推送按钮时先开启服务:
```
Intent intent = new Intent(getApplicationContext(), RecordService.class);
startService(intent);
```
具体来说,MediaProjection 类可以将当前屏幕画面采集到一个surface里面,而MediaCodec可以从一个surface里面获取视频数据源。我们让MediaProjection投射到MediaCodec创建的Surface,MediaCodec就可以获取到MediaProjection投射的视频了。
关闭屏幕推送时停止服务器,在服务内部 onDestory时反初始化相关资源。
有关屏幕推送的描述详见:
Android MediaMuxer录像(支持G711音频)
设置
设置里面的功能如下图所示:
- URL可以设置要推送的流地址,客户端亦可用改地址进行播放;
- 是否能使用摄像头后台采集?如果能用,推送将在APP转到后台时继续;
- 是否使用软编码?如果能用,那么app会使用x264软编码推送;
- 叠加水印如果能用, 那么视频上面会叠加一些水印信息(目前可现实文字水印,文字内容在APP内可以设置);
- 仅推送音频如果能用,那则不会推送视频,仅推送声音;
- 打开录像文件夹点击后会打开在APP内产生的录像片段,可以进行便捷查看;
- 版本号显示;
- 保存设置并推出设置界面。
使用EasyRTMP推流组件完整方案
EasyDSS商用流媒体服务器(下载地址)是EasyDarwin流媒体团队开发的一款支持视频点播、转码、RTMP推流直播、RTMP/HLS直播分发、服务端录像、录像检索、录像下载、时移回放的商用流媒体服务器,采用业界优秀的流媒体框架模式设计,服务运行高效、稳定、可靠、易维护,支持RTMP直播、RTMP推送、HTTP点播、HLS直播,并支持关键帧缓冲,画面秒开等多种特性,能够接入WEB、Android、iOS、微信等全平台客户端,是移动互联网时代贴近企业点播/直播需求的一款接地气的流媒体服务器,配套OBS、EasyRTMP等直播推流工具以及EasyPlayer等网络播放器,可以形成一套完整的视频直播、录播解决方案,满足用户在各种行业场景的流媒体业务需求。
上一篇: 动态数组
下一篇: linux nfs 网络共享