搜索本产品文档关键词
特效直播
所有文档
menu

智能视频SDK

特效直播

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

上一篇
互动直播
下一篇
超低延时直播