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

背景

Windows操作系统自问世以来,以其简单易用的图形化界面操作受到大众追捧,为计算机的普及、科技的发展做出了不可磨灭的功绩,也慢慢的成为人们最依赖的操作系统。在中国,90%以上的办公环境都是Windows,学校和各种培训班的培训内容也都是Windows,Windows操作系统已经渗入到各行各业,人们已经习惯了Windows的界面和操作习惯,IT计算机和Windows已经被习以为常的画上了等号。

但是,我们使用的软件真的安全吗?黑屏事件和棱镜门事件让很多乐观看待或尚未意识到信息安全问题的人们警醒,我们所使用的国外软件并不是安全的,我们的数据完全掌握在别人手中。随着信息安全上升到了国家战略的高度,推行自主可控的国产操作系统势在必行。国产操作系统作为自主可控的基础,市场迅速升温,受到了社会各界的高度关注。

我们有别的选择吗?

其实基于开源软件Linux二次开发的操作系统,近年来的发展趋势非常迅猛。Linux已经有20年历史,尤其近十年经过突飞猛进的发展,Linux桌面操作系统已经远远摆脱了“具备与主流桌面操作系统的可比性”阶段,基于拥有众多优秀的开源应用软件的基础,在软件多样性、硬件兼容性、用户体验等各方面做了大量的改进,现在已经可以满足日常办公的需求。在欧美,我们不时听到一些政府部门将采用Linux桌面办公:慕尼黑市政府用十年的时间,成功的“赶走”了微软;伯明翰市政府、法国国会、瑞士、挪威和南非政府部门也都采用了Linux桌面办公。

国产操作系统|Linux下RTMP同屏推送

在发布国产操作系统|Linux平台的RTMP直播推送SDK之前,大牛直播SDK(官方)的RTMP推送模块已稳定运行在Windows、Android和iOS平台几年了。

相对Windows、Android和iOS平台,Linux在桌面采集等方面,资料非常少,数据采集可以采用调用XLib相关接口实现,本Demo实现的是Linux上实现桌面和系统声音采集,然后使用RTMP协议推出去的一个SDK. 集成调用非常简单。

相关实现

int main(int argc, char *argv[])
{signal(SIGINT, &OnSigIntHandler);//printf("sizeof(NT_SmartPublisherSDKAPI)=%d\n", sizeof(NT_SmartPublisherSDKAPI));LogInit();NT_SmartPublisherSDKAPI push_api;if (!PushSDKInit(push_api)){return 0;}auto push_handle = StartPush(&push_api, "rtmp://192.168.0.154:1935/live/test1", 30);if (!push_handle){fprintf(stderr, "start push failed.\n");push_api.UnInit();return 0;}while (!g_is_exit){sleep(2);}fprintf(stdout, "Skip run loop, is_exit:%d\n", g_is_exit);push_api.StopPublisher(push_handle);push_api.Close(push_handle);push_handle = nullptr;push_api.UnInit();fprintf(stdout, "SDK UnInit..\n");return 0;
}

