Windows平台RTSP|RTMP直播播放SDK集成说明

在视频流媒体应用开发中,选择一个高效、稳定的播放器SDK至关重要。大牛直播SDK提供了功能强大的C++和C#接口,支持RTSP和RTMP等多种协议的播放。本文将详细介绍如何基于大牛直播SDK的C#接口开发和集成一个RTSP/RTMP播放器,并结合实际代码和集成说明进行深入分析。

一、SDK概述

大牛直播SDK提供了丰富的功能,包括视频播放、录像、快照、音量控制、视频旋转等。SDK支持Windows 7及以上系统,提供了32位和64位的debug/release库,适用于多种开发场景。

二、开发环境准备

  1. 开发工具:Visual Studio 2013或更高版本

  2. SDK库文件

    • SmartLog.dll

    • SmartLog.lib

    • SmartPlayerSDK.dll

    • SmartPlayerSDK.lib

    • 其他相关库(avcodec-56.dll, avdevice-56.dll等)

  3. C#头文件

    • nt_base_code_define.cs

    • smart_player_define.cs

    • smart_player_sdk.cs

三、集成步骤

1. 添加库文件和头文件

将SDK提供的lib目录下的debug或release库文件拷贝到工程对应的debug或release目录下,确保32位/64位库与工程匹配。将C#头文件添加到工程中。

2. 设置工程属性

在工程属性中,将Assembly name设置为“SmartPlayer”,未授权版本需保持此名称。正式授权版本需联系商务获取授权。

3. 设置授权License

在调用NT_SP_Init之前,设置SDK的授权License:

NT.NTSmartPlayerSDK.NT_SP_SetSDKClientKey("xxxxxxxxxx", "xxxxxxxxxx", 0, IntPtr.Zero);
UInt32 isInited = NT.NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero);
if (isInited != 0)
{
    MessageBox.Show("调用NT_SP_Init失败..");
    return;
}

4. 设置日志路径

NT_SP_Init之前,设置日志存放路径:

String log_path = "D:\\playerlog";
NTSmartLog.NT_SL_SetPath(log_path);

四、核心功能

