在流媒体播放器的开发过程中,RTSP(实时流协议)和RTMP(实时消息协议)是广泛应用的流媒体协议。本博客将介绍如何使用大牛直播SDK实现一个Linux平台下的RTSP/RTMP播放器。大牛直播SDK的Linux平台播放SDK,支持RTSP/RTMP,功能丰富,性能优异,超低延迟,并能够在X11窗口中渲染视频。
依赖库与环境
-
Linux环境:支持X11图形库,能够在X窗口系统中渲染视频。
-
Smart Player SDK:这是一款功能强大的流媒体播放SDK,支持多种音视频格式。
-
X11:作为Linux上的图形显示系统,X11用于渲染视频流。
系统初始化与SDK配置
首先,需要进行SDK的初始化,获取播放所需的API接口,并设置相关的回调函数以处理事件和视频帧。代码如下:
// 初始化SDK日志功能
void NT_SDKLogInit() {
SmartLogAPI log_api;
memset(&log_api, 0, sizeof(log_api));
GetSmartLogAPI(&log_api);
log_api.SetLevel(SL_INFO_LEVEL);
log_api.SetPath((NT_PVOID)"./");
}
// 初始化播放器SDK
bool NT_PlayerSDKInit(SmartPlayerSDKAPI& player_api) {
memset(&player_api, 0, sizeof(player_api));
GetSmartPlayerSDKAPI(&player_api);
auto ret = player_api.Init(0, nullptr);
if (NT_ERC_OK != ret) {
fprintf(stderr, "player_api.Init failed!\n");
return false;
}
return true;
}
在此过程中,我们初始化了日志和SDK的相关API接口。
播放器配置与窗口创建
接下来,我们为播放器配置X11显示窗口,并将视频流渲染到窗口中。代码如下:
// 创建X11显示和窗口
auto display = XOpenDisplay(nullptr);
if (!display) {
fprintf(stderr, "Cannot connect to X server\n");
player_api.UnInit();
return 0;
}
auto screen = DefaultScreen(display);
auto root = XRootWindow(display, screen);
XWindowAttributes root_win_att;
if (!XGetWindowAttributes(display, root, &root_win_att)) {
fprintf(stderr, "Get Root window attri failed\n");
player_api.UnInit();
XCloseDisplay(display);
return 0;
}
// 创建播放窗口
main_wid_ = XCreateSimpleWindow(display, root, 0, 0, root_win_att.width / 2, root_win_att.height / 2, 0, white_pixel, black_pixel);
XSelectInput(display, main_wid_, StructureNotifyMask | KeyPressMask);
// 创建子窗口用于渲染视频
auto sub_wid = CreateSubWindow(display, screen, main_wid_);
播放流的设置
接下来,我们将RTSP流地址传递给SDK,并启动播放。代码如下:
const char* player_url_ = "rtsp://your-stream-url";
NT_HANDLE handle = nullptr;
// 设置播放URL
player_api.SetURL(handle, player_url_);
player_api.SetRenderXWindow(handle, sub_wid);
player_api.StartPlay(handle);
此时,我们已经成功将RTSP流与窗口关联,并开始播放视频。
回调函数与事件处理
为了处理视频帧数据,我们设置了回调函数。当SDK收到视频帧时,系统将调用这个回调函数来进行处理。代码如下:
void NT_SDKVideoFrameCallBack(NT_HANDLE handle, NT_PVOID user_data, NT_UINT32 status, const NT_SP_VideoFrame* frame) {
if (!frame) return;
// 打印视频帧信息
fprintf(stdout, "OnSDKVideoFrameCallBack handle:%p frame:%p, timestamp:%llu\n", handle, frame, frame->timestamp_);
// 处理视频数据或渲染
}
除了视频帧,SDK还支持音频数据和事件的回调,开发者可以根据需要进行相应的处理。
错误与事件回调
SDK提供了多种事件回调接口来处理连接、播放状态、下载速度等信息。例如,我们可以设置事件回调来监控播放状态:
void NT_OnSDKEventHandle(NT_HANDLE handle, NT_PVOID user_data,
NT_UINT32 event_id, NT_INT64 param1, NT_INT64 param2,
NT_UINT64 param3, NT_PCSTR param4, NT_PCSTR param5,
NT_PVOID param6) {
if (event_id == NT_SP_E_EVENT_ID_DOWNLOAD_SPEED) {
fprintf(stdout, "OnSDKEventHandle handle:%p speed:%lldkbps\n", handle, (param1 * 8) / 1000);
}
}
停止播放与资源清理
播放完成或用户按下退出键时,需要清理资源并关闭播放器。代码如下:
// 停止播放并关闭SDK
player_api.StopPlay(handle);
player_api.Close(handle);
XDestroyWindow(display, sub_wid);
XDestroyWindow(display, main_wid_);
XCloseDisplay(display);
player_api.UnInit();
功能支持
如不单独说明,系Windows、Linux(含x86_64|aarch64)、Android、iOS全平台支持。
- [支持播放协议]高稳定、超低延迟(毫秒级,行业内几无效果接近的播放端)、业内领先的RTMP直播播放器SDK;
- [多实例播放]支持多实例播放;
- [事件回调]支持网络状态、buffer状态等回调;
- [视频格式]支持RTMP扩展H.265和Enhanced RTMP H.265,H.264;
- [音频格式]支持AAC/PCMA/PCMU/Speex;
- [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模式硬解和普通模式硬解码;
- [缓冲时间设置]支持buffer time设置;
- [首屏秒开]支持首屏秒开模式;
- [低延迟模式]支持低延迟模式设置(公网150~300ms);
- [复杂网络处理]支持断网重连等各种网络环境自动适配;
- [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
- [音视频多种render机制]Android平台,视频:SurfaceView/GLSurfaceView,音频:AudioTrack/OpenSL ES;
- [实时静音]支持播放过程中,实时静音/取消静音;
- [实时音量调节]支持播放过程中实时调节音量;
- [实时快照]支持播放过程中截取当前播放画面;
- [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
- [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
- [渲染镜像]支持水平反转、垂直反转模式设置;
- [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
- [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
- [ARGB叠加]Windows平台支持ARGB图像叠加到显示视频(参看C++的DEMO);
- [解码前视频数据回调]支持H.264/H.265数据回调;
- [解码后视频数据回调]支持解码后YUV/RGB数据回调;
- [解码后视频数据缩放回调]Windows平台支持指定回调图像大小的接口(可以对原视图像缩放后再回调到上层);
- [解码前音频数据回调]支持AAC/PCMA/PCMU/SPEEX数据回调;
- [音视频自适应]支持播放过程中,音视频信息改变后自适应;
- [扩展录像功能]完美支持和录像SDK组合使用;
- Linux平台支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9);
总结
通过调用大牛直播SDK的播放模块,您可以轻松地在Linux平台上实现RTSP/RTMP播放器,并通过X11窗口渲染视频流。SDK提供了丰富的回调机制,允许开发者实时获取视频帧、音频数据和播放状态,为多种流媒体应用提供支持。
在此博客中,我们介绍了如何配置SDK、创建窗口、处理视频流并进行事件回调。如果您希望更深入地了解或有其他特定需求,可以参考SDK文档并根据您的应用场景进一步定制功能。以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通讨论。