前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows平台快速集成RTSP/RTMP直播播放能力

Windows平台快速集成RTSP/RTMP直播播放能力

原创
作者头像
音视频牛哥
修改2020-06-08 14:34:38
2K0
修改2020-06-08 14:34:38
举报

本文主要介绍,如何调用大牛直播播放SDK快速实现RTSP/RTMP播放能力。

demo说明

  1. SDK提供C++/C#两套接口,对外提供32/64位库,C++和C#接口一一对应,C#接口比C++接口增加前缀NT_PB_;
  2. WIN-PlayerSDK-CPP-Demo:播放端SDK对应的C++接口的demo;
  3. WIN-PlayerSDK-CSharp-Demo:播放端SDK对应的C#接口的demo; 播放端SDK支持Win7及以上系统;
  4. 本demo基于VS2013开发;
  5. 相关接口,可以到 [Github](daniulive/SmarterStreaming) 下载。

集成说明

C++头文件:

  1. [类型定义]nt_type_define.h
  2. [Log定义]smart_log.h
  3. [Log定义]smart_log_define.h
  4. [base code定义]nt_base_code_define.h
  5. [player接口]smart_player_define.h
  6. [player参数定义]smart_player_sdk.h

C#头文件:

  1. [base code定义]nt_base_code_define.cs
  2. [player接口]smart_player_define.cs
  3. [player参数定义]smart_player_sdk.cs

到以下目录,拷贝相关lib库到自己系统目录:

  1. 32位debug:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\Debug
  2. 32位 release:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\Release
  3. 64位debug:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\x64\Debug
  4. 64位release:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\x64\Release

在需要集成的工程,右键->Properties->

Application->Assembly name,大牛直播SDK按照APP名称授权,未授权版本,此处请改成“SmartPlayer”,如需授权,可直接联系商务;

1 初始化

NT_SP_Init

如需配置log路径,请在NT_SP_Init之前,做如下设置(目录可自行指定):

代码语言:javascript
复制
        // 设置日志路径(请确保目录存在)
        //String log_path = "D:\\playerlog";
        //NTSmartLog.NT_SL_SetPath(log_path);

注意:正式授权版本集成,NT_SP_Init之前,需要调用NT_SP_SetSDKClientKey接口,设置license Key,不然调用失败:

代码语言:javascript
复制
NT.NTSmartPlayerSDK.NT_SP_SetSDKClientKey("xxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxx", 0, IntPtr.Zero);

2 Open生成播放实例

NT_SP_Open:每调用一次Open接口,对应一个播放实例,如需播放多实例,对应多个player handler。

3 设置回调事件

① NT_SP_SetEventCallBack:用于回调网络链接状态、buffer状态(开始、buffer比例、结束)、实时带宽等;

② NT_SP_SetVideoSizeCallBack:设置视频分辨率回调;

③ NT_SP_SetVideoFrameCallBack:设置YUV/RGB32数据回调,可用于对接第三方视频分析,或自行绘制等;

④ NT_SP_SetVideoFrameCallBackV2:设置YUV/RGB32数据回调,与NT_SP_SetVideoFrameCallBack接口的不同在于,吐出来的视频数据, 可以指定宽高;

⑤ NT_SP_SetRenderVideoFrameTimestampCallBack:设置绘制视频帧时,视频帧时间戳回调;

⑥ NT_SP_SetAudioPCMFrameCallBack:设置音频PCM帧回调, 吐PCM数据出来,目前每帧大小是10ms;

⑦ NT_SP_SetUserDataCallBack:设置用户数据回调,此接口需要和推送端SDK配套使用,用于返回推送端设定的实时用户数据(如时间戳、经纬度等各种扩展指令或信息);

⑧ NT_SP_SetSEIDataCallBack:设置视频SEI数据回调。

4 设置RTMP/RTSP播放Url

NT_SP_SetURL:支持rtsp/rtmp/本地FLV文件(全路径)

5 查看是否支持D3DRender

设置绘制窗口句柄(可选接口)

① NT_SP_IsSupportD3DRender

② NT_SP_SetRenderWindow

③ NT_SP_GDIDrawRGB32:使用GDI绘制RGB32数据

6 设置回调PCM

NT_SP_SetIsOutputAudioDevice:设置是否播放出声音,这个和静音接口是有区别的,这个接口的主要目的是为了用户设置了外部PCM回调接口后,又不想让SDK播放出声音时使用。

7 RTMP/RTSP播放参数设置