如不单独说明,系Windows、Linux(x64_64架构|aarch64)、Android、iOS全平台支持。

  •  [支持播放协议]RTSP、RTMP;
  •  [多实例播放]支持多实例播放;
  •  [事件回调]支持网络状态、buffer状态等回调;
  •  [视频格式]支持H.265、H.264,此外,还支持RTSP MJPEG播放;
  • [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264;
  •  [音频格式]支持AAC/PCMA/PCMU/SPEEX(RTMP);
  •  [H.264/H.265软解码]支持H.264/H.265软解;
  •  [H.264硬解码]Windows/Android/iOS支持特定机型H.264硬解;
  •  [H.265硬解]Windows/Android/iOS支持特定机型H.265硬解;
  •  [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;
  •  [RTSP模式设置]支持RTSP TCP/UDP模式设置;
  •  [RTSP TCP/UDP自动切换]支持RTSP TCP、UDP模式自动切换;
  •  [RTSP超时设置]支持RTSP超时时间设置,单位:秒;
  •  [RTSP 401认证处理]支持上报RTSP 401事件,如URL携带鉴权信息,会自动处理;
  •  [缓冲时间设置]支持buffer time设置;
  •  [首屏秒开]支持首屏秒开模式;
  •  [复杂网络处理]支持断网重连等各种网络环境自动适配;
  •  [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
  •  [音视频多种render机制]Android平台,视频:surfaceview/OpenGL ES,音频:AudioTrack/OpenSL ES;
  •  [实时静音]支持播放过程中,实时静音/取消静音;
  •  [实时音量调节]支持播放过程中实时调节音量;
  •  [实时快照]支持播放过程中截取当前播放画面;
  •  [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
  •  [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
  •  [渲染镜像]支持水平反转、垂直反转模式设置;
  •  [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
  •  [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
  •  [解码前视频数据回调]支持H.264/H.265数据回调;
  •  [解码后视频数据回调]支持解码后YUV/RGB数据回调;
  •  [解码前音频数据回调]支持AAC/PCMA/PCMU数据回调;
  •  [音视频自适应]支持播放过程中,音视频信息改变后自适应;
  •  [扩展录像功能]完美支持和录像SDK组合使用。

1. 初始化SDK

调用NT_SP_Init初始化SDK,多实例播放仅需调用一次:

UInt32 isInited = NT.NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero);
if (isInited != 0)
{
    MessageBox.Show("调用NT_SP_Init失败..");
    return;
}

2. 检测硬解码支持

检测系统是否支持H264和H265硬解码:

bool is_support_h264_hardware_decoder = (NT.NTBaseCodeDefine.NT_ERC_OK == NT.NTSmartPlayerSDK.NT_SP_IsSupportH264HardwareDecoder());
bool is_support_h265_hardware_decoder = (NT.NTBaseCodeDefine.NT_ERC_OK == NT.NTSmartPlayerSDK.NT_SP_IsSupportH265HardwareDecoder());

启用硬解码:

NTSmartPlayerSDK.NT_SP_SetH264HardwareDecoder(player_handle_, is_support_h264_hardware_decoder ? 1 : 0, 0);
NTSmartPlayerSDK.NT_SP_SetH265HardwareDecoder(player_handle_, is_support_h265_hardware_decoder ? 1 : 0, 0);

3. 创建播放实例

调用NT_SP_Open创建播放实例:

if (player_handle_ == IntPtr.Zero)
{
    player_handle_ = new IntPtr();
    UInt32 ret_open = NTSmartPlayerSDK.NT_SP_Open(out player_handle_, IntPtr.Zero, 0, IntPtr.Zero);
    if (ret_open != 0)
    {
        player_handle_ = IntPtr.Zero;
        MessageBox.Show("调用NT_SP_Open失败..");
        return;
    }
}

4. 设置回调事件

视频分辨率回调
video_size_call_back_ = new SP_SDKVideoSizeCallBack(SP_SDKVideoSizeHandle);
NTSmartPlayerSDK.NT_SP_SetVideoSizeCallBack(player_handle_, IntPtr.Zero, video_size_call_back_);
视频帧回调
video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack);
NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_);
事件回调
event_call_back_ = new SP_SDKEventCallBack(SDKEventCallBack);
NTSmartPlayerSDK.NT_SP_SetEventCallBack(player_handle_, IntPtr.Zero, event_call_back_);

5. 设置播放URL

NTSmartPlayerSDK.NT_SP_SetURL(player_handle_, "rtsp://admin:daniulive12345@192.168.0.120:554/h264/ch1/main/av_stream");

6. 实时播放

开始播放

调用NT_SP_StartPlay接口启动播放。

UInt32 ret_start = NTSmartPlayerSDK.NT_SP_StartPlay(player_handle_);
if (ret_start != 0)
{
    MessageBox.Show("播放失败..");
    return;
}

停止播放

调用NT_SP_StopPlay接口停止当前的播放。

NTSmartPlayerSDK.NT_SP_StopPlay(player_handle_);

释放播放实例

停止播放后,如播放器没有录像等占用播放实例的动作,释放播放实例以释放相关资源。

NTSmartPlayerSDK.NT_SP_Close(player_handle_);
player_handle_ = IntPtr.Zero;

卸载SDK

如果不再需要使用SDK,可以调用NT_SP_UnInit卸载SDK。

NTSmartPlayerSDK.NT_SP_UnInit();

五、高级进阶功能

1. 硬件解码支持

  • 检测硬件解码支持情况:通过NT_SP_IsSupportH264HardwareDecoderNT_SP_IsSupportH265HardwareDecoder接口,可以检测系统是否支持H.264和H.265硬件解码。

  • 启用硬件解码:通过NT_SP_SetH264HardwareDecoderNT_SP_SetH265HardwareDecoder接口,可以选择是否启用硬件解码。在硬件支持的系统上使用硬件解码,可以显著降低CPU负载,提高播放性能。

2. 网络优化功能

  • 缓冲设置:通过NT_SP_SetBuffer接口,可以设置播放缓冲的大小,以调整播放的流畅度和延迟。

  • RTSP重连机制:SDK内置了RTSP重连机制,可以在网络中断后自动尝试重新连接。此外,NT_SP_SetRtspAutoSwitchTcpUdp接口允许自动切换TCP和UDP模式,以应对不同的网络环境。

  • 低延迟模式:通过NT_SP_SetLowLatencyMode接口,可以启用低延迟播放模式。尽管可能导致音视频不同步或画面不均匀,但能降低播放延迟。

3. 视频画面控制

  • 视频旋转:通过NT_SP_SetRotation接口,可以实现视频画面的顺时针旋转。支持90°、180°和270°旋转,以适应不同的设备和场景。

  • 视频翻转:通过NT_SP_SetFlipHorizontalNT_SP_SetFlipVertical接口,可以对视频画面进行水平和垂直翻转,以满足特殊需求或调整画面方向。

4. 录像功能

  • 设置录像参数:可以设置录像目录、单个文件最大大小、文件名生成规则等,通过NT_SP_SetRecorderDirectoryNT_SP_SetRecorderFileMaxSizeNT_SP_SetRecorderFileNameRuler接口实现。

  • 控制录像过程:通过NT_SP_StartRecorderNT_SP_StopRecorder接口,可以灵活地控制录像的开始和停止。录像过程中,SDK会根据设置的参数自动生成合适的文件名,并在录制完成后进行回调通知。

5. 快照功能

  • 实时快照:通过NT_SP_CaptureImage接口,可以实时截取当前播放的视频画面,并以PNG格式保存到本地指定路径。在录像、监视等场景中,可以方便地获取关键画面。

  • 回调机制:为了方便开发者集成,快照功能还支持回调机制,可以在快照完成后通知开发者。

6. 用户数据回调

  • 接收用户数据:通过NT_SP_SetUserDataCallBack接口,可以设置用户数据回调。当播放端收到推送端发送的用户数据(如时间戳、经纬度等扩展指令或信息)时,SDK会调用此回调,以便开发者进行进一步处理。

7. SEI数据回调

  • 接收SEI数据:通过NT_SP_SetSEIDataCallBack接口,可以设置SEI数据回调。当流数据中包含SEI数据时,SDK会调用此回调,使开发者能够获取和处理SEI数据。

8. 万能接口

  • 设置参数NT_SP_SetParam接口是一个万能接口,可以设置各种参数,解决大多数问题。例如,可以设置音量、缓冲时间、旋转角度等。

  • 获取参数NT_SP_GetParam接口可以获取当前设置的参数值,方便开发者进行调试和监控。

9. 事件回调

  • 获取播放状态:通过NT_SP_SetEventCallBack接口设置事件回调后,可以获取播放器的各种状态信息,如连接状态、缓冲状态、实时带宽等。通过这些事件,开发者可以动态调整播放策略。

六、进阶功能调用示例

1. 视频旋转

NTSmartPlayerSDK.NT_SP_SetRotation(player_handle_, 90); // 旋转90° 180° 270°

2. 视频翻转

NTSmartPlayerSDK.NT_SP_SetFlipHorizontal(player_handle_, 1); // 水平翻转
NTSmartPlayerSDK.NT_SP_SetFlipVertical(player_handle_, 1); // 垂直翻转

3. 录像功能

3.1 设置录像参数
  1. 设置录像目录

    NTSmartPlayerSDK.NT_SP_SetRecorderDirectoryW(player_handle_, "D:\\Record");

    这里的"D:\\Record"是录像文件的存储路径,开发者可以根据实际需求设置存储目录。

  2. 设置单个文件最大大小

    NTSmartPlayerSDK.NT_SP_SetRecorderFileMaxSize(player_handle_, 500 * 1024); // 500MB

    这个接口用于限制单个录像文件的大小,单位是字节。当文件达到这个大小时,SDK会自动分割文件。

  3. 设置录像文件名生成规则

    NT_SP_RecorderFileNameRuler rec_name_ruler = new NT_SP_RecorderFileNameRuler();
    rec_name_ruler.type_ = 0;
    rec_name_ruler.file_name_prefix_ = "Record_";
    rec_name_ruler.append_date_ = 1;
    rec_name_ruler.append_time_ = 1;
    NTSmartPlayerSDK.NT_SP_SetRecorderFileNameRuler(player_handle_, ref rec_name_ruler);

    这里的rec_name_ruler定义了录像文件名的生成规则,包括前缀、是否追加日期和时间等。

3.2 设置录像回调
record_call_back_ = new SP_SDKRecorderCallBack(SDKRecorderCallBack);
NTSmartPlayerSDK.NT_SP_SetRecorderCallBack(player_handle_, IntPtr.Zero, record_call_back_);

SDKRecorderCallBack是回调函数,用于处理录像状态的变化,例如录像开始、结束或文件分割时的回调通知。

3.3 设置音频转码
NTSmartPlayerSDK.NT_SP_SetRecorderAudioTranscodeAAC(player_handle_, is_audio_transcode_aac_ ? 1 : 0);

这个接口用于设置是否将音频转码为AAC格式。AAC格式具有较好的兼容性和压缩效率,适合大多数应用场景。

3.4 设置音视频录制开关
NTSmartPlayerSDK.NT_SP_SetRecorderVideo(player_handle_, is_rec_video_ ? 1 : 0);
NTSmartPlayerSDK.NT_SP_SetRecorderAudio(player_handle_, is_rec_audio_ ? 1 : 0);

这两个接口分别控制是否录制视频和音频。开发者可以根据需求选择录制视频、音频或两者兼之。

3.5 启动和停止录像
  1. 启动录像

    NTSmartPlayerSDK.NT_SP_StartRecorder(player_handle_);

    调用NT_SP_StartRecorder接口启动录像,SDK会根据设置的参数开始录制视频流。

  2. 停止录像

    NTSmartPlayerSDK.NT_SP_StopRecorder(player_handle_);

    调用NT_SP_StopRecorder接口停止录像,SDK会完成当前录像文件的写入并释放相关资源。

3.6 录像通知
  • 文件创建通知:当创建新的录像文件时,SDK会通过回调通知开发者。

  • 文件完成通知:当录像文件达到最大大小或录像停止时,SDK会通过回调通知开发者。

4. 快照功能

4.1 快照功能实现原理

快照功能是指在播放过程中,实时截取当前播放的视频画面,并以图片格式保存到本地。大牛直播SDK通过调用NT_SP_CaptureImage接口,捕获当前视频帧,并将其保存为PNG格式的文件。

当调用NT_SP_CaptureImage接口时,SDK会从播放器的视频缓冲区中获取当前视频帧的数据(包括RGB或YUV数据),然后将其编码为PNG格式的图像,并保存到指定路径。开发者可以根据需求指定图片的保存路径和文件名。

4.2 快照功能操作步骤
1. 设置快照保存路径

首先,需要设置快照图片的保存路径和文件名:

String name = "D:\\Snapshot\\" + DateTime.Now.ToString("hh-mm-ss") + ".png";

这里,我们使用当前时间作为文件名的一部分,确保每个快照文件名的唯一性。

2. 调用快照接口

调用NT_SP_CaptureImage接口,截取当前播放的视频画面,并保存到指定路径:

NTSmartPlayerSDK.NT_SP_CaptureImage(player_handle_, file_name_ptr, IntPtr.Zero, capture_image_call_back_);
  • player_handle_:播放实例的句柄,标识当前播放的视频流。

  • file_name_ptr:指向快照文件名的指针。

  • IntPtr.Zero:保留参数,暂时不使用。

  • capture_image_call_back_:快照操作完成后的回调函数。

3. 处理快照回调结果

快照操作完成后,SDK会通过回调函数通知开发者结果。回调函数的定义如下:

public void SDKCaptureImageCallBack(IntPtr handle, IntPtr userData, UInt32 result, IntPtr file_name)
  • result:快照操作的结果,成功或失败的标志。

  • file_name:快照图片的文件名。

在回调函数中,开发者可以处理快照结果,例如显示快照成功或失败的提示:

if (result == NT.NTBaseCodeDefine.NT_ERC_OK)
{
    MessageBox.Show("快照成功,图片保存在:" + file_name);
}
else
{
    MessageBox.Show("快照失败");
}
4.3 快照功能注意事项
  1. 播放状态:快照功能只能在播放过程中调用,确保视频流正在播放且有可用的视频帧。

  2. 保存路径:确保指定的保存路径存在,并且应用程序有写入权限。

  3. 操作频率:避免频繁调用快照功能,以免对播放性能产生影响。

5. 回调YUV|RGB数据

大牛直播SDK的C#接口提供了获取YUV或RGB数据的功能,主要用于对接第三方视频分析或自行绘制等场景。以下是获取YUV或RGB数据的具体实现方法:

5.1 设置视频帧回调

通过NT_SP_SetVideoFrameCallBack接口设置视频帧回调,SDK会在解码出视频帧后调用该回调函数,将视频帧数据传递给开发者。具体步骤如下:

1. 定义回调函数
public delegate void SP_SDKVideoFrameCallBack(IntPtr handle, IntPtr userData, UInt32 status, IntPtr frame);
2. 设置回调接口
video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack);
NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_);
  • player_handle_:播放实例的句柄。

  • NT_SP_E_VIDEO_FRAME_FORMAT:指定视频帧的格式,如RGB32、ARGB、I420等。

  • userData:用户自定义数据,可以在回调函数中使用。

  • video_frame_call_back_:视频帧回调函数。

5.2 处理视频帧数据

在回调函数中,开发者可以获取到视频帧的数据,并根据需要进行处理。以下是处理视频帧数据的示例:

1. 回调函数实现
private void SetVideoFrameCallBack(IntPtr handle, IntPtr userData, UInt32 status, IntPtr frame)
{
    if (frame == IntPtr.Zero)
    {
        return;
    }

    // 将帧数据转换为结构体
    NT_SP_VideoFrame video_frame = (NT_SP_VideoFrame)Marshal.PtrToStructure(frame, typeof(NT_SP_VideoFrame));

    // 获取视频帧数据
    IntPtr plane0 = video_frame.plane0_; // Y分量(I420格式)或RGB数据(RGB32格式)
    int width = video_frame.width_;
    int height = video_frame.height_;

    // 根据需要处理视频帧数据
    // 例如:将YUV数据转换为Bitmap对象进行绘制
    if (video_frame.format_ == (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FROMAT_I420)
    {
        // YUV数据处理
        IntPtr yPlane = video_frame.plane0_;
        IntPtr uPlane = video_frame.plane1_;
        IntPtr vPlane = video_frame.plane2_;
        int yStride = video_frame.stride0_;
        int uStride = video_frame.stride1_;
        int vStride = video_frame.stride2_;

     }

     ...............

    // 释放帧数据
    Marshal.FreeHGlobal(plane0);
    ................
}
5.3 注意事项
  1. 内存管理:获取到的视频帧数据需要手动释放,避免内存泄漏。在处理完视频帧数据后,调用Marshal.FreeHGlobal释放内存。

  2. 线程安全:视频帧回调函数运行在SDK的解码线程中,如果需要在UI线程中更新界面,需要使用InvokeBeginInvoke方法进行线程切换。

  3. 性能优化:处理视频帧数据可能会占用较多的CPU资源,特别是在高分辨率或高帧率的情况下。可以根据实际需求进行性能优化,例如降低处理频率或使用多线程处理。

  4. 数据格式:根据实际需求选择合适的视频帧格式。如果需要进行图像处理或分析,可以选择YUV格式;如果需要直接显示,可以选择RGB格式。

七、总结

通过大牛直播SDK的C#接口,我们可以快速开发一个功能丰富的RTSP/RTMP播放器。SDK提供了完善的接口和丰富的功能,适用于多种视频流媒体应用场景。通过本文的介绍,开发者可以快速上手并集成SDK,实现高效的视频播放功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值