傲瑞组件开发手册(06) -- 推流组件 NPusher
在直播系统中,我们需要将我们的视频(摄像头、桌面)、声音(麦克风、声卡)推到流服务器上,然后,观看方就可以在PC浏览器和手机浏览器(以及微信)中直接拉流播放。
NPusher 是傲瑞科技推出的实用组件之一,它可将视频以及声音推到流服务器上。
一.NPusher简介
当前版本的NPusher组件支持:
1. 音频数据格式:PCM原始数据、AAC编码数据。(采样率:16000,位数:16bit,声道数:1或2)
2. 视频数据格式:RGB24原始图像数据、H264编码数据。
二.NPusher结构
对于使用者而言,NPusher组件中的主要类结构图如下所示:
1. IStreamPusher 是推流器接口。我们可以通过调用PusherFactory的CreatePusher来创建推流器实例。
2. 得到推流器实例后,我们需调用Initialize或者Initialize4OMCS方法将其初始化。
3. 然后再调用PushVideoFrame将相关的视频帧推上去,调用PushAudioFrame将相关的音频帧推上去;
4. 若不再使用就调用Close方法即可。
三.使用接口详细定义
public interface IStreamPusher { /// <summary> /// 与流媒体服务器的连接断开时,触发此事件。 /// </summary> event CbSimple Disconnected; /// <summary> /// 与流服务器连接正常? /// </summary> bool Connected { get; } /// <summary> /// 如果输入RGB24图像,是否要上下颠倒。默认值:false。 /// </summary> bool UpsideDown4RGB24 { get; set; } /// <summary> /// 初始化推流器。 /// </summary> /// <param name="serverIP">流服务器IP</param> /// <param name="serverPort">流服务器端口</param> /// <param name="hlsEnabled">是否启用HLS(以支持H5播放)</param> /// <param name="streamID">流ID</param> /// <param name="videoWidth">视频图像宽度</param> /// <param name="videoHeight">视频图像高度</param> /// <param name="audioDataType">输入的声音数据的类型。采样率:16k,位数:16</param> /// <param name="videoDataType">输入的视频数据的类型/param> /// <param name="audioChannelCount">声道数/param> void Initialize(string serverIP, int serverPort, bool hlsEnabled, string streamID, int videoWidth, int videoHeight, InputAudioDataType audioDataType, InputVideoDataType videoDataType, int audioChannelCount);
/// <summary> /// 初始化推流器。 /// </summary> /// <param name="serverIP">流服务器URL</param> /// <param name="videoWidth">视频图像宽度</param> /// <param name="videoHeight">视频图像高度</param> /// <param name="audioDataType">输入的声音数据的类型。采样率:16k,位数:16</param> /// <param name="videoDataType">输入的视频数据的类型/param> /// <param name="audioChannelCount">声道数/param> void Initialize(string rtmpUrl, int videoWidth, int videoHeight, InputAudioDataType audioDataType, InputVideoDataType videoDataType, int audioChannelCount); /// <summary> /// 初始化推流器(从OMCS获取音视频数据)。 /// </summary> /// <param name="serverIP">流服务器IP</param> /// <param name="serverPort">流服务器端口</param> /// <param name="hlsEnabled">是否启用HLS(以支持H5播放)</param> /// <param name="streamID">流ID</param> void Initialize4OMCS(string serverIP, int serverPort, bool hlsEnabled, string streamID); /// <summary> /// 推送视频帧。 /// </summary> /// <param name="videoFrame">视频帧数据</param> /// <returns>推送成功则返回true</returns> bool PushVideoFrame(byte[] videoFrame); /// <summary> /// 推送音频帧。 /// </summary> /// <param name="audioFrame">音频帧数据</param> /// <returns>推送成功则返回true</returns> bool PushAudioFrame(byte[] audioFrame); /// <summary> /// 关闭并释放推流器。 /// </summary> void Close(); }
1. Initialize4OMCS 方法用于将 OMCS 的音视频数据推到流服务器。
2. Initialize方法中audioDataType输入的声音数据类型、videoDataType输入的视频数据类型、audioChannelCount输入的声道数。这些参数要与推送帧的格式一致。
3. UpsideDown4RGB24属性指采集的RGB24图像数据是否要上下颠倒,在初始化前做设置。
四.NPusher Demo 下载
1.Demo示例:推流本地摄像头、麦克风、桌面、声卡
下载本Demo源码:Oraycn.NPusherDemo.rar
使用 MCapture 可以采集到当前电脑的摄像头或桌面的图像,以及麦克风或声卡的声音数据。然后,就可以使用NPusher将这些数据推送到流服务器。
Demo中,我们使用Nginx作为流服务器。 (关于Nginx作为流服务器的使用,请参见本文文末)
注:若选择采集声卡的声音,需将扬声器的格式设置成16位,48000Hz
另外,该demo中,可以同时推送声卡和麦克风的声音(内部使用了混音技术)。
2. Demo示例:在服务端推流或推流远程的摄像头、麦克风、桌面、声卡
下载本Demo源码:OMCS.Demos.SimplestAndPushStream.rar
就像在《远程录制或在服务器端录制语音、视频、屏幕》 中描述的方法一样,结合OMCS,我们也可以在服务端推流或推流远程用户设备(PC、Android、iOS)的摄像头、麦克风、桌面/屏幕。
现在,我们同样是在《OMCS入门Demo》的服务端增加推流功能,可推流指定在线用户的摄像头的视频和麦克风的声音。当然,桌面和声卡也是可以推的,原理是一样的,在demo代码中稍作修改即可。
demo示例可按如下运行:
(1)首先,启动Nginx服务器。
(2)其次,启动该demo中的服务端,然后在PC或Android或iOS上,启动一个入门demo的客户端,并使用 aa01 登录。
(3)最后,在服务端界面上选择一个在线用户,如aa01,并点击 “推流”按钮。
请特别注意:
如果是在服务端推流或远程推流,客户端的IMultimediaManager 的 Advanced 的 MaxInterval4DesktopKeyFrame 或 MaxInterval4CameraKeyFrame 必须设置为 1。
multimediaManager.Advanced.MaxInterval4CameraKeyFrame = 1; //若需远程推流摄像头时设置该属性 multimediaManager.Advanced.MaxInterval4DesktopKeyFrame = 1;//若需远程推流桌面时设置该属性
3.附:使用Nginx作为流服务器
1. 部署Nginx服务器
Nginx部署版下载:网盘下载 (提取码:1234),如果已有Nginx程序,也可单独下载配置文件(其中配置开启了hls):nginx.conf
下载好Nginx部署版,并部署到服务器上,其中有3个地方需要根据服务器的配置自行做修改。
- conf目录下 nginx.conf 文件中 rtmp 端口,默认是9000,以及http端口,默认是8000 。
-
html目录下index.html文件(该页面用于在PC浏览器(需flash插件)中访问),打开该文件,在其中设置流服务器的IP
src: "rtmp://192.168.1.56:9000/hls/"+pqs._parameters.id[0], //将192.168.1.56改成自己流服务器的IP
-
html目录下mobile.html文件(该页面用于在手机浏览器中访问,基于HLS),打开该文件,也在其中同样设置流服务器的IP
var hls_url = "http://192.168.1.56:8000/hls/" + pqs._parameters.id[0] + ".m3u8"; //将192.168.1.56改成自己流服务器的IP
2.浏览器访问
(1)PC 浏览器访问: http://192.168.1.56:8000/index.html?id=aa01 ,其中aa01为流的ID。(使用Flash Player 插件播放)
(2)手机浏览器访问: http://192.168.1.56:8000/mobile.html?id=aa01 ,其中aa01为流的ID。(使用 Video.js)
(3)查看Nginx运行状态可访问: http://192.168.1.56:8000/stat 。
(4)若不想使用 flash player,可以这样做:
a. 流媒体服务器使用srs,在srs服务器上,将rtmp流转换成 HTTP-FLV 流。
b. 在网页中嵌入播放插件 flv.js,使用 flv.js 来播放。
Q Q:168757008