① NT_SP_SetBuffer:设置视频播放缓冲buffer大小,单位:毫秒;

② NT_SP_SetMute:播放过程中,实时静音、取消静音,可播放之前调用,亦或播放过程中实时调用;

③ NT_SP_SetRTSPTcpMode:设置RTSP TCP 模式, 1为TCP, 0为UDP, 此接口仅RTSP有效;

④ NT_SP_SetRtspTimeout:设置RTSP超时时间, timeout单位为秒,必须大于0;

NT_SP_SetRtspAutoSwitchTcpUdp:对于RTSP来说,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式. 为了方便使用,有些场景下可以开启自动尝试切换开关, 打开后如果udp无法播放,sdk会自动尝试tcp, 如果tcp方式播放不了,sdk会自动尝试udp, is_auto_switch_tcp_udp: 如果设置1的话, sdk将在tcp和udp之间尝试切换播放,如果设置为0,则不尝试切换;

⑤ NT_SP_SetFastStartup:设置秒开, 1为秒开, 0为不秒开,此接口用于如RTMP服务器缓存GOP时,酌情使用;

⑥ NT_SP_SetLowLatencyMode:设置低延时播放模式,默认是正常播放模式,mode: 1为低延时模式, 0为正常模式;

⑦ NT_SP_SetRotation:设置视频View旋转,顺时针旋转,degress: 设置0, 90, 180, 270度有效,其他值无效,注意:除了0度,其他角度播放会耗费更多CPU;

⑧ NT_SP_SetFlipVertical:设置视频View上下反转(垂直反转);

⑨ NT_SP_SetFlipHorizontal:设置视频View水平反转;

⑩ NT_SP_SetReportDownloadSpeed:设置下载速度上报, 默认不上报下载速度

* is_report: 上报开关, 1: 表上报. 0: 表示不上报. 其他值无效.

* report_interval: 上报时间间隔(上报频率),单位是秒,最小值是1秒1次. 如果小于1且设置了上报,将调用失败

* 注意:如果设置上报的话,请设置SetEventCallBack, 然后在回调函数里面处理这个事件.

* 上报事件是:NT_SP_E_EVENT_ID_DOWNLOAD_SPEED

⑪ NT_SP_GetDownloadSpeed:主动获取下载速度,speed: 返回下载速度,单位是Byte/s;

⑫ NT_SP_SetParam:万能接口, 设置参数, 大多数问题, 这些接口都能解决;

⑬ NT_SP_GetParam:万能接口, 得到参数, 大多数问题,这些接口都能解决;

⑭ NT_SP_SetKey:设置RTMP加密流的解密key,目前只用来解密rtmp加密流,需与大牛直播SDK RTMP推送端配套使用;

⑮ NT_SP_SetDecryptionIV:设置RTMP加密流的解密向量,目前只用来解密rtmp加密流;

⑯ NT_SP_SetSDKClientKey:设置授权Key,正式授权Key请联系官方。

8 检测是否支持硬解码

Windows平台硬解码,主要适用于性能偏弱的PC端,或者有多路播放诉求的场景,一般建议在软解性能没问题的情况下,尽量软解,具体处理如下,先检测系统是否支持硬解,如果支持,再做硬解设置,这样的好处在于如果系统不支持硬解,可以继续软解播放,具体设置如下,在调用NT_SP_Open()之前,做检测,因为NT_SP_Open()每个句柄对应一个player实例,多个实例只需要做一次判断即可:

