在流媒体播放器的开发过程中,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接口,并设置相关的回调函数以处理事件和视频帧。代码如下:
scss
// 初始化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显示窗口,并将视频流渲染到窗口中。代码如下:
scss
// 创建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,并启动播放。代码如下:
ini
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收到视频帧时,系统将调用这个回调函数来进行处理。代码如下:
c
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提供了多种事件回调接口来处理连接、播放状态、下载速度等信息。例如,我们可以设置事件回调来监控播放状态:
c
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);
}
}
停止播放与资源清理
播放完成或用户按下退出键时,需要清理资源并关闭播放器。代码如下:
scss
// 停止播放并关闭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状态等回调;
-
音频格式\]支持AAC/PCMA/PCMU/Speex;
-
H.264硬解码\]Windows/Android/iOS支持特定机型H.264硬解;
-
H.264/H.265硬解码\]Android支持设置Surface模式硬解和普通模式硬解码;
-
首屏秒开\]支持首屏秒开模式;
-
复杂网络处理\]支持断网重连等各种网络环境自动适配;
-
音视频多种render机制\]Android平台,视频:SurfaceView/GLSurfaceView,音频:AudioTrack/OpenSL ES;
-
实时音量调节\]支持播放过程中实时调节音量;
-
只播关键帧\]Windows平台支持实时设置是否只播放关键帧;
-
渲染镜像\]支持水平反转、垂直反转模式设置;
-
实时下载速度更新\]支持当前下载速度实时回调(支持设置回调时间间隔);
-
解码前视频数据回调\]支持H.264/H.265数据回调;
-
解码后视频数据缩放回调\]Windows平台支持指定回调图像大小的接口(可以对原视图像缩放后再回调到上层);
-
音视频自适应\]支持播放过程中,音视频信息改变后自适应;
- 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文档并根据您的应用场景进一步定制功能。以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通讨论。