技术背景
好多开发者跟我们做技术交流的时候,会问到如何快速实现Windows平台屏幕摄像头推流能力?一个好的Windows推送模块,需要注意哪些技术细节?
技术探讨
本文以Windows平台为例,谈谈我们对这块的理解。大牛直播SDK的RTMP推送|轻量级RTSP服务模块实现主要涉及到SDK的初始化、视频采集设置、音频采集设置、编码设置、推流设置以及实时预览和停止预览等功能:
目前,以RTMP推送模块为例,目前我们主要设计支持以下功能:
- 音频编码:AAC/SPEEX;
- 视频编码:H.264、H.265;
- 推流协议:RTMP;
- [音视频]支持纯音频/纯视频/音视频推送;
- [屏幕/摄像头]支持帧率、关键帧间隔(GOP)、码率(bit-rate)设置;
- [屏幕]支持屏幕裁剪,根据帧率和推送分辨率,自动推荐码流;
- [摄像头]支持摄像头选择、分辨率设置、帧率设置;
- [摄像头]摄像头支持水平反转、垂直反转、0° 90° 180° 270°旋转;
- [屏幕]支持DXGI采集设置、启/停用Aero;
- [音频]采集麦克风;
- [音频]采集扬声器;
- [预览]支持推送端实时预览;
- 支持实时静音、取消静音;
- [对接服务器]支持自建标准RTMP服务器或CDN;
- 支持断网自动重连、网络状态回调;
- 屏幕和摄像头合成/多层合成;
- 支持窗口采集(一般不建议使用);
- 支持实时动态水印;
- 支持实时快照;
- 支持降噪处理、自动增益控制、VAD端点检测;
- 支持扬声器和麦克风混音;
- 支持外部编码前音视频数据对接;
- 支持外部编码后音视频数据对接;
- 支持RTMP扩展H.265(需设备支持H.265特定机型硬编码)和Enhanced RTMP;
- 支持特定机型硬编码;
- 支持实时音量调节;
- 支持扩展录像模块;
- 支持Unity接口;
- 支持H.264扩展SEI发送模块;
- 支持Windows7及以上版本。
如果是轻量级RTSP服务:
- [基础功能]支持Windows平台RTMP直播推送模块常规功能;
- [音频格式]AAC;
- [视频格式]H.264、H.265;
- [协议类型]RTSP;
- [传输模式]支持单播和组播模式;
- [端口设置]支持RTSP端口设置;
- [鉴权设置]支持RTSP鉴权用户名、密码设置;
- [获取session连接数]支持获取当前RTSP服务会话连接数;
- [多服务支持]支持同时创建多个内置RTSP服务;
- [RTSP url回调]支持设置后的rtsp url通过event回调到上层。
1. 模块初始化和环境设置
- 设置日志路径:在初始化SDK之前,可以调用相关接口设置日志文件的存放路径,以便后续调试和日志分析。
- 初始化SDK:调用
NT_PB_Init()
接口完成SDK的初始化。注意,无论后续是否进行多实例推送,Init()
接口都仅需调用一次。
2. 视频采集设置
- 数据源选择:支持从摄像头、屏幕或外部数据源采集视频数据。
- 参数设置:包括帧率、分辨率、码率、关键帧间隔等。这些参数可以通过SDK接口单独设置,以满足不同的推流需求。
- 摄像头设置:支持摄像头选择、分辨率设置、帧率设置、水平/垂直翻转、旋转等。
- 屏幕采集:支持全屏采集或部分区域采集,同时支持DXGI采集设置和启/停用Aero等功能。
3. 音频采集设置
- 音频源选择:支持采集麦克风音频、扬声器音频或进行混音输出。
- 编码设置:默认使用AAC编码模式,但也可以选择SPEEX编码模式以获取更低的码率。
- 音频处理:支持噪音抑制、自动增益控制、回音消除等音频处理功能。
4. 编码设置
- 视频编码:支持H.264和H.265编码。在Windows 64位系统上,如果推RTMP流,需要服务器支持RTMP H.265扩展(或Enhanced RTMP),同时播放器SDK也需要同步支持RTMP H.265扩展播放。
- 音频编码:如前所述,支持AAC和SPEEX编码。
5. 推流设置
- 推流协议:看是使用RTMP还是轻量级RTSP服务。
- 推流地址:如果是RTMP,可以设置RTMP服务器的推流地址,可以支持同时推送到多个URL(如一个内网服务器,一个外部服务器),如果是轻量级RTSP服务,发布RTSP流后,会回调上来一个可供拉流播放的RTSP URL。
- 网络状态回调:支持断网自动重连和网络状态回调功能,以确保推流的稳定性和可靠性。
6. 实时预览和停止预览
- 实时预览:支持在推流前进行实时预览,以便检查视频和音频的采集效果。
- 停止预览:在推流过程中或预览时,可以随时停止预览以节省系统资源。
7. 其他功能
- 支持多种操作系统:大牛直播SDK推送端支持Windows 7及以上系统。
- 集成示例:提供了C++和C#两套接口示例(如WIN-PublisherSDK-CPP-Demo和WIN-PublisherSDK-CSharp-Demo),方便开发者参考和集成。
- 扩展功能:支持实时快照、实时录像、降噪处理、自动增益控制、VAD端点检测等扩展功能。
总结
一个好的推送模块,除了实现高效率的编码传输外,还要有好的音视频采集机制和灵活的架构支持,便于后期功能扩展,比如实时快照、预览、实时录像等。除此之外,还要有好的交互机制(比如envent callback)、低延迟和长期运行稳定的性能。