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

企业网站建设方案价位全球速卖通卖家注册

企业网站建设方案价位,全球速卖通卖家注册,珠海网站建设策划方案,企业商城网站 .net一、引言 在Linux平台上实现一个高性能、高并发的多实例播放器,是许多流媒体应用的核心需求。本文将结合大牛直播SDK的Linux平台RTSP/RTMP播放器功能,深入解析其实现原理、关键技术点以及优化策略。通过对代码的详细分析和实际应用的结合,帮…

一、引言

在Linux平台上实现一个高性能、高并发的多实例播放器,是许多流媒体应用的核心需求。本文将结合大牛直播SDK的Linux平台RTSP/RTMP播放器功能,深入解析其实现原理、关键技术点以及优化策略。通过对代码的详细分析和实际应用的结合,帮助开发者更好地理解和应用该技术。

二、项目概述

本文基于以下代码实现了一个多实例播放器:

  • multi_player_demo.cpp:主程序,负责初始化SDK、创建播放器实例、管理窗口布局以及事件处理。

  • nt_player_sdk_wrapper.cppnt_player_sdk_wrapper.h:封装了播放器SDK的核心功能,提供了简洁的接口供主程序调用。

  • nt_sdk_handle_wrapper.cppnt_sdk_handle_wrapper.h:封装了SDK的句柄管理功能,负责处理SDK的事件回调。

三、技术解析

1. SDK初始化与日志管理

multi_player_demo.cpp中,通过调用NT_SDKLogInit()函数初始化日志系统,设置日志级别为SL_INFO_LEVEL,并将日志输出路径设置为当前目录。这为后续的调试和问题排查提供了便利。

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)"./");
}

2. 播放器SDK初始化

通过调用NT_PlayerSDKInit()函数初始化播放器SDK。该函数首先获取SDK的API接口,然后调用Init()函数进行初始化。如果初始化失败,会输出错误信息并返回false

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;}else{fprintf(stdout, "player_api.Init ok!\n");}return true;
}

3. 窗口布局管理

multi_player_demo.cpp中,通过调用SubWindowsLayout()函数计算子窗口的布局。该函数根据主窗口的宽高、边框宽度以及播放器实例的数量,动态计算每个子窗口的位置和大小。布局策略为将主窗口划分为多个子窗口,每个子窗口的大小和位置根据实例数量动态调整。

void SubWindowsLayout(int w, int h, int border, int count, std::vector<NT_LayoutRect>& rects)
{rects.clear();if (w < 20 || h < 20){NT_LayoutRect c;c.x_ = 0;c.y_ = 0;c.w_ = 2;c.h_ = 2;for (auto i = 0; i < count; ++i){rects.push_back(c);}return;}if (1 == count){NT_LayoutRect c1;c1.x_ = 0;c1.y_ = 0;c1.w_ = w - 2 * border;c1.h_ = h - 2 * border;rects.push_back(c1);return;}auto sub_h = h / 2;auto sub_w = w / 2;auto cur_y = 0;auto t_h = 0;auto rows = (count + 1) / 2;for (auto i = 0; i < rows; ++i){NT_LayoutRect c1, c2;c1.x_ = 0;c1.y_ = cur_y;c1.w_ = sub_w;c1.h_ = sub_h;c2.x_ = c1.w_;c2.y_ = cur_y;c2.w_ = w - c1.w_;c2.h_ = sub_h;if (i == (rows - 1)){c1.h_ = h - t_h;c2.h_ = h - t_h;}cur_y += c1.h_;t_h += c1.h_;c1.w_ -= 2 * border;c1.h_ -= 2 * border;c2.w_ -= 2 * border;c2.h_ -= 2 * border;rects.push_back(c1);rects.push_back(c2);}if (static_cast<int>(rects.size()) > count){rects.pop_back();}
}

4. 播放器实例管理

multi_player_demo.cpp中,通过创建NT_PlayerSDKWrapper实例来管理每个播放器。每个实例对应一个RTSP或RTMP流地址。通过调用Start()函数启动播放器,并设置相关参数,如缓冲区大小、是否静音、渲染模式等。

for (auto url : players_url_)
{auto i = std::make_shared<NT_PlayerSDKWrapper>(&player_api);i->SetDisplay(display);i->SetScreen(screen);i->SetURL(url);players.push_back(i);if (players.size() > 3)break;
}

5. 事件处理机制

通过MY_X11_Pending()函数检测是否有待处理的X11事件。如果有事件,调用XNextEvent()获取事件并处理。主要处理的事件包括窗口大小调整(ConfigureNotify)和按键事件(KeyPress)。在按键事件中,检测到ESC键按下时,停止所有播放器实例并退出程序。

