特效直播
更新时间:2020-12-11
ARMediaStreamingPusher类控制AR直播推流的执行。内部封装这一套完整的音视频编码,打包,上传等功能。 其中AR直播管理类包含通用推流接口、及AR控制接口两部分。
1.1 AR直播实现流程
整个推流流程涉及的调用包括:AR推流器初始化、直播创建与销毁、直播状态控制、拍摄器与AR设置、及推流体验优化及状态访问五部分。
AR 直播关键步骤示例,具体可参考demo工程AnchorARActivity.java文件。
Plain Text
1// 初始化AR直播推流器
2mSession = new ARMediaStreamingPusher(this, mGlSurfaceView, liveConfig);
3// 设置直播事件监听
4mSession.setLiveEventListener(this);
5
6// 初始化音视频采集设备
7mSession.setupDevice(mOnCaptureReadyCallback);
8// 配置推流地址、创建推流通道
9mSession.configRtmpSession(mPushUrl);
10// 在拍摄器就绪(onVideoCaptureReady)且推流通道连接后开始推流
11public void onSessionConnected() {
12 ... ...
13if (mIsVideoCaptureReady && mIsLiveConnected) {
14 // 开始推流
15 mSession.startStreaming();
16 }
17}
18 ... ...
19// 退出直播 释放直播通道
20// 停止推流
21mSession.stopStreaming();
22// 销毁推流通道
23mSession.destroyRtmpSession();
24// 释放音视频采集设备
25mSession.releaseDevice();
1.2 AR推流器初始化
配置推流参数
Plain Text
1LiveConfig.Builder builder = new LiveConfig.Builder();
2builder.setCameraId(Camera.CameraInfo.CAMERA_FACING_FRONT) // 设置前置相机
3 .setCameraOrientation(90) // 设置相机旋转角度
4 .setVideoWidth(mWidth) // 设置视频采集与输出宽度(像素)
5 .setVideoHeight(mHeight) // 设置视频采集与输出高度(像素)
6 .setOrientation(mOrientation) // 设置屏幕方向
7 .setVideoFPS(mFps) // 设置视频采集与输出帧率
8 .setInitVideoBitrate(mBitrate) // 设置视频码率初始比特率
9 .setQosEnabled(mEnableAutoBitrate) // 设置是否开启码率自适应
10 .setMaxVideoBitrate(mMaxBitrate) // 设置码率自适应最大比特率
11 .setMinVideoBitrate(mMinBitrate) // 设置码率自适应最小比特率
12 .setVideoEnabled(true) // 设置是否推视频流
13 .setAudioEnabled(true) // 设置是否推音频流
14 .setAudioSampleRate(44100) // 设置音频采样率
15 .setAudioBitrate(64000); // 设置音频比特率
16
17builder.setPicStreamingEnabled(true); // 使能后台推流
18if (mOrientation == LiveConfig.PORTRAIT) {
19 builder.setPausePicPath("pause_streaming_portrait"); // 设置竖向暂停图片
20} else {
21 builder.setPausePicPath("pause_streaming_land"); // 设置横向暂停图片
22}
初始化AR直播推流器
Plain Text
1/**
2 * AR媒体推流器构造函数
3 * @param context 上下文环境
4 * @param surfaceView 本地预览视窗
5 * @param liveConfig 推流配置
6 */
7public ARMediaStreamingPusher(Context context, GLSurfaceView surfaceView, LiveConfig liveConfig)
注:AR 推流器使用GLSurfaceView 作用本地预览控件
设置直播事件监听
Plain Text
1// 直播事件监听
2public interface OnLiveEventListener {
3 /**
4 * 直播通道已经建立
5 */
6 void onSessionConnected();
7 /**
8 * 直播过程中出错
9 *
10 * @param errorCode 错误码
11 */
12 void onError(int errorCode);
13}
14
15// 错误码定义:
16public interface BidirectRtmpEventListener {
17 int ErrorCodeBase = -10000;
18 //与服务器建立rtmp连接过程出错
19 int ErrorCodeConnectToServerFailed = -10000;
20// 创建rtmp推流通道出错
21 int ErrorCodePulishStreamFailed = -20000;
22 //Disconnect过程中出错
23 int ErrorCodeDisconnectFromServerFailed = -30000;
24 // 推流过程中,遇到未知错误导致推流失败
25 int ErrorCodeUnknownStreamingError = -60000;
26 /**
27 * 推流过程中,遇到弱网情况导致推流失败
28 * 收到此错误后,建议提示用户当前网络不稳定,
29 * 如果反复收到此错误码,建议调用停止推流
30 */
31 int ErrorCodeWeakConnection = -70000;
32 // Try again 重试
33 int ErrorCodeWeakConnection_EAGAIN = -70011;
34 // No buffer space available 没有可用的缓存空间
35 int ErrorCodeWeakConnection_ENOBUFS = -70105;
36 // Interrupted system call 中断的系统调用
37 int ErrorCodeWeakConnection_EINTR = -70004;
38 // Connection timed out 连接超时
39 int ErrorCodeWeakConnection_ETIMEDOUT = -70110;
40 /**
41 * 推流过程中,遇到服务器网络错误导致推流失败
42 * 收到此错误后,建议调用立即停止推流,并在服务恢复后再重新推流
43 */
44 int ErrorCodeServerNetworkError = -80000;
45 // Connection reset by peer 连接被对方复位
46 int ErrorCodeServerNetworkError_ECONNRESET = -80104;
47 /**
48 * 推流过程中,遇到设备断网导致推流失败,
49 * 收到此错误后,建议提示用户检查网络连接,然后立即停止推流
50 */
51 int ErrorCodeLocalNetworkError = -90000;
52 // Broken pipe 管道破裂
53 int ErrorCodeLocalNetworkError_EPIPE = -90032;
54 // Bad file number 错误文件编号
55 int ErrorCodeLocalNetworkError_EBADF = -90009;
56 // Network is down 网络已关闭
57 int ErrorCodeLocalNetworkError_ENETDOWN = -90100;
58 // Network is unreachable 网络不可达
59 int ErrorCodeLocalNetworkError_ENETUNREACH = -90101;
60 // License 失效
61 int ErrorCodeLicenseInvalid = -100000;
62 ... ...
63}
64
65// 设置直播事件监听
66public void setLiveEventListener(OnLiveEventListener listener)
1.3 直播创建与销毁
初始化音视频采集设备
Plain Text
1/**
2 * 拍摄器初始化回调
3 */
4public interface OnCaptureStateListener {
5 //拍摄头尺寸变化
6 void onCameraSizeChange(int width, int height);
7
8 // 摄像头开启状态
9 void onCameraOpenResult(boolean var1);
10
11 // 拍摄器就绪回调接口
12 void onVideoCaptureReady(boolean success);
13}
14
15// 初始化音视频采集设备
16public void setupDevice(VideoCaptureSession.OnCaptureStateListener callback)
配置推流地址、创建推流通道
Plain Text
1/**
2 * 创建rtmp推流通道
3 * @param pushUrl 推流地址
4 * @return 推流通道创建是否成功
5 */
6public boolean configRtmpSession(String pushUrl)
销毁直播通道
Plain Text
1// 销毁推流通道
2public void destroyRtmpSession()
释放媒体采集设备
Plain Text
1// 释放音视频采集设备
2public void releaseDevice()
1.4 直播状态控制
开始推流
Plain Text
1// 启动音视频编码 开始推流
2public void startStreaming()
暂停推流
Plain Text
1// 暂停推流, 如配置使能后台推流则开启图片推流否则暂停推流
2public void pauseStreaming()
注:如使能了后台推流,则调用该接口进行图片推流,否则暂停音视频推流。
恢复推流
Plain Text
1//恢复推流
2public void resumeStreaming()
注:若如使能后台推流则停止图片推流恢复正常推流
结束推流
Plain Text
1//关闭音视频编码器、结束推流
2public void stopStreaming()
1.5 推流体验优化及其它
推流重连
Plain Text
1// 推流重连
2public void sessionReconnect()
3
4示例: 在推流事件监听错误回调里根据错误类型发起推流重连。
5public void onError(int errorCode) {
6 ... ...
7 // 非直播授权失效异常下发起外部重连
8 if (errorCode != BidirectRtmpEventListener.ErrorCodeLicenseInvalid) {
9 mSession.sessionReconnect();
10 }
11}
配置推流水印
Plain Text
1WaterMarkConfig waterMarkConfig = new WaterMarkConfig("baidu_watermark", 100, 100, 0.04f, 0.98f);
2mSession.setWaterMarkConfig(waterMarkConfig);
背景音乐 推流状态开启/关闭背景音乐,相关接口:
Plain Text
1/**
2 * 开始播放背景音乐
3 * @param bgmPath 背景音乐本地路径
4 * @param isLooping 是否循环播放
5 */
6public void startBGM(String bgmPath, boolean isLooping)
7
8/**
9 * 选择背景音乐区间, 默认从0 播放整首音乐
10 *
11 * @param clipStartInUSec 微秒
12 * @param clipDurationInUSec 微秒
13 */
14private void configBGMClip(long clipStartInUSec, long clipDurationInUSec)
15
16/**
17 * 设置本地mic采集音量的大小,默认是 1f
18 *
19 * @param gain 范围在 0f 到 1f 之间
20 */
21public void setRecordTrackGain(float gain)
22
23/**
24 * 设置背景音量的大小,默认是 1f
25 *
26 * @param gain 范围在 0f 到 1f 之间
27 */
28public void setBGMTrackGain(float gain)
29
30// 暂停播放背景音乐
31public void pauseBGM()
32
33// 恢复背景音乐播放
34public void resumeBGM()
35
36// 停止播放背景音乐
37public void stopBGM()
音视频源外部采集 直播SDK支持从外部导入音视频数据源,使用外部采集首先须使能音视频外部采集,然后分别使用如下接口开启视频外部采集、更新外部视频纹理(当前仅支持视频纹理输入方式)、更新音频数据(pcm 格式)。
Plain Text
1/**
2 * 开始外部视频采集, 有外部渲染控制
3 * @param eglContext 外部视频渲染EglContext, sdk内部依赖eglconect 获理视频纹理
4* @note 该接口一般在外部渲染器创建成功回调函数里调用
5 */
6@Override
7public void startExtVideoDevice(EGLContext eglContext)
8
9/**
10 * 外部纹理更新导入接口
11 * @param textureId 外部视频纹理id
12 * @param width 预览视频宽度
13 * @param height 预览视频高度
14 */
15public void onExtTextureUpdate(int textureId, int width, int height)
16
17/**
18 * 外部音频pcm 数据导入接口
19 * @param bufferData 音频pcm数据
20 * @param bufferInfo 音频数据信息
21 */
22public void onExtAudioFrameUpdate(ByteBuffer bufferData, MediaCodec.BufferInfo bufferInfo)
媒体采集数据回调 推流器支持将内部采集的音频数据(pcm)及视频数据(yuv nv21 / textureId)对外输出。
静音推流 推流过程关闭/开启音频流
Plain Text
1/**
2 * 是否静音推流
3 * @param isMute 是否静音
4 */
5public void setMuteAudio(boolean isMute)
获取推流帧率
Plain Text
1// 获取视频上传帧率
2public double getUploadFps()
获取推流码率
Plain Text
1// 获取媒体发送码率
2public double getUploadBindwidthInKBps()
获取推流缓冲区水位
Plain Text
1// 获取推流缓冲区百分比
2public double getPacketCacheRate()
1.6 推流器(协议)选择
Rmtp推流器:ARMediaStreamingPusher
SRT推流器:SrtMediaStreamingPusher
SRT + AR推流器:ARSrtMediaStreamingPusher