代码语言:javascript
复制
		/*
         * 检查是否支持H264硬解码 
         * 如果支持的话返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
		public static extern UInt32 NT_SP_IsSupportH264HardwareDecoder();

		/*
         * 检查是否支持H265硬解码
         * 如果支持的话返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
		public static extern UInt32 NT_SP_IsSupportH265HardwareDecoder();

		/*
         * 设置H264硬解
         * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解
         * reserve: 保留参数, 当前传0就好
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetH264HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve);

		/*
         * 设置H265硬解
         * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解
         * reserve: 保留参数, 当前传0就好
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetH265HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve);

9 RTMP/RTSP播放端-开始播放

NT_SP_StartPlay

10 绘制窗口大小改变

NT_SP_OnWindowSize(),如播放窗口大小调整,需调用此接口。

11 RTMP/RTSP拉流端录像

① NT_SP_SetRecorderDirectory:设置录像目录

② NT_SP_SetRecorderFileMaxSize:设置单个文件最大大小

③ NT_SP_SetRecorderFileNameRuler:设置录像文件名生成规则

④ NT_SP_SetRecorderCallBack:设置录像回调接口

⑤ NT_SP_SetRecorderAudioTranscodeAAC:设置录像时音频转AAC编码的开关, aac比较通用,sdk增加其他音频编码(比如speex, pcmu, pcma等)转aac的功能

⑥ NT_SP_SetRecorderVideo:设置是否录视频,默认的话,如果视频源有视频就录,没有就没得录, 但有些场景下可能不想录制视频,只想录音频,所以增加个开关

⑦ NT_SP_SetRecorderAudio:设置是否录音频,默认的话,如果视频源有音频就录,没有就没得录, 但有些场景下可能不想录制音频,只想录视频,所以增加个开关

⑧ NT_SP_StartRecorder:启动录像

⑨ NT_SP_StopRecorder:停止录像

12 RTMP/RTSP拉流端快照(实时调用)

实时快照功能不表,是一个好的RTSP播放器和RTMP播放器必备的功能,实时快照是把解码后的yuv数据重新编码成png,所以有一定的CPU消耗,不建议过于频繁操作。

NT_SP_CaptureImage:捕获图片

13 RTMP/RTSP拉流端快速切换URL(实时调用)

NT_SP_SwitchURL:切换URL,其中:switch_pos: 切换到新url以后,设置的播放位置, 默认请填0, 这个只对设置播放位置的点播url有效, 直播url无效

14 用户数据回调

NT_SP_SetUserDataCallBack:设置用户数据回调,用于接收扩展SEI模块发送的用户数据信息

15 SEI数据回调

NT_SP_SetSEIDataCallBack:设置视频sei数据回调,用于接收SEI数据回调

16 设置视频画面填充模式

代码语言:javascript
复制
/*
         * 设置视频画面的填充模式,如填充整个绘制窗口、等比例填充绘制窗口,如不设置,默认填充整个绘制窗口
         * handle: 播放句柄
         * mode: 0: 填充整个绘制窗口; 1: 等比例填充绘制窗口, 默认值是0
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetRenderScaleMode(IntPtr handle, Int32 mode);

17 只解码关键帧

只解关键帧的场景,也是用于多路播放诉求,比如一般的监控场景,考虑到多路的场景,一般关键帧间隔不大(如1-2秒一个),平台可对现场场景有个宏观了解,如需重点关注某几路画面的时候,再实时取消这个选项,实现全帧播放,所以,只解关键帧一定要做成实时调用的接口才更有设计意义。

代码语言:javascript
复制
            // 设置是否只解码关键帧
            if (btn_check_only_decode_video_key_frame.Checked)
            {
                NTSmartPlayerSDK.NT_SP_SetOnlyDecodeVideoKeyFrame(player_handle_, 1);
            }
            else
            {
                NTSmartPlayerSDK.NT_SP_SetOnlyDecodeVideoKeyFrame(player_handle_, 0);
            }

18 RTMP/RTSP播放端-停止播放

NT_SP_StopPlay

19 关闭播放实例

NT_SP_Close

20 Uninit

NT_SP_UnInit

22 RTMP/RTSP播放端音视频数据回调回调

代码语言:javascript
复制
        /*事件ID*/
        public enum NT_SP_E_EVENT_ID : uint
        {
            NT_SP_E_EVENT_ID_BASE = NTBaseCodeDefine.NT_EVENT_ID_SMART_PLAYER_SDK,

	        NT_SP_E_EVENT_ID_CONNECTING			= NT_SP_E_EVENT_ID_BASE | 0x2,	/*连接中*/
	        NT_SP_E_EVENT_ID_CONNECTION_FAILED	= NT_SP_E_EVENT_ID_BASE | 0x3,	/*连接失败*/
	        NT_SP_E_EVENT_ID_CONNECTED			= NT_SP_E_EVENT_ID_BASE | 0x4,	/*已连接*/
	        NT_SP_E_EVENT_ID_DISCONNECTED		= NT_SP_E_EVENT_ID_BASE | 0x5,	/*断开连接*/
            NT_SP_E_EVENT_ID_NO_MEDIADATA_RECEIVED = NT_SP_E_EVENT_ID_BASE | 0x8,	/*收不到RTMP数据*/
            NT_SP_E_EVENT_ID_RTSP_STATUS_CODE   = NT_SP_E_EVENT_ID_BASE | 0xB,  /*rtsp status code上报, 目前只上报401, param1表示status code*/
            NT_SP_E_EVENT_ID_NEED_KEY           = NT_SP_E_EVENT_ID_BASE | 0xC,  /*需要输入解密key才能播放*/
            NT_SP_E_EVENT_ID_KEY_ERROR          = NT_SP_E_EVENT_ID_BASE | 0xD,  /*解密key不正确*/

	        /* 接下来请从0x81开始*/
	        NT_SP_E_EVENT_ID_START_BUFFERING = NT_SP_E_EVENT_ID_BASE | 0x81, /*开始缓冲*/
	        NT_SP_E_EVENT_ID_BUFFERING		 = NT_SP_E_EVENT_ID_BASE | 0x82, /*缓冲中, param1 表示百分比进度*/
	        NT_SP_E_EVENT_ID_STOP_BUFFERING  = NT_SP_E_EVENT_ID_BASE | 0x83, /*停止缓冲*/

	        NT_SP_E_EVENT_ID_DOWNLOAD_SPEED  = NT_SP_E_EVENT_ID_BASE | 0x91, /*下载速度, param1表示下载速度,单位是(Byte/s)*/

            NT_SP_E_EVENT_ID_PLAYBACK_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa1,     /*播放结束, 直播流没有这个事件,点播流才有*/
            NT_SP_E_EVENT_ID_RECORDER_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa2,     /*录像结束, 直播流没有这个事件, 点播流才有*/
            NT_SP_E_EVENT_ID_PULLSTREAM_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa3,   /*拉流结束, 直播流没有这个事件,点播流才有*/

            NT_SP_E_EVENT_ID_DURATION = NT_SP_E_EVENT_ID_BASE | 0xa8, /*视频时长,如果是直播,则不上报,如果是点播的话, 若能从视频源获取视频时长的话,则上报, param1表示视频时长,单位是毫秒(ms)*/
        }