while (MY_X11_Pending(display, 10))
{XEvent xev;memset(&xev, 0, sizeof(xev));XNextEvent(display, &xev);if (xev.type == ConfigureNotify){if (xev.xconfigure.window == main_wid){if (xev.xconfigure.width != main_w || xev.xconfigure.height != main_h){main_w = xev.xconfigure.width;main_h = xev.xconfigure.height;SubWindowsLayout(main_w, main_h, border_w, static_cast<int>(players.size()), layout_rects);for (auto i = 0; i < static_cast<int>(players.size()); ++i){if (players[i]->GetWindow()){XMoveResizeWindow(display, players[i]->GetWindow(), layout_rects[i].x_, layout_rects[i].y_, layout_rects[i].w_, layout_rects[i].h_);}}}}else{for (const auto& i : players){assert(i);if (i->GetWindow() && i->GetWindow() == xev.xconfigure.window){i->OnWindowSize(xev.xconfigure.width, xev.xconfigure.height);}}}}else if (xev.type == KeyPress){if (xev.xkey.keycode == XKeysymToKeycode(display, XK_Escape)){fprintf(stdout, "ESC Key Press\n");for (const auto& i : players){i->Stop();if (i->GetWindow()){XDestroyWindow(display, i->GetWindow());i->SetWindow(None);}}players.clear();XDestroyWindow(display, main_wid);XCloseDisplay(display);player_api.UnInit();fprintf(stdout, "Close Players....\n");return 0;}}
}

6. 功能说明

如不单独说明,系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);

四、总结

本文详细解析了基于Linux平台的多实例播放器的实现原理和关键技术点,并提出了优化和改进的方向。通过结合大牛直播SDK的功能,开发者可以快速实现一个高性能、高并发的多实例播放器,满足各种流媒体应用的需求。希望本文能够为开发者提供有价值的参考和启发。


文章转载自:

http://NfJ4fmWe.hwpcm.cn
http://B0yQMLG7.hwpcm.cn
http://CxhuEhMp.hwpcm.cn
http://AdiU7FqC.hwpcm.cn
http://1jrMcfqd.hwpcm.cn
http://j2vH5tq6.hwpcm.cn
http://riJ5lyoe.hwpcm.cn
http://tzUvzvYH.hwpcm.cn
http://Gj4u6hwv.hwpcm.cn
http://wCIe7QO5.hwpcm.cn
http://5Vr3J7WM.hwpcm.cn
http://QEKHqoYz.hwpcm.cn
http://5W4rKk2y.hwpcm.cn
http://7DknhMRR.hwpcm.cn
http://gBmFoXzp.hwpcm.cn
http://gB7aVZ8t.hwpcm.cn
http://NV1rDX5k.hwpcm.cn
http://v3nUdRuG.hwpcm.cn
http://2Nh0JZmI.hwpcm.cn
http://izhIFHu5.hwpcm.cn
http://R8Tg9OwV.hwpcm.cn
http://4ddw9eYu.hwpcm.cn
http://ZfK8dbhU.hwpcm.cn
http://kXO3ZLrw.hwpcm.cn
http://sCpkIKwd.hwpcm.cn
http://u6yYN2wO.hwpcm.cn
http://mC109QJa.hwpcm.cn
http://qQnCjLl0.hwpcm.cn
http://yFKk7Axe.hwpcm.cn
http://MoOGfTFb.hwpcm.cn
http://www.dtcms.com/wzjs/729302.html

相关文章:

  • 怎么在网站底部添加备案号做小说网站做国外域名还是国内的好
  • 你建立的网站使用了那些营销方法前端网页模板
  • 上网站建设公司鲜花网站建设的目标
  • 国外设计网站app吗怎样让客户做网站
  • 做淘宝客网站挣钱网站规划设计
  • 北京赛车网站开发公司工业设计属于什么专业类别
  • 学习做网站免费网站模版
  • 网站开发合同注意事项1元网站建设精品网站制作
  • 泰州网站制作张店网站建设定制
  • vps看网站蜘蛛唐山市住房城乡建设部网站主页
  • 网站开发所需配置威海高端网站建设
  • 企业网站尺寸网站建设费的摊销
  • 办公家具网站建设公司湛江人才网招聘信息网
  • 专业网站建设哪家便宜网站开发公司联系电话
  • 浉河网站建设传奇电脑版
  • 合肥网站推广手机建站平台
  • 南京秦淮区建设局网站秦皇岛网站排名公司
  • 唐山市城市建设规划局网站网页美工设计百度
  • 外贸网站要先备案吗自己注册了个域名想做一个网站
  • 山东省住房和城乡建设厅网站主页上海最近发生什么大事
  • 企业网站营销网站首码项目网
  • 怎么做网站后期推广默认网站预览能能显示建设中
  • 福永公司网站建设百度咨询电话人工台
  • wordpress 导航特效成都网络推广优化
  • 长沙网站seo推广公司成都装修网站建设多少钱
  • 室内设计图网站有哪些大连网站设计室
  • 网站 iss手机制作动画软件app免费
  • 帮别人做网站哪里可以接单郑州中原网站建设
  • 网页游戏网站mhnphp mysql做网站登录
  • 个人网站花多少钱深圳seo秘籍