Windows平台RTMP/RTSP直播推送模块设计和使用说明
2021-01-14 02:11
标签:user form 用户 一般来说 stat 内网 开发 text -keep 好多开发者一直反馈,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 实时预览 问题:我还想看看视频特别是合成后的效果,怎么办? 回答:点击页面的“预览”按钮,就可以看到。 10 音视频加密 问题:我想我的数据走标准协议,但是加密流,怎么办? 回答:大牛直播SDK的RTMP推流模块,支持AES(AES128/AES192/AES256)和SM4加密。 如需下载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:这个是最后一个调用的接口 以上是我们的设计模块部分资料,感兴趣的开发者,可以酌情参考。 Windows平台RTMP/RTSP直播推送模块设计和使用说明 标签:user form 用户 一般来说 stat 内网 开发 text -keep 原文地址:https://www.cnblogs.com/daniulivesdk/p/12275976.html开发背景
整体方案架构
模块设计
功能设计
集成和使用说明
集成步骤
功能详解
接口调用时序(以C#为例)
1 初始化
2 Open
3 设置回调事件
4 设置屏幕裁剪
5 屏幕选取工具
6 设置屏幕采集参数
7 设置摄像头采集参数
8 视频合成图层类型
9 音视频源类型
10 视频编码接口
11 音频编码接口
12 音频处理接口
13 图层合成等接口
14 RTMP推送-设置AES/SM4加密
15 RTMP推送-设置推送RTMP Url
16 RTMP推送-启动推送RTMP流
17 RTMP推送-停止推送RTMP流
18 RTSP推送-设置传输方式(TCP/UDP)
19 RTSP推送-设置推送RTSP Url
20 RTSP推送-启动推送RTSP流
21 RTSP推送-启动推送RTSP流
22 RTMP/RTSP推送端录像
23 实时静音(实时调用)
24 快照(实时调用)
25 Close
26 Uninit
文章标题:Windows平台RTMP/RTSP直播推送模块设计和使用说明
文章链接:http://soscw.com/index.php/essay/41570.html