相关初始化

	void OnSigIntHandler(int sig){if (SIGINT == sig){g_is_exit = true;}}void LogInit(){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 PushSDKInit(NT_SmartPublisherSDKAPI& push_api){memset(&push_api, 0, sizeof(push_api));NT_GetSmartPublisherSDKAPI(&push_api);auto ret = push_api.Init(0, nullptr);if (NT_ERC_OK != ret){fprintf(stderr, "push_api.Init failed!\n");return false;}else{fprintf(stdout, "push_api.Init ok!\n");}return true;}

推送接口封装

	NT_HANDLE StartPush(NT_SmartPublisherSDKAPI* push_api, const std::string& rtmp_url, int dst_fps){NT_INT32 pulse_device_number = 0;if (NT_ERC_OK == push_api->GetAuidoInputDeviceNumber(2, &pulse_device_number)){fprintf(stdout, "Pulse device num:%d\n", pulse_device_number);char device_name[512];for (auto i = 0; i < pulse_device_number; ++i){if (NT_ERC_OK == push_api->GetAuidoInputDeviceName(2, i, device_name, 512)){fprintf(stdout, "index:%d name:%s\n", i, device_name);}}}NT_INT32 alsa_device_number = 0;if (pulse_device_number < 1){if (NT_ERC_OK == push_api->GetAuidoInputDeviceNumber(1, &alsa_device_number)){fprintf(stdout, "Alsa device num:%d\n", alsa_device_number);char device_name[512];for (auto i = 0; i < alsa_device_number; ++i){if (NT_ERC_OK == push_api->GetAuidoInputDeviceName(1, i, device_name, 512)){fprintf(stdout, "index:%d name:%s\n", i, device_name);}}}}NT_INT32 capture_speaker_flag = 0;if ( NT_ERC_OK == push_api->IsCanCaptureSpeaker(2, &capture_speaker_flag) ){if (capture_speaker_flag)fprintf(stdout, "Support speaker capture\n");elsefprintf(stdout, "UnSupport speaker capture\n");}NT_INT32 is_support_window_capture = 0;if (NT_ERC_OK == push_api->IsCaptureWindowSupported(NULL, &is_support_window_capture)){if (is_support_window_capture)fprintf(stdout, "Support window capture\n");elsefprintf(stdout, "UnSupport window capture\n");}NT_HANDLE push_handle = nullptr;// if (NT_ERC_OK != push_api->Open(&push_handle, NT_PB_E_VIDEO_OPTION_LAYER, NT_PB_E_AUDIO_OPTION_CAPTURE_SPEAKER, 0, NULL))if (NT_ERC_OK != push_api->Open(&push_handle, NT_PB_E_VIDEO_OPTION_SCREEN, NT_PB_E_AUDIO_OPTION_CAPTURE_SPEAKER, 0, NULL)){return nullptr;}//push_api->SetXDisplayName(push_handle, ":0");//push_api->SetXDisplayName(push_handle, NULL);// 视频层配置方式//std::vector<std::shared_ptr<nt_pb_sdk::layer_conf_wrapper_base> > layer_confs;//auto index = 0;第0层填充RGBA矩形, 目的是保证帧率, 颜色就填充全黑//auto rgba_layer_c0 = std::make_shared<nt_pb_sdk::RGBARectangleLayerConfigWrapper>(index++, true, 0, 0, 1280, 720);//rgba_layer_c0->conf_.red_ = 0;//rgba_layer_c0->conf_.green_ = 0;//rgba_layer_c0->conf_.blue_ = 0;//rgba_layer_c0->conf_.alpha_ = 255;//layer_confs.push_back(rgba_layer_c0);第一层为桌面层//auto screen_layer_c1 = std::make_shared<nt_pb_sdk::ScreenLayerConfigWrapper>(index++, true, 0, 0, 1280, 720);////screen_layer_c1->conf_.scale_filter_mode_ = 3;//layer_confs.push_back(screen_layer_c1);//std::vector<const NT_PB_LayerBaseConfig* > layer_base_confs;//for (const auto& i : layer_confs)//{//	layer_base_confs.push_back(i->getBase());//}//if (NT_ERC_OK != push_api->SetLayersConfig(push_handle, 0, layer_base_confs.data(),//	layer_base_confs.size(), 0, nullptr))//{//	push_api->Close(push_handle);//	push_handle = nullptr;//	return nullptr;//}// push_api->SetScreenClip(push_handle, 0, 0, 1280, 720);push_api->SetFrameRate(push_handle, dst_fps); // 帧率设置push_api->SetVideoBitRate(push_handle, 2000);  // 平均码率2000kbpspush_api->SetVideoQualityV2(push_handle, 26); push_api->SetVideoMaxBitRate(push_handle, 4000); // 最大码率4000kbpspush_api->SetVideoKeyFrameInterval(push_handle, dst_fps*2); // 关键帧间隔push_api->SetVideoEncoderProfile(push_handle, 3); // h264 baselinepush_api->SetVideoEncoderSpeed(push_handle, 3); // 编码速度设置到3if (pulse_device_number > 0){push_api->SetAudioInputLayer(push_handle, 2);push_api->SetAuidoInputDeviceId(push_handle, 0);}else if (alsa_device_number > 0){push_api->SetAudioInputLayer(push_handle, 1);push_api->SetAuidoInputDeviceId(push_handle, 0);}// 音频配置push_api->SetPublisherAudioCodecType(push_handle, 1);//push_api->SetMute(push_handle, 1);if ( NT_ERC_OK != push_api->SetURL(push_handle, rtmp_url.c_str(), NULL) ){push_api->Close(push_handle);push_handle = nullptr;return nullptr;}if ( NT_ERC_OK != push_api->StartPublisher(push_handle, NULL) ){push_api->Close(push_handle);push_handle = nullptr;return nullptr;}return push_handle;}

相关界面

总结

实际测试下来,以RTMP推送和RTMP播放为例,整体测试时延都在毫秒级,可满足像内网无纸化、教育同屏等场景需求。

Linux的RTMP推送接口,和Windows平台的相差无几,通用接口四个平台几乎一致,不存在集成难度。

国产操作系统替代windows,也许并不像你想象的那么遥远,使用习惯上也并不像想象中那么难,相信在不久的将来,国产操作系统会真正被市场广泛使用。

国产操作系统下的应用生态的创建,需要国人一点点建立。

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

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

相关文章

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…

桔子浏览器电脑版收藏夹位置在哪里 收藏夹位置路径

桔子浏览器电脑版收藏夹位置在哪里?有很多用户将之前浏览的网页保存到了收藏夹里&#xff0c;不知道在哪里可以找到&#xff0c;下面通过这篇文章给大家讲解一下。 桔子浏览器电脑版收藏夹位置在哪里 收藏夹位置路径 桔子浏览器PC版收藏夹位置路径 在桔子浏览器页面上方有一…