麒麟操作系统|Linux下低延时RTMP|RTSP直播播放实现

背景

        国产操作系统多为以Linux为基础二次开发的操作系统。2014年4月8日起,美国微软公司停止了对Windows XP SP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。而2020年对Windows7服务支持的终止再一次推动了国产系统的发展。
        工信部对此表示,将继续加大力度,支持Linux的国产操作系统的研发和应用,并希望用户可以使用国产操作系统。随着信息技术和互联网的快速发展普及,电子商务已经成为不可抗拒的现代商业潮流,云计算、大数据应用日趋成熟,但随之带来了许多问题和挑战。为全面响应国家“互联网+”战略的提出和深入贯彻落实国家“十二五”规划纲要,帮助传统企业开展“商务智慧转型”,加强电子商务深入应用,特别是移动电子商务发展中的环境保障建设,促进电子商务行业健康有序发展,使电子商务相关的技术和经济、法律和规则、诚信和信誉及如何建立一个安全、可靠、可信的电子商务环境,保障电子商务活动中系统、交易的安全性,信息的保密性,已经成为当前亟待需要探讨和解决的重要课题。

国产操作系统|Linux下RTMP|RTSP直播播放

        在发布国产操作系统|Linux平台的RTMP|RTSP直播播放SDK之前,大牛直播SDK(官方)的直播播放SDK无需赘述,采用自研内核框架,功能齐全、高稳定、超低延迟、超低资源占用,覆盖Windows、Android和iOS平台。

        本次发布的可用于国产操作系统和Linux上的的RTMP|RTSP直播播放SDK, 视频绘制使用XLib相关库实现, 音频输出使用PulseAudio和Alsa Lib实现,除了常规功能如实时静音、快照、buffer time设定、网络自动重连等,RTMP支持扩展H265播放, RTSP也支持H265播放。

        播放器接口和调用都比较简单,集成复杂度低,且不依赖于QT。

相关DEMO

        大牛直播SDK发布的Linux平台播放器SDK支持多实例播放,以单个窗体播放为例,相关代码如下:

const char* player_url_ = "rtsp://admin:daniulive12345@192.168.0.120:554/h264/ch1/main/av_stream";int main(int argc, char *argv[])
{XInitThreads(); // X支持多线程, 必须调用NT_SDKLogInit();// SDK初始化SmartPlayerSDKAPI player_api;if (!NT_PlayerSDKInit(player_api)){fprintf(stderr, "SDK init failed.\n");return 0;}auto display = XOpenDisplay(nullptr);if (!display){fprintf(stderr, "Cannot connect to X server\n");player_api.UnInit();return 0;}display_ = display;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;}if (root_win_att.width < 100 || root_win_att.height < 100){fprintf(stderr, "Root window size error.\n");player_api.UnInit();XCloseDisplay(display);return 0;}fprintf(stdout, "Root Window Size:%d*%d\n", root_win_att.width, root_win_att.height);int main_w = root_win_att.width / 2, main_h = root_win_att.height / 2;auto black_pixel = BlackPixel(display, screen);auto white_pixel = WhitePixel(display, screen);main_wid_ = XCreateSimpleWindow(display, root, 0, 0, main_w, main_h, 0, white_pixel, black_pixel);if (!main_wid_){fprintf(stderr, "Cannot Create Main Window\n");player_api.UnInit();XCloseDisplay(display);return 0;}XSelectInput(display, main_wid_, StructureNotifyMask | KeyPressMask);auto sub_wid = CreateSubWindow(display, screen, main_wid_);if (!sub_wid){fprintf(stderr, "Cannot Create Render Window\n");player_api.UnInit();XDestroyWindow(display, main_wid_);XCloseDisplay(display);return 0;}XMapWindow(display, main_wid_);XStoreName(display, main_wid_, win_base_title);XMapWindow(display, sub_wid);NT_HANDLE handle = nullptr;// 打开一个播放实例,可以Open多个播放实例, 然后播放多路if (NT_ERC_OK != player_api.Open(&handle, 0, nullptr)){player_api.UnInit();fprintf(stderr, "player_api.Open failed!\n");XDestroyWindow(display, sub_wid);XDestroyWindow(display, main_wid_);XCloseDisplay(display);return 0;}player_api.SetEventCallBack(handle, nullptr, &NT_OnSDKEventHandle);player_api.SetVideoSizeCallBack(handle, nullptr, &NT_SDKVideoSizeHandle);player_api.SetReportDownloadSpeed(handle, 1, 5); // 5秒上报一次下载速度player_api.SetRtspTimeout(handle, 15);player_api.SetRtspAutoSwitchTcpUdp(handle, 1);player_api.SetBuffer(handle, 0); // 设置缓存player_api.SetIsOutputAudioDevice(handle, 1);player_api.SetAudioOutputLayer(handle, 0); // 使用pluse 或者 alsa播放, 两个可以选择一个//player_api.SetAudioVolume(handle, 100);player_api.SetURL(handle, player_url_); // 设置播放地址, rtsp或者rtmp地址player_api.SetXDisplay(handle, display);player_api.SetXScreenNumber(handle, screen);player_api.SetRenderXWindow(handle, sub_wid); // 设置绘制的X窗口player_api.SetRenderScaleMode(handle, 1); // 按比例绘制或者全填充player_api.SetRenderTextureScaleFilterMode(handle, 3); player_api.SetFastStartup(handle, 1);player_api.SetLowLatencyMode(handle, 0);if (NT_ERC_OK != player_api.StartPlay(handle)){player_api.Close(handle);handle = nullptr;player_api.UnInit();fprintf(stderr, "player_api.StartPlay failed!\n");XDestroyWindow(display, sub_wid);XDestroyWindow(display, main_wid_);XCloseDisplay(display);return 0;}while (true){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;XMoveResizeWindow(display, sub_wid, 0, 0, main_w-4, main_h-4);}}else{if (sub_wid == xev.xconfigure.window){player_api.OnWindowSize(handle, 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");if (handle != nullptr){player_api.StopPlay(handle); // 停止播放player_api.Close(handle);handle = nullptr;}XDestroyWindow(display, sub_wid);XDestroyWindow(display, main_wid_);XCloseDisplay(display);player_api.UnInit();fprintf(stdout, "Close Player....\n");return 0;}}}}
}

