test
test test
大牛直播SDK
test test
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以iOS平台为例,介绍下如何集成RTSP、RTMP播放模块。
Info.plist–>右键Open As–>Source Code
添加或者编辑
Info.plist–>右键Open As–>Source Code 添加:
iOS端,RTMP|RTSP直播播放,我们设计实现的功能如下:
iOS播放端SDK接口详解 |
|||
调用描述 | 接口 | 接口描述 | |
最先调用,创建播放实例,如成功返回player实例 | SmartPlayerInitPlayer | 初始化,创建player实例,此接口请第一个调用 | |
Event回调 | SmartPlayerDelegate | 设置event callback,上层由handleSmartPlayerEvent处理 | |
软、硬解码设置 | SmartPlayerSetVideoDecoderMode | 设置是否用硬解码播放,如硬解码不支持,自动适配到软解码
0: 软解码; 1: 硬解码. |
|
创建播放view | SmartPlayerCreatePlayView | x y width height 指定播放位置 | |
设置播放view | SmartPlayerSetPlayView | 设置播放view到底层SDK | |
释放播放view | SmartPlayeReleasePlayView | 释放播放view | |
视频回调 | 设置YUV回调 | SmartPlayerSetYuvBlock | 设置拉流时,视频YUV数据回调 |
YUV回调 | PlayerYuvDataBlock | 提供解码后YUV/RGB数据接口,供用户自己render或进一步处理(如视频分析) | |
播放模式 | 缓冲时间设置 | SmartPlayerSetBuffer | 设置播放端缓存数据buffer,单位:毫秒,如不需buffer,设置为0 |
首屏秒开 | SmartPlayerSetFastStartup | 设置快速启动后,如果CDN缓存GOP,实现首屏秒开 | |
低延迟模式 | SmartPlayerSetLowLatencyMode | 针对类似于直播娃娃机等期待超低延迟的使用场景,超低延迟播放模式下,延迟可达到200~400ms | |
快速切换URL | SmartPlayerSwitchPlaybackUrl | 快速切换播放url,快速切换时,只换播放source部分,适用于不同数据流之间,快速切换 | |
RTSP TCP/UDP模式设置 | SmartPlayerSetRTSPTcpMode | 设置RTSP TCP/UDP模式,如不设置,默认UDP模式 | |
RTSP超时时间设置 | SmartPlayerSetRTSPTimeout | 设置RTSP超时时间,timeout单位为秒,必须大于0 | |
设置RTSP TCP/UDP自动切换 | SmartPlayerSetRTSPAutoSwitchTcpUdp | 对于RTSP来说,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式
为了方便使用,有些场景下可以开启自动尝试切换开关, 打开后如果udp无法播放,sdk会自动尝试tcp, 如果tcp方式播放不了,sdk会自动尝试udp. |
|
实时静音 | SmartPlayerSetMute | 实时静音 | |
设置播放音量 | SmartPlayerSetAudioVolume | 播放端音量实时调节,范围[0,100],0时为静音,100为原始流数据最大音量 | |
视频镜像旋转 | 旋转 | SmartPlayerSetRotation | 设置顺时针旋转, 注意除了0度之外, 其他角度都会额外消耗性能,当前支持 0度,90度, 180度, 270度 旋转 |
水平反转 | SmartPlayerSetFlipHorizontal | 设置视频水平反转 | |
垂直反转 | SmartPlayerSetFlipVertical | 设置视频垂直反转 | |
设置URL | SmartPlayerSetPlayURL | 设置播放或录像的url | |
开始播放 | SmartPlayerStart | 开始播放RTSP/RTMP流 | |
停止播放 | SmartPlayerStop | 停止播放RTSP/RTMP流 | |
销毁播放实例 | SmartPlayerUnInitPlayer | 结束时必须调用close接口释放资源 |
录像模块接口详解
如需录像,录像相关的接口如下:
iOS播放端录像SDK接口详解 |
|||
调用描述 | 接口 | 接口描述 | |
录像设置 | 设置录像目录 | SmartPlayerSetRecorderDirectory | 设置录像文件目录 |
设置录像文件大小 | SmartPlayerSetRecorderFileMaxSize | 设置每个录像文件的大小,比如100M,超过这个大小后,会自动生成下一个录像文件 | |
音频转码 | SmartPlayerSetRecorderAudioTranscodeAAC | 设置录像时音频转AAC编码的开关
aac比较通用,sdk增加其他音频编码(比如speex, pcmu, pcma等)转aac的功能. |
|
录制视频 | SmartPlayerSetRecorderVideo | 设置是否录视频,默认的话,如果视频源有视频就录,没有就不录, 但有些场景下可能不想录制视频,只想录音频,所以增加个开关 | |
录制音频 | SmartPlayerSetRecorderAudio | 设置是否录音频,默认的话,如果视频源有音频就录,没有就不录, 但有些场景下可能不想录制音频,只想录视频,所以增加个开关 | |
开始录像 | SmartPlayerStartRecorder | 开始录像 | |
停止录像 | SmartPlayerStopRecorder | 停止录像 |
由于iOS播放录像SDK和播放端SDK可组合使用,相关Event同步更新在iOS播放端SDK(如下图):
iOS播放端SDK Event回调说明 |
|
事件ID | 事件描述 |
EVENT_DANIULIVE_ERC_PLAYER_STARTED | 开始播放 |
EVENT_DANIULIVE_ERC_PLAYER_CONNECTING | 播放端连接中 |
EVENT_DANIULIVE_ERC_PLAYER_CONNECTION_FAILED | 播放端连接失败 |
EVENT_DANIULIVE_ERC_PLAYER_CONNECTED | 播放端连接成功 |
EVENT_DANIULIVE_ERC_PLAYER_DISCONNECTED | 播放端连接断开 |
EVENT_DANIULIVE_ERC_PLAYER_STOP | 停止播放 |
EVENT_DANIULIVE_ERC_PLAYER_RESOLUTION_INFO | 返回视频宽、高信息 |
EVENT_DANIULIVE_ERC_PLAYER_NO_MEDIADATA_RECEIVED | 收不到媒体数据(可能是URL错误) |
EVENT_DANIULIVE_ERC_PLAYER_SWITCH_URL | 快速切换URL |
EVENT_DANIULIVE_ERC_PLAYER_RECORDER_START_NEW_FILE | 开始一个新的录像文件(param3返回包含录像路径在内的录像文件名) |
EVENT_DANIULIVE_ERC_PLAYER_ONE_RECORDER_FILE_FINISHED | 已生成一个录像文件(param3返回包含录像路径在内的录像文件名) |
EVENT_DANIULIVE_ERC_PLAYER_CAPTURE_IMAGE | 播放端实时快照 |
EVENT_DANIULIVE_ERC_PLAYER_START_BUFFERING | 开始缓冲数据 |
EVENT_DANIULIVE_ERC_PLAYER_BUFFERING | 缓冲中(param1参数
会返回缓冲百分比) |
EVENT_DANIULIVE_ERC_PLAYER_STOP_BUFFERING | 停止缓冲数据 |
EVENT_DANIULIVE_ERC_PLAYER_DOWNLOAD_SPEED | 返回当前RTSP/RTMP流实时下载速度 |
EVENT_DANIULIVE_ERC_PLAYER_RTSP_STATUS_CODE | RTSP收到错误码,可能是用户名、密码不对 |
先说开始播放:
其中,InitPlayer实现如下:
停止播放StopPlayer实现如下:
UnInitPlayer实现如下:
实时录像:
实时快照:
Event回调处理如下:
iOS平台RTSP、RTMP直播播放模块,延迟低、资源占有少,性能优异。由于设备和系统比较单一,优先考虑硬解码,除了基础播放外,我们还实现了实时快照、实时录像、实时回调YUV数据、实时音量调节等,实际体验下来,iOS平台RTMP和RTSP,可以轻松毫秒级。
好多开发者,希望我们能系统的介绍下无纸化同屏的原理和集成步骤,以Android平台为例,无纸化同屏将Android设备上的屏幕内容实时投射到另一个显示设备(如Windows终端、国产化操作系统或另一台Android设备)上,从而实现多屏互动和内容的无缝共享。
本文以大牛直播SDK Android同屏采集推送为例,介绍下我们前些年做Android同屏采集推送的时候,一些注意点:
本文以大牛直播SDK的Android的SmartServicePublisherV2的同屏demo为例,Android采集计时器,编码打包分别启动RTMP推送和轻量级RTSP服务,Windows过来分别拉取RTMP和RTSP的流,整体延迟毫秒级:
启动APP后,先选择需要采集的分辨率(如果选原始分辨率,系统不做缩放),然后选择“启动媒体投影”,并分别启动音频播放采集、采集麦克风。如果音频播放采集和采集麦克风都打开,可以通过右侧下拉框,推送过程中,音频播放采集和麦克风采集实时切换。需要注意的是,Android采集音频播放的audio,音频播放采集是依赖屏幕投影的,屏幕投影关闭后,音频播放也就采不到了。
编码的话,考虑到屏幕分辨率一般不会太低,我们可以缩放后再推送,默认我们开启了原始分辨率、标准分辨率、低分辨率选项设置。一般建议标准分辨率即可。如果对画质和分辨率要求比较高,可以选择原始分辨率。设备支持硬编码,优先选择H.264硬编,如果是H.265硬编,需要RTMP服务器支持扩展H.265(或Enhanced RTMP)。
都选择好后,设置RTMP推送的URL,点开始RTMP推送按钮即可。
如果需要通过轻量级RTSP服务,发布RTSP流,先点击启动RTSP服务按钮,RTSP服务启动后,再点击启动RTSP流,RTSP流发布成功后,界面会回调上来RTSP拉流的URL。
下面从代码逻辑实现角度,介绍下同屏的具体流程:
启动媒体服务,进入系统后,我们会自动启动媒体服务,对应的实现逻辑如下:
需要注意的是,Android 6.0及以上版本,动态获取Audio权限:
启动、停止媒体投影:
启动媒体投影后,选择“采集音频播放”,如果需要采集麦克风,可以点击“采集麦克风”:
启动、停止RTMP推送:
启动RTSP服务:
发布RTSP流:
RTSP流发布成功后,底层会把RTSP拉流的URL回调上来:
可以看到,上述操作,都是在MainActivity.java调用的,如果是需要做demo版本集成,只需要关注MainActivity.java的业务逻辑即可,为了便于开发者对接,我们做了接口的二次封装,除了常规的RTMP推送、轻量级RTSP服务设计外,如果需要录像,只要在MainActivity.java调用这里的接口逻辑即可,非常方便:
如果对音视频这块相对了解的开发者,可以继续到NTStreamMediaProjectionEngineImpl.java文件,查看或修改相关的技术实现:
以Android平台RTMP推送模块为例,我们主要实现了如下功能:
轻量级RTSP服务,在上述非RTMP协议依赖的基础上,增加了如下功能:
以上是Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器,整体部署,内网大并发环境下,还需要考虑到如何组网等诸多因素。做demo容易,做个成熟的模块还是有一定的难度,以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通探讨。
今天,我们主要讲讲Android平台GB28181接入模块的技术对接,Android平台GB28181接入模块设计的目的,可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016服务,可用于如智能监控、智慧零售、智慧教育、远程办公、生产运输、智慧交通、车载或执法记录仪等场景。
Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播和语音对讲、云台控制回调和预置位查询,支持对接数据类型如下:
以Android平台Camera2对接为例,信令部分需要实现如下标红接口:
媒体数据处理接口,可参照SmartPublisherJniV2.java,如需语音广播或语音对讲,可参照SmartPlayerJniV2.java。
GBSIPAgentListener主要系GB28181注册、心跳、DevicePosition等,如注册成功、注册超时、注册网络传输层错误、心跳异常、设备位置请求处理:
GBSIPAgentPlayListener主要系GB28181的Invite、Ack、Bye等处理:
GBSIPAgentAudioBroadcastListener主要系GB28181语音广播处理相关,如有语音广播相关需求,可参照demo实例实现:
GBSIPAgentDeviceControlListener主要系GB28181设备控制相关,比如远程启动、云台控制:
GBSIPAgentQueryCommandListener主要系GB28181查询命令,如预置位查询:
GBSIPAgentTalkListener主要系GB28181语音对讲相关处理:
GBSIPAgentPlaybackListener系历史视音频回放相关:
GBSIPAgentDownloadListen系历史视音频下载相关:
RTP Sender(SmartPublisherJniV2.java)相关接口设计:
对应RTP Receiver(SmartPlayerJniV2.java)相关接口设计,如无语音广播或语音对讲相关技术需求,这部分可忽略:
PostAudioPacket(SmartPlayerJniV2.java),投递音频包给外部Live source,目前仅于语音对讲使用:
GB28181接口调用
对应GB28181相关接口调用相关设计如下:
以上是大牛直播SDK发布的Android平台GB28181设备接入模块的相关说明,除了上述接口设计外,模块还可以扩展实现实时静音、实时快照、按需录像、实时音量调节等,可扩展性非常好。
2014年4月8日起,美国微软公司停止了对Windows XP SP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。而2020年对Windows7服务支持的终止再一次推动了国产系统的发展。工信部对此表示,将继续加大力度,支持Linux的国产操作系统的研发和应用,并希望用户可以使用国产操作系统。
为什么要发展国产操作系统?
此外,随着云计算、大数据、人工智能等新兴技术的发展,操作系统作为基础设施的重要性日益凸显。发展国产操作系统可以为这些新兴技术提供更安全、更可靠的运行环境,推动相关产业的发展和创新。
综上所述,发展国产操作系统对于保障国家信息安全、降低技术依赖风险、满足国内市场需求、促进产业发展以及构建完善的生态系统等方面都具有重要意义。
顺势而为,在发布arm64架构的国产操作系统|Linux平台的RTMP|RTSP直播播放SDK之前,大牛直播SDK(
)的直播播放SDK用一句比较流行的广告语叫遥遥领先,我们更是在前几年已经发布了Linux X86_64架构的播放器,并得到了广泛的应用。本次发布的可用于国产操作系统和Linux上的的RTMP|RTSP直播播放SDK, video输出基于X协议,audio输出采用PulseAudio和Alsa Lib实现。除了常规功能如实时静音、快照、buffer time设定、网络自动重连等,RTMP支持扩展H265播放(支持Enhanced RTMP H.265播放), RTSP也支持H265播放。
大牛直播SDK发布的Linux平台播放器SDK支持多实例播放,相关代码如下:
开始播放、停止播放封装实现
Event回调
视频分辨率回调
实时快照回调
arm64架构的国产操作系统|Linux下的RTMP、RTSP直播播放,延迟依然毫秒级,随着国产操作系统在传统行业的推进,越来越多的场景需要高稳定性高延迟低的RTMP|RTSP播放器,本文抛砖引玉,感兴趣的开发者可以跟我单独探讨。
为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,大牛直播SDK在推送端发布了轻量级RTSP服务SDK。
轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务,实现本地的音视频数据(如摄像头、麦克风),编码后,汇聚到内置RTSP服务,对外提供可供拉流的RTSP URL,轻量级RTSP服务,适用于内网环境下,对并发要求不高的场景,支持H.264/H.265,支持RTSP鉴权、单播、组播模式,考虑到单个服务承载能力,我们支持同时创建多个RTSP服务,并支持获取当前RTSP服务会话连接数。
轻量级RTSP服务数据源,支持编码前、编码后数据对接:
Android内置轻量级RTSP服务SDK接口详解 | ||
调用描述 | 接口 | 接口描述 |
SmartRTSPServerSDK | ||
初始化RTSP Server | InitRtspServer | Init rtsp server(和UnInitRtspServer配对使用,即便是启动多个RTSP服务,也只需调用一次InitRtspServer,请确保在OpenRtspServer之前调用) |
创建一个rtsp server | OpenRtspServer | 创建一个rtsp server,返回rtsp server句柄 |
设置端口 | SetRtspServerPort | 设置rtsp server 监听端口, 在StartRtspServer之前必须要设置端口 |
设置鉴权用户名、密码 | SetRtspServerUserNamePassword | 设置rtsp server 鉴权用户名和密码, 这个可以不设置,只有需要鉴权的再设置 |
获取rtsp server当前会话数 | GetRtspServerClientSessionNumbers | 获取rtsp server当前的客户会话数, 这个接口必须在StartRtspServer之后再调用 |
启动rtsp server | StartRtspServer | 启动rtsp server |
停止rtsp server | StopRtspServer | 停止rtsp server |
关闭rtsp server | CloseRtspServer | 关闭rtsp server |
UnInit rtsp server | UnInitRtspServer | UnInit rtsp server(和InitRtspServer配对使用,即便是启动多个RTSP服务,也只需调用一次UnInitRtspServer) |
SmartRTSPServerSDK供Publisher调用的接口 | ||
设置rtsp的流名称 | SetRtspStreamName | 设置rtsp的流名称 |
给要发布的rtsp流设置rtsp server | AddRtspStreamServer | 给要发布的rtsp流设置rtsp server, 一个流可以发布到多个rtsp server上,rtsp server的创建启动请参考OpenRtspServer和StartRtspServer接口 |
清除设置的rtsp server | ClearRtspStreamServer | 清除设置的rtsp server |
启动rtsp流 | StartRtspStream | 启动rtsp流 |
停止rtsp流 | StopRtspStream | 停止rtsp流 |
本文以大牛直播SDK Android平台Camera2Demo为例,启动RTSP服务、发布RTSP流之前,可以先选择视频分辨率、软编还是硬编码,音频是PCMA还是AAC编码等基础设置,其他参数的设置,可以参考下面InitAndSetConfig()。
以Android平台Camera2对接为例,先初始化RTSP Server:
启动、停止RTSP服务:
stopRtspService()实现如下:
发布、停止RTSP流:
stopRtspPublisher()实现如下:
其中,InitAndSetConfig()实现如下,通过调研SmartPublisherOpen()接口,生成推送实例句柄。
对应的initialize_publisher()实现如下,设置软硬编码、帧率、关键帧间隔等。
发布RTSP流成功后,会回调上来可供拉流的RTSP URL:
获取RTSP Session会话数:
数据投递如下(以Camera2采集为例,如果是其他视频格式,也可以正常对接):
音频采集投递设计如下:
回调Audio数据的地方,直接投递出去:
onDestroy() 的时候,调研UnInitRtspServer()即可:
以上是Android平台轻量级RTSP服务模块详细的对接说明,除了可以对接编码前音视频数据外,模块还支持对接编码后音视频数据,并实现本地录像、快照等功能组合使用。感兴趣的开发者,可以单独跟我们探讨。
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台为例,介绍下如何集成RTSP、RTMP播放模块。
Android RTSP|RTMP播放端SDK接口详解 | |||
调用描述 | 接口 | 接口描述 | |
最先调用,如成功返回播放实例 | SmartPlayerOpen | player初始化,设置上下文信息,返回player句柄 | |
Event回调 | SetSmartPlayerEventCallbackV2 | 设置event callback | |
硬解码设置(H.264) | SetSmartPlayerVideoHWDecoder | 设置是否用H.264硬解码播放,如硬解码不支持,自动适配到软解码 | |
硬解码设置(H.265) | SetSmartPlayerVideoHevcHWDecoder | 设置是否用H.265硬解码播放,如硬解码不支持,自动适配到软解码 | |
视频画面
填充模式 |
SmartPlayerSetRenderScaleMode | 设置视频画面的填充模式,如填充整个view、等比例填充view,如不设置,默认填充整个view | |
设置SurfaceView模式下render类型 | SmartPlayerSetSurfaceRenderFormat | 设置SurfaceView模式下(NTRenderer.CreateRenderer第二个参数传false的情况),render类型
0: RGB565格式,如不设置,默认此模式; 1: ARGB8888格式 |
|
设置SurfaceView模式下抗锯齿效果 | SmartPlayerSetSurfaceAntiAlias | 设置SurfaceView模式下(NTRenderer.CreateRenderer第二个参数传false的情况),抗锯齿效果,注意:抗锯齿模式开启后,可能会影像性能,请慎用 | |
设置播放的surface | SmartPlayerSetSurface | 设置播放的surface,如果为null,则播放纯音频 | |
设置视频硬解码下Mediacodec自行绘制模式 | SmartPlayerSetHWRenderMode | 此种模式下,硬解码兼容性和效率更好,回调YUV/RGB、快照和图像等比例缩放功能将不可用 | |
更新硬解码surface | SmartPlayerUpdateHWRenderSurface | 设置更新硬解码surface | |
音频回调 | YUV/RGB | SmartPlayerSetExternalRender | 提供解码后YUV/RGB数据接口,供用户自己render或进一步处理(如视频分析) |
Audio | SmartPlayerSetExternalAudioOutput | 回调audio数据到上层(供二次处理之用) | |
audio输出类型 | SmartPlayerSetAudioOutputType | 如果use_audiotrack设置为0,将会自动选择输出设备,如果设置为1,使用audiotrack模式,一对一回音消除模式下,请选用audiotrack模式 | |
Video输出类型 | NTRenderer.CreateRenderer(上层demo内) | 第二个参数,如果是true,用openGLES绘制,false则用默认surfaceView | |
播放模式 | 缓冲时间设置 | SmartPlayerSetBuffer | 设置播放端缓存数据buffer,单位:毫秒,如不需buffer,设置为0 |
首屏秒开 | SmartPlayerSetFastStartup | 设置快速启动后,如果CDN缓存GOP,实现首屏秒开 | |
低延迟模式 | SmartPlayerSetLowLatencyMode | 针对类似于直播娃娃机等期待超低延迟的使用场景,超低延迟播放模式下,延迟可达到200~400ms | |
快速切换URL | SmartPlayerSwitchPlaybackUrl | 快速切换播放url,快速切换时,只换播放source部分,适用于不同数据流之间,快速切换(如娃娃机双摄像头切换或高低分辨率流切换) | |
RTSP TCP/UDP模式设置 | SmartPlayerSetRTSPTcpMode | 设置RTSP TCP/UDP模式,如不设置,默认UDP模式 | |
RTSP超时时间设置 | SmartPlayerSetRTSPTimeout | 设置RTSP超时时间,timeout单位为秒,必须大于0 | |
设置RTSP TCP/UDP自动切换 | SmartPlayerSetRTSPAutoSwitchTcpUdp | 对于RTSP来说,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式
为了方便使用,有些场景下可以开启自动尝试切换开关, 打开后如果udp无法播放,sdk会自动尝试tcp, 如果tcp方式播放不了,sdk会自动尝试udp. |
|
设置RTSP用户名和密码 | SetRTSPAuthenticationInfo | 如果RTSP URL已包含用户名和密码, 此接口设置的用户名和密码将无效. 就是说要用这个接口设置的用户名和密码去做认证, RTSP URL不能包含用户名和密码. | |
实时静音 | SmartPlayerSetMute | 实时静音 | |
设置播放音量 | SmartPlayerSetAudioVolume | 播放端音量实时调节,范围[0,100],0时为静音,100为原始流数据最大音量 | |
设置是否禁用 Enhanced
RTMP |
DisableEnhancedRTMP | disable enhanced RTMP, SDK默认是开启enhanced RTMP的 | |
实时截图 | CaptureImage | 支持JPEG和PNG两种格式 | |
视频镜像旋转 | 旋转 | SmartPlayerSetRotation | 设置顺时针旋转, 注意除了0度之外, 其他角度都会额外消耗性能,当前支持 0度,90度, 180度, 270度 旋转 |
水平反转 | SmartPlayerSetFlipHorizontal | 设置视频水平反转 | |
垂直反转 | SmartPlayerSetFlipVertical | 设置视频垂直反转 | |
设置URL | SmartPlayerSetUrl | 设置需要播放或录像的RTMP/RTSP url | |
开始播放 | SmartPlayerStartPlay | 开始播放RTSP/RTMP流 | |
停止播放 | SmartPlayerStopPlay | 停止播放RTSP/RTMP流 | |
关闭播放实例 | SmartPlayerClose | 结束时必须调用close接口释放资源 |
本文以大牛直播SDK Android平台SmartPlayerV2为例,播放之前,设置初始化参数配置(软解还是硬解、buffer time等)和需要播放的RTSP或RTMP URL,点开始播放即可。
onCreate()时,先new SmartPlayerJniV2():
开始播放、停止播放实现,开始播放的时候,调用InitAndSetConfig(),完成常规参数初始化,然后调用仅播放相关的其他接口。
由于RTSP、RTMP播放模块,除了常规的直播播放外,也可能录像、或者实时拉流转发到RTMP服务器或轻量级RTSP服务,所以,和录像、转发相关的播放端基础参数配置,放到InitAndSetConfig()实现:
EventHandle播放端事件回调处理,是底层状态反馈非常重要的媒介,除了网络状态、buffering状态回调外、还有录像状态、快照状态等回调:
如果RTSP、RTMP流需要录像:
其中,录像参数配置选项设置如下,除了下面演示接口外,还可以设置仅录视频或音频:
如需播放过程中实时截图:
如需对视频view做水平、垂直翻转或旋转:
onDestroy() 的时候,停掉播放、录像、释放播放端实例句柄:
以上是大概的流程,如果需要播放多实例,可以做个简单的封装,多实例效果如下:
LibPlayerWrapper.java参考封装代码如下,如需额外功能,只要按照设计框架,添加进去即可:
以上是Android平台RTSP、RTMP直播播放模块对接说明,在此之前,我们针对SmartPlayer做过一些技术方面的探讨,从低延迟、音视频同步处理、多实例实现、解码效率、性能占用、解码后数据对接、实时截图、录像、网络抖动处理等各个维度,做过相关的技术分享。感兴趣的开发者,可以单独跟我们探讨。
大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能优异,配合大牛直播SDK的SmartPlayer播放器,轻松实现毫秒级的延迟体验,满足大多数行业的使用场景。
RTMP直播推送模块数据源,支持编码前、编码后数据对接:
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之前调用! |
本文以大牛直播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。感兴趣的开发者,可以单独跟我们探讨。
Android平台除RTMP、RTSP直播播放外,有些场景可输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或类似智能硬件设备,回调出来的H.264/H.265数据,编码后的H.264/H.265数据除了正常转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至对数据做二次处理(视频分析、实时水印字符叠加等),大概流程如下:
基于这样的场景诉求,我们开发了Android平台外部编码数据实时预览播放模块(以RTSP拉流,然后回调上来编码后数据,再投递到Android平台编码数据实时预览播放SDK为例)。
Android平台外部编码数据实时预览模块可实现本地低延迟的预览播放,支持软解码和特定机型硬解码,支持等比例或铺满显示,感兴趣的开发者可参看:Android平台如何实现第三方模块编码后(H.264/H.265/AAC/PCMA/PCMU)数据实时预览播放和播放
电网视频监控系统是智能电网的一个重要组成部分,广泛应用于电网的建设、生产、运行、经营等方面。由于视频监控系统在不同的建设时期选用了不同的技术和不同厂家的产品,导致了标准不统一、技术路线不一致。目前国家电网公司智能电网建设,对视频监控系统提出了新的要求,因此实现统一监控、统一存储、分级控制、分域管理,使不同的视频监视系统能够互联互通,满足视频监控系统全局化、整体化的发展需求,已成为亟待解决的问题。
为此,大牛直播SDK推出的Android平台国网B接口接入SDK,可实现不具备国网B接口音视频能力的 Android终端,通过平台注册接入到现有的平台。
Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、语音广播,支持对接数据类型如下:
大牛直播SDK推出的Android平台GB28181接入SDK(SmartGBD),可实现不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016或GB/T28181—2022服务,可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景,可能是业内为数不多功能齐全性能优异的商业级水准GB28181接入SDK。
Android终端除支持常规的音视频数据接入外,还可以支持移动设备位置(MobilePosition)订阅和通知、图像抓拍、语音广播和语音对讲、历史视音频下载和回放,支持对接数据类型如下:
除了Windows/Linux/Android/iOS Native SDK,大牛直播SDK发布了Unity环境下的RTMP推流|轻量级RTSP服务(Windows平台+Linux平台+Android平台)和RTMP|RTSP直播播放(Windows、Linux、Android和iOS平台全覆盖)低延迟的解决方案。
目前,大牛直播SDK的Unity3D环境下,已覆盖以下SDK:
支持平台 | 支持架构 |
---|---|
Windows平台 | x86 debug/release, x64 debug/release |
Linux(含麒麟操作系统) | x86_64、aarch64 |
Android平台 | armeabi-v7a, arm64-v8a, x86, x86_64 |
iOS平台 | arm64 |
Unity环境下,不管是camera还是窗体数据也好,主要是高效率的拿到原始数据,采集端可用的数据格式是RGB的,拿到之后,通过高效率的数据传递,发给封装后的原生SDK,完成数据编码和RTMP推送。
需要注意的地方有几点:
1. 数据采集投递,确保高效率;
2. 屏幕分辨率发生变化,可实时适配;
3. Unity和原生SDK之间通信,比如event回调等;
4. 屏幕数据如有水平或垂直翻转,需要有一定的矫正。
Unity环境下RTMP或RTSP直播播放我们前几年就有发布,并已应用在好多传统行业领域,比如教育或工业仿真或一些低延迟的控制场景。
相关实现逻辑如下:
1. Native RTSP或RTSP直播播放SDK回调RGB/YUV420/NV12等其中的一种未压缩的图像格式;
2. Unity3D创建相应的RGB/YUV420等Shader;
3.Unity3D从各个平台获取图像数据来填充纹理即可;
需要注意的有几点:
1. 多实例支持:播放端和推送不一样,比如智慧城市,播放端有多路场景,所以多实例支持是必备功能,多实例环境下,需要能有好的区分event状态回调等;
2. 尽可能高效率的数据传递,确保资源占有最小化;
3. 视频分辨率变化后,能自动适配;
4. Unity和原生SDK之间通信,比如event回调等;
5. 长时间运行稳定性。
Unity3d RTSP/RTMP直播播放端SDK视频演示1
Unity3d RTSP/RTMP直播播放端SDK视频演示2
Windows平台Unity3d下如何同时播放多路RTSP或RTMP流
Windows平台实现Unity下窗体|摄像头|屏幕采集推送
Android平台实现VR头显Unity下音视频数据RTMP推送
Unity实现Camera和Audio数据的低延迟RTMP推送技术探讨
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
随着Unity3D的应用范围越来越广,越来越多的行业开始基于Unity3D开发产品,如传统行业中虚拟仿真教育、航空工业、室内设计、城市规划、工业仿真等领域。
基于此,好多开发者苦于在Unity环境下,没有低延迟的推拉流解决方案,前几年,我们在Unity环境下推出了跨平台低延迟的RTMP|RTSP直播播放器,很好的解决了好多对延迟要求苛刻的使用场景。
随着时间的推移,越来越多的开发者联系我们,希望我们能推出Unity环境下的RTMP推送模块,获取到unity的实时数据,更低延迟更高效率的实现数据传输推送,基于此,我们发布了Unity环境下的RTMP推送模块。
本文以Windows平台为例,数据源分别为Unity的窗口、摄像头或整个屏幕,编码传输模块,还是调用大牛直播SDK(官方)的原生接口,简单界面先睹为快:
这里需要注意下,如果要采集unity窗口,需要设置图层模式,先填充一层RGBA黑色背景,然后再添加一层,用于叠加外部数据。
摄像头和屏幕的数据采集,还是调用原生的SDK接口,本文不再赘述,如果需要采集Unity窗体的数据,可以用参考以下代码:
从 texture里面,通过调用 GetRawTextureData(),获取到原始数据。
数据对接,通过调用以下接口:
设置preview后,处理preview的数据回调
经测试,Unity环境下,通过高效率的数据采集、编码和推送,配合SmartPlayer播放器播放,整体延迟可控制在毫秒级,可适用于大多数Unity环境下对延迟和稳定性要求苛刻的场景。
好多开发者苦于很难在unity3d下实现RTMP直播推送,本次以大牛直播SDK的Windows平台RTMP推送模块(以推摄像头为例,如需推屏幕数据,设置相关参数即可)为例,介绍下unity3d的RTMP推送集成。
简单来说,Unity3D环境下,可以直接调用C#的接口封装,针对此,我们先做了一层封装 (nt_publisher_wrapper.cs),核心代码如下:
初始化和基础参数设置:
预览、停止预览:
开始推送、停止推送:
相关event事件回调:
SmartPublishWinMono.cs 调用上述封装的代码即可,本地预览的话,拿到回调的RGB数据,在unity3d上层刷下即可,如下图:
经测试,unity3d下,RTMP推送,配合RTMP播放端,依然可以实现毫秒级延迟的推拉流体验。
好多开发者在集成大牛直播SDK (官方)的Windows平台RTMP推送模块时吓一跳,怎么这么多接口?本文做个简单的拆分:
初始化之前,如需设置日志路径,调用NTSmartLog.NT_SL_SetPath(log_path); 设置日志存放路径。
设置过后,调用NT_PB_Init()接口,完成SDK初始化动作,注意,哪怕多实例推送,Init()接口也仅需调一次,同理,UnInit()接口也是。
然后,代码会判断系统是不是支持WR模式采集窗口,WR这种只有Win10高版本的才支持,如果不需要用到采集窗口,这个接口可忽略。
再往下,是遍历系统支持的硬解、摄像头等信息,比如LoadHWVideoEncoderInfos():
紧接着是Audio和camera相关:
OpenPublisherHandle()主要是确认选择数据源类型,然后获取推送句柄,等待做下一步的操作。
选择video option和 audio option
调用Open接口获取publisher handle,然设置event callback
SetCommonOptionToPublisherSDK()主要是指定具体采集的音视频数据类型,比如摄像头数据、屏幕数据、摄像头和屏幕叠加后的数据(以层级模式实现)、窗口等,这块比较复杂,好在作为SDK调用者,你只要搞清楚你需要采集的类型,直接移植就可以了。
其他音视频相关接口参数设定,比是否启用DXGI, Aero模式,软硬编码模式,帧率关键帧间隔码率等设定。
获取视频码率默认值,不是每个开发者都有音视频开发背景,如果不想自行设置码率等一些参数,可参考我们的码率设定。
设置推送URL后,调用StartPublisher接口开始推流,如需发送扩展SEI用户数据,推送之前设置下数据发送对接大小。
调用NT_PB_StopPublisher()即可,停止推送后,如果没有录像等,可调用NT_PB_Close()接口,关掉实例,并把handle置 IntPtr.Zero。
设置NT_PB_SetVideoPreviewImageCallBack(),调用NT_PB_StartPreview()接口即可。
停止预览更简单,调用NT_PB_StopPreview()。
1视频采集设置
说明:
1. 屏幕和摄像头相互切换:用于在线教育或者无纸化等场景,推送或录像过程中,随时切换屏幕或摄像头数据(切换数据源),如需实时切换,点击页面“切换到摄像头”按钮即可;
2. 设置遮盖层,用于设定一个长方形或正方形区域(可自指定区域大小),遮盖不想给用户展示的部分;
3. 水印:添加PNG水印,支持推送或录像过程中,随时添加、取消水印;
4. 摄像头叠加到屏幕:意在用于同屏过程中,主讲人摄像头悬浮于屏幕之上(可指定叠加坐标),实现双画面展示,推送或录像过程中,可以随时取消摄像头叠加;
5. 屏幕叠加到摄像头:同4,效果展示,实际根据需求实现;
6. 采集桌面:可以通过点击“选择屏幕区域”获取采集区域,并可在采集过程中,随时切换区域位置,如不设定,默认全屏采集;
7. 使用DXGI采集屏幕,采集时停用Aero;
8. 采集窗口:可设定需要采集的窗口,窗口放大或缩小,推送端会自适应码率和分辨率;
9. 采集帧率(帧/秒):默认屏幕采集12帧,可根据实际场景需求设定到期望帧率;
10. 缩放屏幕大小缩放比:用于高清或超高清屏,通过设定一定的比例因子,缩放屏幕采集分辨率;
11. 采集摄像头:可选择需要采集的摄像头、采集分辨率、帧率、是否需要水平或者垂直反转、是否需要旋转;
追加提问:
问题[确认数据源]:采集桌面还是摄像头?如果桌面,全屏还是部分区域?
回答:
如果是摄像头:可以选择摄像头列表,然后分辨率、帧率。
如果是屏幕:默认帧率是12帧,可以根据实际场景调整,选取屏幕区域,可以实时拉取选择需要采集或录像区域;
如果是叠加模式:可选择摄像头叠加到屏幕,还是屏幕叠加到摄像头;
更高需求的用户,可以设置水印或应用层遮盖。
问题:如果是摄像头,采集到的摄像头角度不对怎么办?
回答:我们支持摄像头镜像和翻转设置,摄像头可通过SDK接口轻松实现水平/垂直翻转、镜像效果。
2 视频码率控制
如何选择适合我的码率?
回答:如果不是有音视频背景的开发人员,可点击“获取视频码率默认值”,参考我们默认的码率推荐,如果觉得推荐码率过高或不够,可根据实际情况酌情调整。
265编码还是H.264编码?
回答:Windows平台支持H.265特定机型硬编码,如果推RTMP流,需要服务器支持RTMP H.265扩展,播放器SDK,也需要同步支持RTMP H.265扩展播放。
如果是轻量级RTSP服务SDK对接的话,只需要播放器支持RTSP H.265即可。
如果推摄像头数据,建议采用可变码率+H.265编码。
如何设置码率参数更合理?
回答:
关键帧间隔:一般来说,设置到帧率的2-4倍,比如帧率20,关键帧间隔可以设置到40-80;
平均码率:可以点击“获取视频码率默认值”,最大码率是平均码率的2倍;
视频质量:如果使用可变码率,建议采用大牛直播SDK默认推荐视频质量值;
编码速度:如高分辨率,建议1-3,值越小,编码速度越快;
H.264 Profile:默认baseline profile,可根据需要,酌情设置High profile;
NOTE:点击“推送”或“录像”或启动内置RTSP服务SDK之前,请务必设置视频码率,如不想手动设置,请点击“获取视频码率默认值”!!!
3 音频采集设置
问答式:采集音频吗?如果采集,采集麦克风还是扬声器的,亦或混音?
回答:
如果想采集电脑输出的音频(比如音乐之类),可以选择“采集扬声器”;
如果想采集麦克风音频,可以选择“采集麦克风”,并选择相关设备;
如果两个都想采集,可以两个都选择,混音输出。
4 实时音量调节
问答式:采集过程中可以改变麦克风或扬声器采集音量吗?
回答:可以,如果二者都选中,处于混音模式,也可单独调整麦克风或扬声器音量。
5 音频编码
问题:是AAC还是SPEEX?
回答:我们默认是AAC编码模式,如果需要码率更低,可以选择SPEEX编码模式,当然我们的AAC编码码率也不高,如果没有太高要求,考虑到通用性,建议使用AAC。
6 音频处理
问题:我想过滤背景噪音怎么办?
回答:选中“噪音抑制”,“噪音抑制“请和“自动增益控制”组合使用,“端点检测(VAD)”可选设置。
问题:我想做一对一互动怎么办?
回答:选中“回音消除”,可以和“噪音抑制”、“自动增益控制”组合使用,具体可参看回音消除的demo工程:WIN-EchoCancellation-CSharp-Demo。
问题:我推送或者录像过程中,随时静音怎么办?
回答:推送过程中,随时选择或取消选择“静音”功能。
7多路推送
问题:我想同时推送到多个url怎么办(比如一个内网服务器,一个外网服务器)?
回答:同时填写多个url(最多3个),然后点推送即可。
8 截图(快照)
问题:我想推送或者录像过程中,截取当前图像怎么办?
回答:那就设置好截图路径,推送或录像过程中,随时点击“截图”。
9 录像
问题:我还想录像,怎么办?
回答:设置录像文件存放目录,文件前缀、单个文件大小,是否加日期、时间,随时录制即可,此外,我们的SDK还支持录像过程中,暂停录像,恢复录像。
10 实时预览
问题:我还想看看推出去视频,特别是合成后的效果,怎么办?
回答:点击页面的“预览”按钮,就可以看到。
最近发现好多开发者都在搜索可用的RTSP测试URL,目前公网实际可测试的RTSP URL非常少,即便是可用,分辨率和网络也非常差,不适合长期测试。
针对此,我们的建议是最好直接网上买个海康或大华的摄像头,一般来说,海康大华的RTSP URL格式如下:
主码流:rtsp://admin:daniulive12345@192.168.0.120:554/h265/ch1/main/av_stream
子码流:rtsp://admin:daniulive12345@192.168.0.120:554/h264/ch1/sub/av_stream
rtsp://[username]:[password]@[ip]:[port]/[codectype]/[channel]/[subtype]/av_stream
URL组成说明:
username: 用户名;
password: 密码;
ip: 网络摄像机IP地址;
port: 端口号,默认554;
codectype:有h264/h265/mjpeg;
channel: 通道号。
subtype: 码流类型,主码流:main,子码流:sub。
主码流:rtsp://admin:admin123456@192.168.0.121:554/cam/realmonitor?channel=1&subtype=0
子码流:rtsp://admin:admin123456@192.168.0.121:554/cam/realmonitor?channel=1&subtype=1
rtsp://[username]:[password]@[ip]:[port]/cam/realmonitor?/[channel]&/[subtype]
URL组成说明:
username: 用户名;
password: 密码;
ip: 网络摄像机IP地址;
port: 端口号,默认554;
codectype:有h264/h265/mjpeg;
channel: 通道号。
subtype: 码流类型,主码流:0,子码流:1。
如果想采集PC摄像头或者屏幕,也可以本地用轻量级RTSP服务,本地生成个RTSP测试URL。常用的方式,比如VLC串流,或者大牛直播SDK(URL)的Windows平台SmartPublisherDemo生成即可。
本文就以SmartPublisherDemo轻量级RTSP服务采集本地摄像头为例,说明下如何创建个本地测试的RTSP地址。
1. 选中采集摄像头,并选择需要测试的分辨率、帧率,点击“获取视频码率默认值”,得到系统推荐的码率(高级用户也可自行配置),如需要采集audio,看采集麦克风还是扬声器的,如果二者均需采集,同时选中即可(混音模式)。
2. 点击“配置查看Rtsp服务”按钮,在弹出框点击“启动服务”即可,可启动一组也可启动多组,每个服务对应一个RTSP URL。
3. 确定后,点击“发布RTSP流”按钮即可,发布后,可本地生成个RTSP URL,以本机为例,生成的URL是“rtsp://192.168.0.211:8554/stream1”。
4. 启动播放端,输入生成的RTSP URL,测试即可。
5.服务器负载查看:再次点击“配置查看RTSP服务”,即可看到每个服务连接的会话数:
6. 如需停止服务,点击页面的“停止RTSP流”即可;
是不是非常方便?
轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务,实现本地的音视频数据(如摄像头、麦克风),编码后,汇聚到内置RTSP服务,对外提供可供拉流的RTSP URL,轻量级RTSP服务,适用于内网环境下,对并发要求不高的场景,支持H.264/H.265,支持RTSP鉴权、单播、组播模式,考虑到单个服务承载能力,我们支持同时创建多个RTSP服务,并支持获取当前RTSP服务会话连接数。
设计功能:
感兴趣的开发者,可以自行尝试。
欢迎使用上海视沃信息科技有限公司(以下简称“视沃科技”)旗下“大牛直播SDK”,试用测试前,请您仔细阅读视沃科技官方网站公布的相关规范和使用流程及本协议的全部内容,如您不同意前述任意内容,请不要进行后续操作。如您实际使用了“大牛直播SDK”,我方将视为您已完全理解并认同规范、流程及服务协议的全部内容。
本服务协议是因您使用大牛直播SDK与视沃科技所订立的有效合约。
一旦您选择试用、测试大牛直播SDK并进行后续操作,即表示您同意遵循本服务协议之所有约定,本协议即成为双方之间就大牛直播SDK软件包服务达成的有效合约。
3.1 在试用测试大牛直播SDK软件包服务前,您应知悉阅读视沃科技官网页面上的相关规范、使用流程,并理解相关内容及可能发生的后果,在使用大牛直播SDK软件包服务的过程中,您应依照相关操作指引进行操作,请您自行把握风险谨慎操作。
3.2您理解并同意,使用大牛直播SDK软件服务包是您自行独立审慎判断的结果,您将自行对此负责,包括但不限于:
3.2.1在使用过程中,您将对自行操作的行为及产生的结果负责;
3.2.1在试用、测试大牛直播SDK软件服务包阶段可免费使用,但正式授权版需签订购买合同并支付相关费用;
3.2.3在使用大牛直播SDK软件包过程中,您不应进行任何破坏或试图破坏网络安全的行为,您承诺SDK试用、测试及授权后的使用场景保持一致且视频内容合法合规,不得含有我国法律、行政法规禁止发布或传输的信息,为履行法律赋予的安全管理义务,请您下载填写附件1并将签章后的附件1发至指定邮箱;
3.2.4除视沃科技明示许可外,不得修改、翻译、改编、转许可、转让大牛直播SDK软件服务包,也不得逆向工程、反编译或试图以其他方式发现大牛直播SDK软件服务包或软件源代码;
3.2.5您不应以任何将违反国家、地方法律法规、行业管理和社会公共道德、及影响、损害或可能影响、损害视沃科技利益的方式或目的使用大牛直播SDK。
您理解并同意,在免费测试、试用其间,视沃科技虽然对大牛直播SDK软件包服务提供可用性支撑,但不对其中任何错误或漏洞提供任何担保,并不对您使用大牛直播SDK软件服务包的工作和结果承担任何责任。
5.1 您理解并认可,视沃科技保留随时修改、取消、增强大牛直播SDK软件包服务一项或多项功能的权利;
5.2如您有任何违反本服务协议的情形,或根据视沃科技自己的独立判断认为您对大牛直播SDK的使用行为不符合我司要求,我司有权随时中断您使用大牛直播SDK而无需通知您,并将相关情况向有关主管部门报告;同时,如给我司造成损失,我司有权要求赔偿。
您及视沃科技都应对对方的保密信息承担保密责任,除非经国家行政、司法等有权机关要求披露或该信息已进入公有领域。
7.1视沃科技有权随时根据有关法律、法规的变化及公司经营状况和经营策略的调整等修改本服务协议。修改后的服务协议会在视沃科技官网公布。如果不同意修改的内容,您应停止使用大牛直播SDK软件包服务。如果继续使用大牛直播SDK软件包,则视为您接受本服务协议的变动。
7.2如果本服务协议中的任何条款无论因何种原因完全或部分无效或不具有执行力,或违反任何适用的法律,则该条款被视为删除,但本服务协议的其余条款仍应有效并且有约束力。
7.3本服务协议受中华人民共和国法律管辖。在执行本服务协议过程中如发生纠纷,双方应及时协商解决。协商不成时,任何一方可直接向上海市长宁区人民法院提起诉讼。
附件1:
附件1请发送至 1130758427@qq.com
甲方签章
xxxx年xx月xx日
C++头文件:
C#头文件:
相关Lib:
集成步骤:
lib目录如下:
2. 相关cs头文件,加入需要集成的工程;
3. 在需要集成的工程,右键->Properties->
Application->Assembly name,大牛直播SDK按照APP名称授权,未授权版本,此处请改成“SmartPlayer”,如需授权,可直接联系商务;
4. 正式授权版,需要在Init()接口调用之前添加设置license的代码(相关Key和CID请根据正式授权版邮件说明填写):
C#的SDK,请在在NT.NTSmartPlayerSDK.NT_SP_Init之前添加下面的代码:
C++的SDK,请在player_api_.Init之前添加下面的代码:
需要在player_api_.Init之前添加下面的代码:
如目录存在,并具备文件写入权限,关闭应用程序后,相关文件夹下会有smart_sdk.log生成。
NT_SP_Init:SDK初始化,多实例播放,此接口仅需调用一次即可。
如系统用于特定机型环境下,特别是多路播放场景,需用到硬解码的话,可以用以下两组接口检测系统是否支持硬解。
注:在软解性能满足系统需求的前提下,一般建议优先使用软解。
如需使用硬解码,调用如下接口即可:
NT_SP_Open:每调用一次Open接口,对应一个播放实例,如需播放多实例,对应多个player handler。
注意:视频宽高回上来或绘制窗口发生变化时,记得调用NT_SP_OnWindowSize()更新,如不调用可能会引起视频模糊。
目前,几乎很少存在不支持D3D绘制的情况,考虑到系统通用性,我们在播放之前,先做检测,具体调用接口如下:
对于不支持D3D绘制的情况下,设置回调YUV数据,上层直接用GDI模式绘制,注意:GDI绘制效率偏低。
NT_SP_SetURL:支持rtsp/rtmp/本地FLV文件(全路径)。
NT_SP_SetIsOutputAudioDevice:设置是否播放出声音,这个和静音接口是有区别的,这个接口的主要目的是为了用户设置了外部PCM回调接口后,又不想让SDK播放出声音时使用。
具体可参照Demo源码里面InitCommonSDKParam():
2.4.10.1 播放前可选设置接口
* is_report: 上报开关, 1: 表上报. 0: 表示不上报. 其他值无效.
* report_interval: 上报时间间隔(上报频率),单位是秒,最小值是1秒1次. 如果小于1且设置了上报,将调用失败
* 注意:如果设置上报的话,请设置SetEventCallBack, 然后在回调函数里面处理这个事件.
* 上报事件是:NT_SP_E_EVENT_ID_DOWNLOAD_SPEED
2.4.10.2 播放前后可实时调用的接口
NT_SP_StartPlay
开始播放RTMP或RTSP流数据。
NT_SP_CaptureImage
用于播放端实时截取当前播放图片,图片以PNG形式保存至本地。
NT_SP_SwitchURL
快速切换URL,用于不用析构整个player实例的前提下,实时切换播放的URL。
NT_SP_SetUserDataCallBack
设置用户数据回调,用于接收扩展SEI模块发送的用户数据信息,如不是配合我们扩展SEI发送DK,此接口无需调用。
NT_SP_SetSEIDataCallBack
设置视频sei数据回调,用于接收SEI数据回调,如流数据不存在SEI或不准备处理SEI数据,此接口无需调用。
NT_SP_StopPlay
停止播放RTMP或RTSP流数据。
NT_SP_Close
调用Close接口后,player handler置空。
NT_SP_UnInit
UnInit() 是SDK最后一个调用的接口,多实例环境下,只需要调用一次即可。
好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的Windows平台RTSP、RTMP直播推送模块,设计和使用说明,供大家参考。
Windows平台RTMP或RTSP推送,系采集端模块,主要完成,屏幕或者摄像头数据、麦克风或扬声器数据的采集,编码,然后按照特定格式打包,通过RTMP或者RTSP传输出去,实现直播目的。
对应设计架构图的“发布端”,编码后的音视频数据,按照协议打包后,推送到流媒体服务器(如RTMP服务器,自建服务,可以考虑SRS或者nginx服务器,如果是RTSP服务器,可以考虑苹果官方的darwin streaming server)。
这种方案的设计,一般是一对多设计模型,接收端接收RTMP或RTSP流,然后解析音视频数据,解码、同步音视频数据,并绘制,实现整体的直播解决方案。
以下是设计架构图:
demo说明
C++头文件:
C#头文件:
相关Lib:
lib目录如下:
2. 相关cs头文件,加入需要集成的工程;
3. 在需要集成的工程,右键->Properties->Application->Assembly name,写入“SmartPulisherDemo”。
考虑到Windows平台推送端SDK功能相对复杂,以问答式:
1视频采集设置
1. 屏幕和摄像头相互切换:用于在线教育或者无纸化等场景,推送或录像过程中,随时切换屏幕或摄像头数据(切换数据源),如需实时切换,点击页面“切换到摄像头”按钮即可;
2. 设置遮盖层,用于设定一个长方形或正方形区域(可自指定区域大小),遮盖不想给用户展示的部分;
3. 水印:添加PNG水印,支持推送或录像过程中,随时添加、取消水印;
4. 摄像头叠加到屏幕:意在用于同屏过程中,主讲人摄像头悬浮于屏幕之上(可指定叠加坐标),实现双画面展示,推送或录像过程中,可以随时取消摄像头叠加;
5. 屏幕叠加到摄像头:同4,效果展示,实际根据需求实现;
6. 采集桌面:可以通过点击“选择屏幕区域”获取采集区域,并可在采集过程中,随时切换区域位置,如不设定,默认全屏采集;
7. 使用DXGI采集屏幕,采集时停用Aero;
8. 采集窗口:可设定需要采集的窗口,窗口放大或缩小,推送端会自适应码率和分辨率;
9. 采集帧率(帧/秒):默认屏幕采集8帧,可根据实际场景需求设定到期望帧率;
10. 缩放屏幕大小缩放比:用于高清或超高清屏,通过设定一定的比例因子,缩放屏幕采集分辨率;
11. 采集摄像头:可选择需要采集的摄像头、采集分辨率、帧率、是否需要水平或者垂直反转、是否需要旋转;
追加提问:
问题[确认数据源]:采集桌面还是摄像头?如果桌面,全屏还是部分区域?
回答:
如果是摄像头:可以选择摄像头列表,然后分辨率、帧率。
如果是屏幕:默认帧率是5帧,可以根据实际场景调整,选取屏幕区域,可以实时拉取选择需要采集或录像区域;
如果是叠加模式:可选择摄像头叠加到屏幕,还是屏幕叠加到摄像头;
更高需求的用户,可以设置水印或应用层遮盖。
问题:如果是摄像头,采集到的摄像头角度不对怎么办?
回答:我们支持摄像头镜像和翻转设置,摄像头可通过SDK接口轻松实现水平/垂直翻转、镜像效果。
2 视频码率控制
我选可变码率还是平均码率?
回答:可变码率的优势在于,如果屏幕或摄像头变化不大,码率超低,特别是H.265编码,平均码率,码率比较均匀,需设置平均码率+最大码率,一般摄像头采集建议选择可变码率,屏幕采集选择平均码率,如需采用可变码率,请取消“使用平均码率”选项。
265编码还是H.264编码?
回答:Windows 64位库支持H.265编码,如果推RTMP流,需要服务器支持RTMP H.265扩展,播放器SDK,也需要同步支持RTMP H.265扩展播放。
如果是轻量级RTSP服务SDK对接的话,只需要播放器支持RTSP H.265即可。
如果推摄像头数据,建议采用可变码率+H.265编码。
如何设置码率参数更合理?
回答:
关键帧间隔:一般来说,设置到帧率的2-4倍,比如帧率20,关键帧间隔可以设置到40-80;
平均码率:可以点击“获取视频码率默认值”,最大码率是平均码率的2倍;
视频质量:如果使用可变码率,建议采用大牛直播SDK默认推荐视频质量值;
编码速度:如高分辨率,建议1-3,值越小,编码速度越快;
H.264 Profile:默认baseline profile,可根据需要,酌情设置High profile;
NOTE:点击“推送”或“录像”或启动内置RTSP服务SDK之前,请务必设置视频码率,如不想手动设置,请点击“获取视频码率默认值”!!!
3 音频采集设置
问答式:采集音频吗?如果采集,采集麦克风还是扬声器的,亦或混音?
回答:
如果想采集电脑输出的音频(比如音乐之类),可以选择“采集扬声器”;
如果想采集麦克风音频,可以选择“采集麦克风”,并选择相关设备;
如果两个都想采集,可以两个都选择,混音输出。
4 音频编码
问题:是AAC还是SPEEX?
回答:我们默认是AAC编码模式,如果需要码率更低,可以选择SPEEX编码模式,当然我们的AAC编码码率也不高。
5 音频处理
问题:我想过滤背景噪音怎么办?
回答:选中“噪音抑制”,“噪音抑制“请和“自动增益控制”组合使用,“端点检测(VAD)”可选设置。
问题:我想做一对一互动怎么办?
回答:选中“回音消除”,可以和“噪音抑制”、“自动增益控制”组合使用。
问题:我推送或者录像过程中,随时静音怎么办?
回答:推送过程中,随时选择或取消选择“静音”功能。
6多路推送
问题:我想同时推送到多个url怎么办(比如一个内网服务器,一个外网服务器)?
回答:同时填写多个url,然后点推送即可。
7 截图(快照)
问题:我想推送或者录像过程中,截取当前图像怎么办?
回答:那就设置好截图路径,推送或录像过程中,随时点击“截图”。
8 录像
问题:我还想录像,怎么办?
回答:设置录像文件存放目录,文件前缀、单个文件大小,是否加日期、时间,随时录制即可,此外,我们的SDK还支持录像过程中,暂停录像,恢复录像。
9 实时预览
问题:我还想看看视频特别是合成后的效果,怎么办?
回答:点击页面的“预览”按钮,就可以看到。
如需下载demo源码工程,可以到 Github 下载 “Windows平台RTMP|RTSP推送SDK、内置RTSP服务SDK、录像SDK”,C++或者C#的都有。
NT_PB_Init
如需配置log路径,请在NT_PB_Init之前,做如下设置(目录可自行指定):
// 设置日志路径(请确保目录存在)
//String log_path = “D:\\pulisherlog”;
//NTSmartLog.NT_SL_SetPath(log_path);
NT_PB_Open
在多个实例推送多路时,对于一个摄像头来说,所有实例只能共享摄像头,那么只有一个实例可以改变摄像头分辨率,其他实例使用这个缩放后的图像;
在使用多实例时,调用这个接口禁止掉实例的分辨率设置能力.只留一个实例能改变分辨,如果不设置,行为未定义;
这个接口必须在 SetLayersConfig, AddLayerConfig 之前调用。
public enum NT_PB_E_LAYER_TYPE : int
{
NT_PB_E_LAYER_TYPE_SCREEN = 1, // 屏幕层
NT_PB_E_LAYER_TYPE_CAMERA = 2, // 摄像头层
NT_PB_E_LAYER_TYPE_RGBA_RECTANGLE = 3, // RGBA矩形
NT_PB_E_LAYER_TYPE_IMAGE = 4, // 图片层
NT_PB_E_LAYER_TYPE_EXTERNAL_VIDEO_FRAME = 5, // 外部视频数据层
NT_PB_E_LAYER_TYPE_WINDOW = 6, // 窗口层
}
/*定义Video源选项*/
public enum NT_PB_E_VIDEO_OPTION : uint
{
NT_PB_E_VIDEO_OPTION_NO_VIDEO = 0x0,
NT_PB_E_VIDEO_OPTION_SCREEN = 0x1, // 采集屏幕
NT_PB_E_VIDEO_OPTION_CAMERA = 0x2, // 摄像头采集
NT_PB_E_VIDEO_OPTION_LAYER = 0x3, // 视频合并,比如桌面叠加摄像头等
NT_PB_E_VIDEO_OPTION_ENCODED_DATA = 0x4, // 已经编码的视频数据,目前支持H264
NT_PB_E_VIDEO_OPTION_WINDOW = 0x5, // 采集窗口
}
/*定义Auido源选项*/
public enum NT_PB_E_AUDIO_OPTION : uint
{
NT_PB_E_AUDIO_OPTION_NO_AUDIO = 0x0,
NT_PB_E_AUDIO_OPTION_CAPTURE_MIC = 0x1, // 采集麦克风音频
NT_PB_E_AUDIO_OPTION_CAPTURE_SPEAKER = 0x2, // 采集扬声器
NT_PB_E_AUDIO_OPTION_CAPTURE_MIC_SPEAKER_MIXER = 0x3, // 麦克风扬声器混音
NT_PB_E_AUDIO_OPTION_ENCODED_DATA = 0x4, // 编码后的音频数据,目前支持AAC, speex宽带(wideband mode)
}
* 在一些特殊场景下, 视频分辨率会改变, 如果设置一个固定码率的的话,当视频分辨率变大的时候会变的模糊,变小的话又会浪费码率
* 所以提供可以设置一组码率的接口,满足不同分辨率切换的需求
* 规则: 比如设置两组分辨率 640*360, 640*480, 那么当分辨率小于等于640*360时都使用640*360的码率,
* 当分辨率大于640*360且小于等于640*480时,就使用640*480的码率,如果分辨率大于640*480 那就使用640*480的分辨率
* 为了设置的更准确, 建议多划分几组, 让区间变小
* 调用这个接口每次设置一组,设置多组就调用多次
* item对应 NT_PB_VideoEncoderBitrateGroupItem
NT_PB_SetURL:rtmp推送url设置
NT_PB_StartPublisher
NT_PB_StopPublisher:注意,此接口和NT_PB_StartPublisher配套使用
NT_PB_SetPushRtspTransportProtocol:设置推送rtsp传输方式,一般服务器可同时支持RTSP TCP或UDP传输模式,部分服务器只支持TCP或UDP模式。其中,transport_protocol: 1表示UDP传输rtp包; 2表示TCP传输rtp包. 默认是1, UDP传输。
NT_PB_SetPushRtspURL:注意,RTSP推送时,确保服务器推送URL可用。
NT_PB_StartPushRtsp
NT_PB_StopPushRtsp:注意,此接口和NT_PB_StartPushRtsp配套使用。
NT_PB_SetMute:设置推送实时静音
NT_PB_CaptureImage:推送或者录像过程中,实时快照
NT_PB_Close:调用这个接口之后handle失效
NT_PB_UnInit:这个是最后一个调用的接口
以上是我们的设计模块部分资料,感兴趣的开发者,可以酌情参考。