22 RTMP/RTSP播放端音视频数据回调

代码语言:javascript
复制
    /*
     *拉流吐视频数据时,一些相关的数据
     */
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NT_SP_PullStreamVideoDataInfo
    {
        public Int32 is_key_frame_; /* 1:表示关键帧, 0:表示非关键帧 */
        public UInt64 timestamp_;	/* 解码时间戳, 单位是毫秒 */
	    public Int32 width_;	/* 一般是0 */
	    public Int32 height_; /* 一般也是0 */
	    public IntPtr parameter_info_; /* 一般是NULL */
	    public UInt32 parameter_info_size_; /* 一般是0 */
        public UInt64 presentation_timestamp_; /*显示时间戳, 这个值要大于或等于timestamp_, 单位是毫秒*/
    }

    /*
     *拉流吐音频数据时,一些相关的数据
     */
    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NT_SP_PullStreamAuidoDataInfo
    {
        public Int32 is_key_frame_; /* 1:表示关键帧, 0:表示非关键帧 */
        public UInt64 timestamp_;	/* 单位是毫秒 */
	    public Int32 sample_rate_;	/* 一般是0 */
	    public Int32 channel_; /* 一般是0 */
	    public IntPtr parameter_info_; /* 如果是AAC的话,这个是有值的, 其他编码一般忽略 */
	    public UInt32 parameter_info_size_; /*如果是AAC的话,这个是有值的, 其他编码一般忽略 */
	    public UInt64 reserve_; /* 保留  */
    }

以上是基础的接口说明和调用流程,感兴趣的开发者可以参考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • demo说明
  • 集成说明
  • 1 初始化
  • 2 Open生成播放实例
  • 3 设置回调事件
  • 4 设置RTMP/RTSP播放Url
  • 5 查看是否支持D3DRender
  • 6 设置回调PCM
  • 7 RTMP/RTSP播放参数设置
  • 8 检测是否支持硬解码
  • 9 RTMP/RTSP播放端-开始播放
  • 10 绘制窗口大小改变
  • 11 RTMP/RTSP拉流端录像
  • 12 RTMP/RTSP拉流端快照(实时调用)
  • 13 RTMP/RTSP拉流端快速切换URL(实时调用)
  • 14 用户数据回调
  • 15 SEI数据回调
  • 16 设置视频画面填充模式
  • 17 只解码关键帧
  • 18 RTMP/RTSP播放端-停止播放
  • 19 关闭播放实例
  • 20 Uninit
  • 22 RTMP/RTSP播放端音视频数据回调回调
  • 22 RTMP/RTSP播放端音视频数据回调
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档