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