Linux平台实现低延迟的RTSP、RTMP播放

​在流媒体播放器的开发过程中,RTSP(实时流协议)和RTMP(实时消息协议)是广泛应用的流媒体协议。本博客将介绍如何使用大牛直播SDK实现一个Linux平台下的RTSP/RTMP播放器。大牛直播SDK的Linux平台播放SDK,支持RTSP/RTMP,功能丰富,性能优异,超低延迟,并能够在X11窗口中渲染视频。

依赖库与环境

  1. Linux环境:支持X11图形库,能够在X窗口系统中渲染视频。

  2. Smart Player SDK:这是一款功能强大的流媒体播放SDK,支持多种音视频格式。

  3. 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文档并根据您的应用场景进一步定制功能。以上抛砖引玉,感兴趣的开发者,可以单独跟我沟通讨论。

相关推荐
心走10 小时前
鸿蒙WebRTC编译指南&踩坑(Native 编译指导)
harmonyos·音视频开发
音视频牛哥15 小时前
Android平台RTSP|RTMP播放器技术实践:基于大牛直播SDK的深度探索
音视频开发·视频编码·直播
音视频牛哥1 天前
RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务
音视频开发·视频编码·直播
音视频牛哥2 天前
Andorid平台实现高性能低延迟的多路RTSP播放器
音视频开发·视频编码·直播
声知视界2 天前
音视频基础能力之 Android 音频篇 (六):音频编解码到底哪家强?
android·音视频开发
深海丧鱼3 天前
什么!只靠前端实现视频分片? - 网络篇
前端·音视频开发
深海丧鱼4 天前
什么!只靠前端实现视频分片?
前端·音视频开发
心走4 天前
WebRTC系列 WebGL 绘制YUV 画面
前端·音视频开发
北有花开5 天前
Android音视频-Lame编译(Android 15 16K)对齐 和 addr2line使用
android·前端·音视频开发