当前位置: 首页 > news >正文

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接口,并设置相关的回调函数以处理事件和视频帧。代码如下:

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

http://www.xdnf.cn/news/116299.html

相关文章:

  • dirsearch 使用教程:详细指南与配置解析
  • Java 使用 RabbitMQ 消息处理(快速上手指南)
  • 考拉悠然:科技与匠心,以烟草虫情AI监测系统共筑品质未来
  • LeetCode 3040 相同分数的最大操作数目II
  • c加加学习之day06->STL标准库->day01
  • 【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
  • 【C++】内存管理:内存划分、动态内存管理(new、delete用法)
  • 跑MPS产生委外采购申请(成品)
  • 机器人结构认知与安装
  • Vue 3 相比 Vue 2 的优势
  • 深入详解人工智能数学基础——概率论中的贝叶斯深度学习
  • likeadmin前端请求地址配置踩坑
  • CentOS 7上安装与配置Memcached及PHP客户端使用教程
  • PCB 过孔铜厚的深入指南
  • QMT学习课程Day1
  • Web3钱包开发功能部署设计
  • 大语言模型时代,单细胞注释也需要集思广益(mLLMCelltype)
  • 论文笔记(七十九)STOMP: Stochastic Trajectory Optimization for Motion Planning
  • 【基础】Node.js 介绍、安装及npm 和 npx功能了解
  • MySQL 事务(详细版)
  • 【一览表】病理图像处理流程
  • leetcode 2799. 统计完全子数组的数目 中等
  • 立马耀:通过阿里云 Serverless Spark 和 Milvus 构建高效向量检索系统,驱动个性化推荐业务
  • Vue实战(08)解决 Vue 项目中路径别名 `@` 在 IDE 中报错无法识别的问题
  • 如何调用大语言模型的API?
  • C#中实现JSON解析器
  • 精益数据分析(19/126):走出数据误区,拥抱创业愿景
  • 快速上手GO的net/http包,个人学习笔记
  • 深入理解MVP架构:让UI层与业务逻辑完美分离的设计模式
  • 学习ros过程中常用指令