日志设置和SDK Init相关

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

窗体相关

Display* display_ = nullptr;
Window   main_wid_ = None;const char* win_base_title = "Rtmp/Rtsp Live Player Demo";int EventPoll(int fd, bool is_write, int timeout_ms)
{int result;do{struct pollfd info;info.fd = fd;if (is_write){info.events = POLLOUT;}else{info.events = POLLIN | POLLPRI;}result = poll(&info, 1, timeout_ms);} while (result < 0 && errno == EINTR);return result;
}bool MY_X11_Pending(Display* display, int timeout_ms)
{XFlush(display);if (XEventsQueued(display, QueuedAlready) > 0){return true;}if (EventPoll(ConnectionNumber(display), false, timeout_ms)){if (XPending(display) > 0){return true;}}return false;
}Window CreateSubWindow(Display* display, int screen, Window parent)
{XWindowAttributes  parent_win_att;XGetWindowAttributes(display, parent, &parent_win_att);fprintf(stdout, "parent w:%d, h:%d\n", parent_win_att.width, parent_win_att.height);XSetWindowAttributes swa;swa.border_pixel = WhitePixel(display, screen);swa.event_mask = KeyPressMask | StructureNotifyMask;return XCreateWindow(display, parent, 0, 0, parent_win_att.width-4, parent_win_att.height-4,2, parent_win_att.depth, InputOutput, parent_win_att.visual, CWEventMask | CWBorderPixel, &swa);
}

Event回调

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 (NT_SP_E_EVENT_ID_DOWNLOAD_SPEED == event_id){fprintf(stdout, "OnSDKEventHandle handle:%p speed:%lldkbps, %lldKB/s. \r", handle, (param1 * 8) / 1000, param1 / 1024);fflush(stdout);}
}

视频分辨率回调

void NT_SDKVideoSizeHandle(NT_HANDLE handle, NT_PVOID userData,NT_INT32 width, NT_INT32 height)
{if (display_ && main_wid_){std::ostringstream ss;ss << win_base_title << "  [Video Size: " << width << "*" << height << " ]";XStoreName(display_, main_wid_, ss.str().c_str());}
}

相关界面

 总结

