-
1.0.6
- 发布 ustreaming-1.0.6.jar
- 增加音频采集控制接口
-
1.0.5
- 发布 ustreaming-1.0.5.jar
- 修复偶现的编码器死锁问题
- 1.0.4
- 发布 ustreaming-1.0.4.jar
- 修复偶现的音画不同步问题
- 1.0.3
- 发布 ustreaming-1.0.3.jar
- 修复切换摄像头、图片推流可能导致的音视频不同步问题
- 修复弱网下重连可能导致的 ANR 问题
- 1.0.2
- 发布 ustreaming-1.0.2.jar
- 优化内置美颜实现方案
- 优化 Demo 进入预览界面自动推流
- 修复不严谨的鉴权逻辑
- 修复 Demo 进入后台,回到前台没有自动推流问题
- 1.0.1
- 发布 ustreaming-1.0.1.jar
- 修复连续调用
startStreaming
导致无法推流问题 - Demo 增加断线重连机制
- 1.0.0
- 发布 ustreaming-1.0.0.jar
- 支持标准 RTMP 推流
- 支持外置美颜
- 支持添加水印
- 把
release
目录下的jar
包拷贝到工程的libs
目录下 - 把
release
目录下的assets
文件夹下的内容拷贝到assets
目录下
- Android 4.4 (API 19) 及其以上
SDK 主要包含 demo 代码、jar 包,以及依赖的资源文件,说明如下:
文件名称 | 功能 | 大小 | 备注 |
---|---|---|---|
ustreaming-x.x.x.jar | SDK 库 | 209KB | 必须依赖 |
assets | 内置美颜资源文件 | 6KB | 不使用内置美颜可以去掉 |
打开工程目录下的 build.gradle
,添加如下依赖:
dependencies {
implementation files('libs/ustreaming-x.x.x.jar')
}
在 AndroidManifest.xml 中添加权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// 初始化 SDK 运行环境,建议在应用启动时调用
UStreamingEnv.init(context);
UStreamingManager mStreamingManager = new UStreamingManager();
mStreamingManager.setStreamingStateListener(this); // 推流过程中状态信息回调
mStreamingManager.setVideoFrameListener(this); // 视频数据回调
mStreamingManager.setAudioFrameListener(this); // 音频数据回调
mStreamingManager.setStatisticsInfoListener(this); // 推流过程中实时码率、帧率信息回调
// 摄像头采集参数
UCameraParam cameraParam = new UCameraParam();
cameraParam.setCameraId(UCameraParam.CAMERA_FACING_ID.FRONT);
cameraParam.setCameraPreviewSizeRatio(UCameraParam.CAMERA_PREVIEW_SIZE_RATIO.RATIO_16_9);
cameraParam.setCameraPreviewSizeLevel(UCameraParam.CAMERA_PREVIEW_SIZE_LEVEL.SIZE_480P);
// 麦克风采集参数
UMicrophoneParam microphoneParam = new UMicrophoneParam();
// 视频编码参数
UVideoEncodeParam videoEncodeParam = new UVideoEncodeParam();
videoEncodeParam.setEncodingSizeLevel(UVideoEncodeParam.VIDEO_ENCODING_SIZE_LEVEL.SIZE_480P_16_9); // 480x848
videoEncodeParam.setEncodingBitrate(800*1024); // 800kbps
// 音频编码参数
UAudioEncodeParam audioEncodeParam = new UAudioEncodeParam();
视频采集需要的预览窗口为 GLSurfaceView
或者其派生的类对象,可以配置在 Layout 文件中,也可以动态创建。
通过 prepare
把推流需要的参数配置到 SDK 中:
// 如果不使用内置美颜,beautyParam 可以传递 null
mStreamingManager.prepare(preview, cameraParam, microphoneParam, videoEncodeParam, audioEncodeParam, beautyParam);
// 通过 streamingUrl 传入 RTMP 推流地址
mStreamingManager.startPublish(streamingUrl);
SDK 的接口设计,遵循了如下的原则:
- 接口类均以
U
开头 - 参数类均以
UxxxParam
命名 - 回调类均以
UxxxListener
命名
类名 | 说明 | 备注 |
---|---|---|
UStreamingManager | 负责 RTMP 直播推流 | 无 |
类名 | 说明 | 备注 |
---|---|---|
UCameraParam | Camera 采集参数 | 无 |
UMicrophoneParam | 麦克风采集参数 | 无 |
UVideoEncodeParam | 视频编码参数 | 无 |
UAudioEncodeParam | 音频编码参数 | 无 |
类名 | 说明 | 备注 |
---|---|---|
UVideoFrameListener | 视频数据回调 | 纹理数据,支持第三方特效处理 |
UAudioFrameListener | 音频数据回调 | PCM 数据,支持音频处理 |
UStreamingStateListener | 用于监听推流过程中的状态变化 | 无 |
UStreamingManager
包含了 RTMP 直播推流需要的接口,方法列表如下:
/**
* 构造 UStreamingManager 对象
*/
public UStreamingManager();
/**
* 使 UStreamingManager 暂停工作,通常在 Activity#onPause 中调用
*/
public pause();
/**
* 使 UStreamingManager 恢复工作,通常在 Activity#onResume 中调用
*/
public resume();
/**
* 销毁 UStreamingManager 对象,通常在 Activity#onDestroy 中调用
*/
public destory();
/**
* Prepare UStreamingManager
* @param glSurfaceView 预览的 GLSurfaceView
* @param cameraParam UCameraParam 对象
* @param microphoneParam UMicrophoneParam 对象
* @param videoEncodeParam UVideoEncodeParam 对象
* @param audioEncodeParam UAudioEncodeParam 对象
* @param faceBeautyParam UFaceBeautyParam 对象
*/
public void prepare(GLSurfaceView glSurfaceView,
UCameraParam cameraParam,
UMicrophoneParam microphoneParam,
UVideoEncodeParam videoEncodeParam,
UAudioEncodeParam audioEncodeParam,
UFaceBeautyParam faceBeautyParam);
/**
* 开始推流
* @param rtmpUrl 推流地址
*/
public void startPublish(String rtmpUrl);
/**
* 停止推流
*/
public void stopPublish();
/**
* 设置图片推流的图片文件地址
* @param filePath 图片在手机上的路径
*/
public void setPictureStreamingFilePath(String filePath);
/**
* 设置图片推流的图片资源文件
* @param resId 图片的资源 ID
*/
public void setPictureStreamingResourceId(int resId);
/**
* 在摄像头和图片推流之间切换
*/
public synchronized boolean switchPictureStreaming();
/**
* 手动对焦,在预览画面上指定对焦区域大小以及相应的中心坐标
* @param 对焦区域的宽度
* @param 对焦区域的高度
* @param 对焦区域中心 X 坐标
* @param 对焦区域中心 Y 坐标
*/
public void manualFocus(int focusBlockWidth, int focusBlockHeight, int focusBlockCenterX, int focusBlockCenterY);
/**
* 注册相机对焦监听器
* @param 对焦监听器
*/
public void setFocusListener(UFocusListener listener);
/**
* 切换到下一个摄像头
*/
public void switchCamera();
/**
* 切换到指定摄像头
*/
public void switchCamera(UCameraParam.CAMERA_FACING_ID facingId);
/**
* 设置闪光灯开关
*/
public void setFlashEnabled(boolean enabled);
/**
* 更新美颜设置
* @param 美颜设置对象
*/
public final void updateFaceBeautyParam(UFaceBeautyParam Param);
/**
* 注册自定义美颜监听器
* @param 监听器对象
*/
public final void setVideoFrameListener(UVideoFrameListener listener);
/**
* 注册音频帧监听器
* @param 监听器对象
*/
public final void setAudioFrameListener(UAudioFrameListener listener);
/**
* 注册推流过程码率、帧率统计信息监听器
* @param 监听器对象
*/
public final void setStatisticsInfoListener(UStatisticsInfoListener listener);
/**
* 获取当前摄像头的最大曝光补偿值
* @return 最大曝光补偿值
*/
public int getMaxExposureCompensation();
/**
* 获取当前摄像头的最小曝光补偿值
* @return 最小曝光补偿值
*/
public int getMinExposureCompensation();
/**
* 设置曝光补偿值
*/
public void setExposureCompensation(int exposureCompensation);
/**
* 设置预览画面的缩放值
* 调用此方法前,请先调用 getZooms 方法获取有效值
* @param 缩放值
*/
public void setZoom(float zoom);
/**
* 获取有效的缩放值列表
* 已由小至大排序
* @return 如果该分辨率不支持缩放,则返回 null
*/
public List<Float> getZooms();
/**
* 设置水印
* @param watermarkParam 水印参数,包括水印图片、放置位置等
*/
public void setWatermark(UWatermarkParam watermarkParam)
UCameraParam
类用于设置摄像头采集的相关参数,包含以下方法:
/**
* 设置采集摄像头
* @param 默认设置为手机的后置摄像头
*/
public UCameraParam setCameraId(UCameraParam.CAMERA_FACING_ID cameraId);
/**
* 设置采集画面的分辨率
* @param 可以选择从 120P 到 1200P 之间的多种分辨率。默认设置为 480P
*/
public UCameraParam setCameraPreviewSizeLevel(UCameraParam.CAMERA_PREVIEW_SIZE_LEVEL level);
/**
* 设置采集画面的长宽比
* @param 可以选择 4:3 或 16:9。默认设置为 16:9
*/
public UCameraParam setCameraPreviewSizeRatio(UCameraParam.CAMERA_PREVIEW_SIZE_RATIO ratio);
UMicrophoneParam
类用于设置麦克风采集的相关参数,包含以下方法:
/**
* 设置音频采集源
* @param 默认为系统的 MediaRecorder.AudioSource.MIC,可视情况进行修改
*/
public UMicrophoneParam setAudioSource(int source);
/**
* 设置音频格式
* @param 默认为系统的 AudioFormat.ENCODING_PCM_16BIT,其他格式可能不兼容部分设备,请视情况使用
*/
public UMicrophoneParam setAudioFormat(int format);
/**
* 设置音频声道
* @param 默认为系统的 AudioFormat.CHANNEL_IN_MONO,其他格式如 AudioFormat.CHANNEL_IN_STEREO 可能不兼容部分设备,请视情况使用
*/
public UMicrophoneParam setChannelConfig(int channelConfig);
/**
* 设置音频采样率
* @param 采样率, 默认为 44100,其他设置可能不兼容部分设备,请视情况使用
*/
public UMicrophoneParam setSampleRate(int rate);
UVideoEncodeParam
类用于设置视频编码的相关参数,包含以下方法:
/**
* 设置编码码率
* @param 码率,单位为 bps,默认为 1000 * 1000
*/
public UVideoEncodeParam setEncodingBitrate(int bitrate);
/**
* 设置编码 fps
* @param fps 值,默认设置为 30
*/
public UVideoEncodeParam setEncodingFps(int fps);
/**
* 设置编码视频的分辨率
* @param 可以选择从 240P 到 1200P 之间的多种分辨率,默认设置为 480 * 848
*/
public UVideoEncodeParam setEncodingSizeLevel(UVideoEncodeParam.VIDEO_ENCODING_SIZE_LEVEL level);
/**
* 如果 SDK 内置的分辨率列表不能满足需求,可以通过此方法自定义编码视频的分辨率
* @param width 宽度
* @param height 高度
*/
public UVideoEncodeParam setPreferedEncodingSize(int width, int height);
/**
* 设置编码视频关键帧的间隔
* @param 单位为帧数,默认设置为 30 帧
*/
public UVideoEncodeParam setKeyFrameInterval(int interval);
UAudioEncodeParam
类用于设置音频编码的相关参数,包含以下方法:
/**
* 设置编码码率
* @param 码率,单位为 bps,默认为 44100
*/
public UAudioEncodeParam setBitrate(int bitrate);
/**
* 设置音频声道数
* @param 声道数,目前只支持 1 (默认) 和 2,分别对应 UMicrophoneParam 声道设置的 AudioFormat.CHANNEL_IN_MONO 与 AudioFormat.CHANNEL_IN_STEREO
*/
public UAudioEncodeParam setChannels(int channels);
/**
* 设置音频采样率
* @param 采样率, 默认为 44100
*/
public UAudioEncodeParam setSampleRate(int sampleRate);
该接口用户回调推流过程中的状态变化信息,方法如下:
/**
* 推流状态发生变化时触发
* @param state 当前状态
* @param extra 相关信息
*/
void onStateChanged(UStreamingState state, Object extra);
该接口用于回调视频采集相关的事件,方法如下:
/**
* Surface 创建时触发.
*/
void onSurfaceCreated();
/**
* Surface 大小发生变化时触发
* @param width the width of the Surface
* @param height the height of the Surface
*/
void onSurfaceChanged(int width, int height);
/**
* Surface 销毁时触发
*/
void onSurfaceDestroy();
/**
* 采集到一帧视频时触发
* @param texId the texture ID of Camera SurfaceTexture object to be rendered.
* @param texWidth width of the drawing surface in pixels.
* @param texHeight height of the drawing surface in pixels.
* @param timestampNs timestamp of this frame in Ns.
* @param transformMatrix transform matrix.
* @return the texture ID of the newly generated texture to be assigned to the SurfaceTexture object.
*/
int onDrawFrame(int texId, int texWidth, int texHeight, long timestampNs, float[] transformMatrix);
该接口用于回调音频采集相关的事件,方法如下:
/**
* 录制失败时触发
* @param 错误码,在 UErrorCode 中定义
*/
void onAudioRecordFailed(int errorCode);
/**
* 采集到一帧音频时触发
* @param data PCM 数据
* @param timestampNs 音频帧时间戳,单位为 ns
*/
void onAudioFrameAvailable(byte[] data, long timestampNs);
该接口用于回调推流过程中的帧率、码率等统计信息,方法如下:
/**
* 发送视频帧后触发
* @param fps frame per second
* @param bitrate bit per second
*/
void onVideoInfoChanged(double fps, double bitrate);
/**
* 发送音频帧后触发
* @param bitrate bit per second
*/
void onAudioBitrateChanged(double bitrate);
推流过程状态信息,包含如下内容:
错误码 | 说明 |
---|---|
READY | SDK 采集准备完成 |
CONNECTING | 正在连接推流服务器 |
STREAMING | 开始发送音视频数据 |
SHUTDOWN | 关闭推流 |
ERROR | 推流过程中出现异常 |
DISCONNECTED | 推流连接断开 |
CONNECTED | 推流连接建立成功 |
UNAUTHORIZED_STREAMING_URL | 推流域名未授权 |
自定义错误码,包含如下内容:
错误码 | 错误值 | 说明 |
---|---|---|
SUCCESS | 0 | 无错误发生 |
ERROR_IO_EXCEPTION | 20101 | IO 错误 |
ERROR_SIGN_INVALID | 20102 | 签名无效 |
ERROR_JSON_INVALID | 20103 | JSON 格式错误 |
ERROR_HTTP_SOCKET_TIMEOUT | 20104 | SOCKET 错误 |
ERROR_HTTP_IO_EXCEPTION | 20105 | HTTP IO 错误 |
ERROR_HTTP_RESPONSE_EXCEPTION | 20106 | HTTP 返回错误 |
ERROR_WRONG_STATE | 20001 | 状态错误 |
ERROR_SETUP_CAMERA_FAILED | 20004 | 设置摄像头失败 |
ERROR_SETUP_MICROPHONE_FAILED | 20005 | 设置麦克风失败 |
ERROR_SETUP_VIDEO_ENCODER_FAILED | 20006 | 设置视频编码器失败 |
ERROR_SETUP_AUDIO_ENCODER_FAILED | 20007 | 设置音频编码器失败 |
ERROR_UNAUTHORIZED | 20008 | 鉴权失败 |
ERROR_INVALID_ARG | 20010 | 传入了错误的参数信息 |
ERROR_DIFFERENT_AUDIO_PARAMS | 20011 | 音频参数不一致 |
ERROR_MISSING_DYNAMIC_LIBRARY | 20012 | 缺少动态库文件 |
ERROR_NO_VIDEO_TRACK | 20013 | 未发现视频信息 |
ERROR_LOW_MEMORY | 20015 | 内存不足 |
ERROR_MULTI_CODEC_WRONG | 20016 | 该设备不支持多例 MediaCodec |
ERROR_SETUP_VIDEO_DECODER_FAILED | 20017 | 设置视频解码器失败 |