Android平台RTMP直播推送模块技术接入说明
技术背景
大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能优异,配合大牛直播SDK的SmartPlayer播放器,轻松实现毫秒级的延迟体验,满足大多数行业的使用场景。
RTMP直播推送模块数据源,支持编码前、编码后数据对接:
- 编码前数据(目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型);
- 编码后数据(如无人机等264/HEVC数据,或者本地解析的MP4音视频数据)。
技术对接
系统要求
- SDK支持Android5.1及以上版本;
- 支持的CPU架构:armv7, arm64, x86, x86_64。
准备工作
- 确保SmartPublisherJniV2.java放到com.daniulive.smartpublisher包名下(可在其他包名下调用);
- smartavengine.jar加入到工程;
- 拷贝libSmartPublisher.so到工程;
- AndroidManifast.xml添加相关权限:
- Load相关so:
- build.gradle配置32/64位库:
- 如需集成到自己系统测试,请用大牛直播SDK的app name,授权版按照授权app name正常使用即可;
- 如何改app-name,strings.xml做以下修改:
接口设计
Android 推送端SDK接口详解 | |||
调用描述 | 接口 | 接口描述 | |
最先调用,如成功返回推送实例 | SmartPublisherOpen | ctx:上下文信息;
Audio_opt: 0:不推送音频; 1:推送编码前音频(PCM); 2:对接外部编码后的audio数据(AAC/PCMA/PCMU/SPEEX) video_opt: 0:不推送视频; 1:推送编码前视频(YUV420SP/YUV420P/RGBA/ARGB); 2:推送编码后视频(H.264) 3:层叠加模式 width|height:宽高信息。 |
|
Event回调 | SetSmartPublisherEventCallbackV2 | 设置event callback | |
硬编码设置 | SetSmartPublisherVideoHWEncoder | 检测是否支持H.264硬编码,如果返回0,则支持,否则自动采用软编码 | |
SetSmartPublisherVideoHevcHWEncoder | 检测是否支持H.265(HEVC)硬编码,如果返回0,则支持,否则自动采用软编码 | ||
SetNativeMediaNDK | 设置视频硬编码是否使用 Native Media NDK, 默认是不使用, 安卓5.0以下设备不支持 | ||
SetVideoHWEncoderBitrateMode | 设置视频硬编码码率控制模式
hw_bitrate_mode: -1表示使用默认值, 不设置也会使用默认值, 0:CQ, 1:VBR, 2:CBR, 3:CBR_FD |
||
SetVideoHWEncoderComplexity | 设置视频硬编码复杂度, 安卓5.0及以上支持 | ||
SetVideoHWEncoderQuality | 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效 | ||
SetAVCHWEncoderProfile | 设置H.264硬编码Profile, 安卓7及以上支持 | ||
SetAVCHWEncoderLevel | 设置H.264硬编码Level, 这个只有在设置了Profile的情况下才有效, 安卓7及以上支持 | ||
SetVideoHWEncoderMaxBitrate | 设置视频硬编码最大码率, 安卓没有相关文档说明, 所以不建议设置 | ||
水印 | 文字、png水印 | PostLayerBitmap | 通过层模式设置水印,投递层
Bitmap.Config.ARGB_888图像 |
视频参数配置 | 软编码可变码率 | SmartPublisherSetSwVBRMode | 设置软编码可变码率,可变码率下,相邻帧之间变化不大时码率更低 |
GOP间隔(关键帧) | SmartPublisherSetGopInterval | 设置推送端GOP间隔,一般建议在帧率的1~3倍,如不设置,用底层默认值 | |
软编码码率设置 | SmartPublisherSetSWVideoBitRate | 设置软编码视频 bit-rate,最大码流一般是平均码流的2倍,如不设置,用底层计算的默认值 | |
帧率 | SmartPublisherSetFPS | 设置fps,如不设置,用底层默认值 | |
软编码视频Profile | SmartPublisherSetSWVideoEncoderProfile | 设置软编码模式下的video encoder profile,默认baseline profile | |
软编码编码速度 | SmartPublisherSetSWVideoEncoderSpeed | 设置软编码编码速度,设置范围(1,6),1最快,6最慢,默认是6 | |
视频设置 | 视频镜像 | SmartPublisherSetMirror | 镜像模式: 播放端和推送端本地回显方向显示一致(前置摄像头) |
视频截图 | 实时快照 | CaptureImage | 截图接口, 支持JPEG和PNG两种格式 |
音频配置 | 音频编码
类型 |
SmartPublisherSetAudioCodecType | 设置编码类型,默认AAC编码,type设置为2时,启用speex编码(码率更低) |
AAC编码码率 | SmartPublisherSetAudioBitRate | 设置音频编码码率, 当前只对AAC编码有效 | |
SPEEX编码质量 | SmartPublisherSetSpeexEncoderQuality | 设置speex编码质量,数值越大,质量越高,范围(0,10),默认8 | |
音频处理 | 噪音抑制 | SmartPublisherSetNoiseSuppression | 噪音抑制开启后,可去除采集端背景杂音 |
增益控制 | SmartPublisherSetAGC | 设置自动增益控制,保持声音稳定 | |
回声消除 | SmartPublisherSetEchoCancellation | 设置音频回音消除 | |
实时静音 | SmartPublisherSetMute | 设置实时静音、取消静音 | |
设置输入
音量 |
SmartPublisherSetInputAudioVolume | 设置输入音量,默认是1.0,范围是[0.0, 5.0], 设置成0静音, 1音量不变 | |
RTMP推送模式 | SetRtmpPublishingType | 设置rtmp publisher类型,0:live,1:record,需服务器支持 | |
Enhanced RTMP设置 | DisableEnhancedRTMP | disable enhanced RTMP, SDK默认是开启enhanced RTMP的 | |
RTMP推送URL设置 | SmartPublisherSetURL | 设置RTMP推送url | |
编码前实时视频数据 | camera数据 | SmartPublisherOnCaptureVideoData | 对接camera回调的数据 |
YV12数据 | SmartPublisherOnYV12Data | YV12数据接口 | |
NV21数据 | SmartPublisherOnNV21Data | NV21数据接口 | |
转换接口 | SmartPublisherNV21ToI420Rotate | NV21转换到I420并旋转 | |
YUV(I420) | SmartPublisherOnCaptureVideoI420Data | 第三方YUV(I420)接口 | |
RGB24数据 | SmartPublisherOnCaptureVideoRGB24Data | RGB24接口 | |
RGBA32数据 | SmartPublisherOnCaptureVideoRGBA32Data | RGBA32接口 | |
YUV420888数据 | SmartPublisherOnImageYUV420888 | YUV420888接口 | |
RGBA数据 | SmartPublisherOnCaptureVideoRGBAData | 第三方RGBA数据 | |
ABGR垂直翻转数据 | SmartPublisherOnCaptureVideoABGRFlip
VerticalData |
ABGR flip vertical(垂直翻转) 数据(Demo中用于传递屏幕数据) | |
RGBA8888图像 | PostLayerImageRGBA8888ByteBuffer | 投递层RGBA8888图像,如果不需要Aplpha通道的话, 请使用RGBX8888接口 | |
RGBX8888图像 | PostLayerImageRGBX8888ByteBuffer | 投递层RGBX8888图像 | |
I420图像 | PostLayerImageI420ByteBuffer | 投递层I420图像 | |
RGB565数据 | SmartPublisherOnCaptureVideoRGB565Data | RGB565 data | |
裁剪过的RGBA
数据 |
SmartPublisherOnCaptureVideoClipedRGBAData | 投递裁剪过的RGBA数据 | |
PCM数据 | SmartPublisherOnPCMData | 实时PCM数据 | |
远端PCM数据
(用于回音消除) |
SmartPublisherOnFarEndPCMData | 实时传递远端PCM数据(可用于互动级的回音消除处理) | |
音频 混音 | 混音数据 | SmartPublisherOnMixPCMData | 传递PCM混音音频数据给SDK, 每10ms音频数据传入一次 |
编码后数据对接 | 编码后视频数据 | SmartPublisherPostVideoEncodedData | 设置编码后视频数据 |
编码后音频数据 | SmartPublisherPostAudioEncodedData | 编码后音频数据 | |
编码后音视频数据回调 | 编码后音频数据回调 | SmartPublisherSetAudioEncodedDataCallback | 设置编码后音频数据回调 |
编码后视频数据回调 | SmartPublisherSetVideoEncodedDataCallback | 设置编码后视频数据回调 | |
层结构设置 | 启用|停用视频层 | EnableLayer | video_opt为3时,启用或者停用视频层, 这个接口必须在StartXXX之后调用. |
移除视频层 | RemoveLayer | 移除视频层, 这个接口必须在StartXXX之后调用. | |
RTMP推送 | 开始推送
RTMP |
SmartPublisherStartPublisher | 启动RTMP推送 |
停止推送
RTMP |
SmartPublisherStopPublisher | 停止RTMP推送 | |
关闭推送实例 | 关闭实例 | SmartPublisherClose | 关闭推送实例,结束时必须调用close接口释放资源 |
设置授权 | 授权license设置 | SmartPublisherSetSDKClientKey | 设置授权Key,如需设置授权Key, 请确保在SmartPublisherOpen之前调用! |
功能支持
- 音频编码:AAC/SPEEX;
- 视频编码:H.264、H.265;
- 推流协议:RTMP;
- [音视频]支持纯音频/纯视频/音视频推送;
- [摄像头]支持采集过程中,前后摄像头实时切换;
- 支持帧率、关键帧间隔(GOP)、码率(bit-rate)设置;
- 支持RTMP推送 live|record模式设置;
- 支持前置摄像头镜像设置;
- 支持软编码、特定机型硬编码;
- 支持横屏、竖屏推送;
- 支持Android屏幕采集推送;
- 支持自建标准RTMP服务器或CDN;
- 支持断网自动重连、网络状态回调;
- 支持实时动态水印;
- 支持实时快照;
- 支持降噪处理、自动增益控制;
- 支持外部编码前音视频数据对接;
- 支持外部编码后音视频数据对接;
- 支持RTMP扩展H.265(需设备支持H.265特定机型硬编码)和Enhanced RTMP;
- 支持实时音量调节;
- 支持扩展录像模块;
- 支持Unity接口;
- 支持H.264扩展SEI发送模块;
- 支持Android 5.1及以上版本。
接口调用详解
本文以大牛直播SDK Android平台Camera2Demo为例,推送RTMP之前,可以先选择视频分辨率、软编还是硬编码,音频是AAC、SPEEX还是PCMA编码等基础设置,其他参数的设置,可以参考下面InitAndSetConfig()。
以Android平台Camera2对接为例,onCreate()时,想new SmartPublisherJniV2():
推送RTMP:
stopPush()实现如下:
其中,InitAndSetConfig()实现如下,通过调SmartPublisherOpen()接口,生成推送实例句柄。
对应的initialize_publisher()实现如下,设置软硬编码、帧率、关键帧间隔等。
数据投递如下(以Camera2采集为例,如果是其他视频格式,也可以正常对接):
音频采集投递设计如下:
回调Audio数据的地方,直接投递出去:
图层投递设计如下,图层投递的时候,可设置是否添加文字、图片动态水印:
如需摄像头快照,调用以下逻辑实现即可:
如需集成录像模块,开始录像、停止录像设计如下:
录像参数配置实现如下:
暂停录像、恢复录像设计如下:
Event回调实现如下:
onDestroy() 的时候,调用stopPush()即可,如果有录像和快照,都停掉,此外,停掉图层投递线程,并关闭camera:
总结
以上是大牛直播SDK的Android平台RTMP直播推送模块详细的对接说明,除了可以对接编码前各种类型的音视频数据外,模块还支持对接编码后音视频数据,并实现本地录像、快照等功能,除支持H.264外,RTMP推送模块还支持扩展H.265和Enhanced RTMP。感兴趣的开发者,可以单独跟我们探讨。