国产操作系统|Linux下的RTMP、RTSP直播播放,经实际测试,延迟和Windows平台一样,毫秒级,随着国产操作系统在无纸化同屏等行业的推进,越来越多的场景需要这样一款稳定性高延迟低的RTMP|RTSP播放器,本文抛砖引玉,感兴趣的开发者可酌情参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于RTMP实现Linux|麒麟操作系统下屏幕|系统声音采集推送

背景 Windows操作系统自问世以来&#xff0c;以其简单易用的图形化界面操作受到大众追捧&#xff0c;为计算机的普及、科技的发展做出了不可磨灭的功绩&#xff0c;也慢慢的成为人们最依赖的操作系统。在中国&#xff0c;90&#xff05;以上的办公环境都是Windows&#xff0c;…

Windows11关机键在哪 Win11系统关机键的位置

很多用户更新了Win11系统之后就发现Win11系统有很多功能的位置都不一样了&#xff0c;导致用户们找不到自己想要的功能。就像是关机功能&#xff0c;很多用户更新了系统之后发现自己找不到关机键了&#xff0c;下面让小编教教大家吧&#xff0c;希望能帮助您。 Windows11关机键…

如何快速实现Android平台前端设备接入能力

技术背景 SIP(会话初始化协议)是在 IP网络上进行多媒体通信的应用层控制协议&#xff0c;以几种RFC的形式提供&#xff0c;其中最重要的是包含核心协议规范的RFC3261。该协议用于创建&#xff0c;修改和终止与一个或多个参与者的会话。通过会话&#xff0c;我们了解了一组进行…

如何解决Win11系统显示你的账户已被停用

现在Win11系统是现在非常火热的电脑操作系统&#xff0c;很多用户都想去升级体验&#xff0c;最近有使用Win11系统用户在咨询这样一个情况&#xff0c;就是电脑突然提示“你的账户已被停用&#xff0c;请向系统管理员咨询”&#xff0c;遇到这样的问题该如何解决呢?下面小编就…

Win11系统创建虚拟桌面的方法

现在Win11系统是非常火热的电脑操作系统&#xff0c;现在已经有越来越多的小伙伴在使用Win11系统&#xff0c;Win11系统集成了Windows10的许多便利的功能&#xff0c;例如虚拟桌面&#xff0c;但是有的朋友不知道在Windows11上怎么进行操作。接下来小编就来为大家简单的介绍一下…

Win10系统开机任务栏一直转圈怎么解决

Win10系统可说是最常用的系统之一&#xff0c;不过最近有不少使用Win10系统的小伙伴发现自己开机之后任务栏一直转圈&#xff0c;那么Win10系统开机任务栏一直转圈怎么解决呢?下面小编就带给大家带来了Win10系统开机任务栏一直转圈的解决方法。 Win10系统开机任务栏一直转圈怎…

Win10系统电脑不会一键还原系统怎么解决

在我们电脑遇到大问题之后&#xff0c;还原系统是最简单有效的办法&#xff0c;现在网络上有很多种系统还原系统的办法&#xff0c;有简单的也有复杂的&#xff0c;Win10系统电脑不会一键还原系统怎么解决呢&#xff0c;这个办法是我觉得最简单的办法之一&#xff0c;小伙伴们可…

Win10本地账户怎么更改为Microsoft账户

在使用电脑的时候&#xff0c;用户想要使用任何Microsoft服务&#xff0c;就需要创建一个Microsoft帐户。那有些用户一直使用的本地账户&#xff0c;这该怎么切换成Microsoft账户呢?其实方法很简单&#xff0c;小编这里就教教大家Win10本地账户更改为Microsoft账户的吧。 Win…

edge浏览器怎么恢复默认设置 edge恢复默认设置方法

edge浏览器也是我们最常用的浏览器之一了&#xff0c;但是edge浏览器还存在着一些小问题&#xff0c;比方说edge浏览器不能看视频等问题&#xff0c;那着个时候可以尝试恢复默认设置能让浏览器恢复正常。那edge浏览器怎么恢复默认设置?请看下面。 1、从win10的开始菜单中找到…

桔子浏览器电脑版如何登录 桔子浏览器PC版账号登录教程

桔子浏览器电脑版如何登陆?桔子浏览器支持账号登录功能&#xff0c;能够帮助用户收藏自动备份&#xff0c;不用担心丢失的情况&#xff0c;今天我们就来讲讲怎么登录账号。 桔子浏览器PC版账号登录教程 1、打开桔子浏览器点击【工具】-【登录桔子浏览器】 桔子浏览器电脑版…

Win11任务栏图标重叠怎么办 Win11任务栏图标重叠的解决方法

Win11操作系统也推出一段时间了&#xff0c;不少小伙都有下载体验&#xff0c;但有一些小伙伴在使用Win11系统的时候发现自己任务栏图标重叠在一起&#xff0c;那么碰到这种情况应该怎么办&#xff0c;下面就和小编一起来看看有什么解决方法。 Win11任务栏图标重叠怎么办&…

怎么隐藏Windows11开始菜单中的推荐面板

相信现在很多用户都在使用Win11操作系统&#xff0c;在“开始”菜单的下半部分包含了“推荐”面板。目前它用于突出显示最近使用的文件和最近安装的应用程序&#xff0c;但有些人担心Microsoft会使用它向用户发送其他推荐的垃圾邮件。如果你不喜欢它&#xff0c;这里是如何禁用…

Windows11安全中心打不开怎么办 Win11打不开安全中心解决方法

使用Win11系统的用户们最近遇到了一个问题&#xff0c;尽管之前升级Win11系统之后也遇到了各种问题&#xff0c;甚至很多用户在升级这一步就遇到了不少问题升级不了。现在在打开Win11系统的时候又遇到了问题&#xff0c;安全中心打不开了。这是怎么一回儿事呢? Windows11安全…

Win11任务栏如何设置在顶部

Windows 11的镜像已经在网上泄露&#xff0c;很多朋友都已经下载安装体验了一番&#xff0c;在使用的过程中大家都知道&#xff0c;Windows 11的一大改变在于任务栏&#xff0c;系统默认将任务栏置于中间&#xff0c;且相关图标都作了修改。那么Win11任务栏可以设置在顶部吗?接…

Win11怎么打开以前的word文档

很多用户在Win11系统出来之后都选择了升级Win11系统&#xff0c;但是Win11进行了大部分改革&#xff0c;所以很多用户都操作不来&#xff0c;对这个新系统也很陌生。就像我们Win10系统中留存下来的文档&#xff0c;在升级了Win11系统之后&#xff0c;以前的文档也打不开了&…

Win7旗舰版系统如何设置定时关机

Win7旗舰版系统用户每次下班都忘记关电脑&#xff0c;领导说了很多次就是记不住&#xff0c;如果电脑能设置定时关机就好啦&#xff0c;Win7旗舰版系统如何设置定时关机?快来跟着小编一 起学习一下Win7旗舰版系统设置定时关机教程吧。 Win7旗舰版系统如何设置定时关机 1、【…

Win7系统网页视频无法播放怎么办

Win7系统网页视频无法播放怎么办?最近有Win7系统用户反映&#xff0c;网页视频无法播放&#xff0c;用户反复试了几次&#xff0c;结果都一样&#xff0c;这让用户非常苦恼。那么Win7系统网页视频无法播放怎么办呢?下面就和小编一起来看看详细的解决方法吧! Win7系统网页视频…

win7纯净版系统锁定系统时间的设置方法

在使用电脑的过程中总是会遇到各式各样的问题&#xff0c;就有小伙伴咨询小编说想要锁定系统时间&#xff0c;想知道怎么操作。那么针对这个问题&#xff0c;小编就以win7纯净版为例&#xff0c;给大家讲讲锁定系统时间的办法win7纯净版系统锁定系统时间的设置方法吧。 win7纯…

Win7系统搜索功能无法使用的应对办法

Win7系统电脑里面包含有很多方便我们操作的便捷功能&#xff0c;比如电脑搜索功能&#xff0c;但最近有不少使用Win7系统用户反映电脑搜索功能不能使用&#xff0c;那么Win7搜索功能无法使用怎么解决呢?下面就和小编一起来看看Win7系统搜索功能无法使用的应对办法吧。 Win7系…

Win7旗舰版系统0x0000007f蓝屏怎么办

Win7旗舰版0x0000007f是一种蓝屏代码&#xff0c;出现此蓝屏代码的原因大部分是硬件问题&#xff0c;很多小伙伴遇到此类问题就束手无策&#xff0c;Win7旗舰版0x0000007f蓝屏怎么处理?针对此问题&#xff0c;下面小编在这分享一篇Win7旗舰版0x0000007f蓝屏的处理方法&#xf…