如何实现多路海康大华等RTSP数据转RTMP推送

一个好的转发模块,首先要低延迟!其次足够稳定灵活、有状态反馈机制、资源占用低,跨平台,最好以接口形式提供,便于第三方系统集成。

以Windows平台为例,我们的考虑的点如下

1. 拉流:通过RTSP直播播放SDK的数据回调接口,拿到音视频数据;

2. 转推:通过RTMP直播推送SDK的编码后数据输入接口,把回调上来的数据,传给RTMP直播推送模块,实现RTSP数据流到RTMP服务器的转发;

3. 录像:如果需要录像,借助RTSP直播播放SDK,拉到音视频数据后,直接存储MP4文件即可;

4. 快照:如果需要实时快照,拉流后,解码调用播放端快照接口,生成快照,因为快照涉及到video数据解码,如无必要,可不必开启,不然会额外消耗性能。

5. 拉流预览:如需预览拉流数据,只要调用播放端的播放接口,即可实现拉流数据预览;

6. 数据转AAC后转发:考虑到好多监控设备出来的音频可能是PCMA/PCMU的,如需要更通用的音频格式,可以转AAC后,在通过RTMP推送;

7. 转推RTMP实时静音:只需要在传audio数据的地方,加个判断即可;

8. 拉流速度反馈:通过RTSP播放端的实时码率反馈event,拿到实时带宽占用即可;

9. 整体网络状态反馈:考虑到有些摄像头可能会临时或异常关闭,RTMP服务器亦是,可以通过推拉流的event回调状态,查看那整体网络情况,如此界定:是拉不到流,还是推不到RTMP服务器。

系统设计架构图

Windows转发demo分析

大牛直播SDK的转发demo,Windows平台,对应C++ demo工程:WIN-RelaySDK-CPP-Demo,如需下载demo源码,参看 Github

1. 拉流:拉流和播放有些类似,但不需要播放(也就是说不要解码,资源消耗非常低),在做过基础的参数配置之后(对应demo里面OpenPullHandle()),设置音视频数据回调,然后调用StartPullStream()即可:

1.1 基础参数设置:

bool nt_stream_relay_wrapper::OpenPullHandle(const std::string& url, bool is_rtsp_tcp_mode, bool is_mute)
{if ( pull_handle_ != NULL )return true;if ( url.empty() )return false;duration_ = 0;NT_HANDLE pull_handle = NULL;ASSERT( pull_api_ != NULL );if (NT_ERC_OK != pull_api_->Open(&pull_handle, render_wnd_, 0, NULL)){return false;}ASSERT(pull_handle != NULL);pull_api_->SetEventCallBack(pull_handle, this, &NT_Pull_SDKEventHandle);pull_api_->SetBuffer(pull_handle, 0);pull_api_->SetFastStartup(pull_handle, 1);pull_api_->SetRTSPTcpMode(pull_handle, is_rtsp_tcp_mode ? 1 : 0);pull_api_->SetMute(pull_handle, is_mute ? 1 : 0);if ( NT_ERC_OK != pull_api_->SetURL(pull_handle, url.c_str()) ){pull_api_->Close(pull_handle);pull_handle = NULL;return false;}if ( setting_pos_ >= 0ll ){pull_api_->SetPos(pull_handle, setting_pos_);}pull_handle_ = pull_handle;return true;
}

1.2 设置音视频数据回调:

	pull_api_->SetPullStreamVideoDataCallBack(pull_handle_, this, &SP_SDKPullStreamVideoDataHandle);pull_api_->SetPullStreamAudioDataCallBack(pull_handle_, this, &SP_SDKPullStreamAudioDataHandle);

1.3 开始拉流:

	auto ret = pull_api_->StartPullStream(pull_handle_);if ( NT_ERC_OK != ret ){if ( !is_playing_ ){pull_api_->Close(pull_handle_);pull_handle_ = NULL;}return false;}

拉流整体代码如下:

bool nt_stream_relay_wrapper::StartPull(const std::string& url, bool is_rtsp_tcp_mode, bool is_transcode_aac)
{if ( is_pulling_ )return false;if ( !OpenPullHandle(url, is_rtsp_tcp_mode) )return false;pull_api_->SetPullStreamVideoDataCallBack(pull_handle_, this, &SP_SDKPullStreamVideoDataHandle);pull_api_->SetPullStreamAudioDataCallBack(pull_handle_, this, &SP_SDKPullStreamAudioDataHandle);pull_api_->SetPullStreamAudioTranscodeAAC(pull_handle_, is_transcode_aac? 1: 0);auto ret = pull_api_->StartPullStream(pull_handle_);if ( NT_ERC_OK != ret ){if ( !is_playing_ ){pull_api_->Close(pull_handle_);pull_handle_ = NULL;}return false;}is_pulling_ = true;return true;
}

2. 停止拉流:

停止拉流流程比较简单,先判断是否在拉流状态,如果拉流,调用StopPullStream() 即可,如没有预览画面,调用Close()接口关闭拉流实例。

void nt_stream_relay_wrapper::StopPull()
{if ( !is_pulling_ )return;pull_api_->StopPullStream(pull_handle_);if ( !is_playing_ ){pull_api_->Close(pull_handle_);pull_handle_ = NULL;}is_pulling_ = false;
}

3. 拉流端预览:

拉流端预览,说白了就是播放拉流数据,流程比较简单,demo调用如下,如不需要播放声音,调用SetMute(),实时打开/关闭即可:

bool nt_stream_relay_wrapper::StartPlay(const std::string& url, bool is_rtsp_tcp_mode, bool is_mute)
{if ( is_playing_ )return false;if ( !OpenPullHandle(url, is_rtsp_tcp_mode, is_mute) )return false;pull_api_->SetMute(pull_handle_, is_mute ? 1 : 0);auto ret = pull_api_->StartPlay(pull_handle_);if ( NT_ERC_OK != ret ){if ( !is_pulling_ ){pull_api_->Close(pull_handle_);pull_handle_ = NULL;}return false;}is_playing_ = true;return true;
}

4. 拉流端关闭预览:

void nt_stream_relay_wrapper::StopPlay()
{if ( !is_playing_ )return;pull_api_->StopPlay(pull_handle_);if ( !is_pulling_ ){pull_api_->Close(pull_handle_);pull_handle_ = NULL;}is_playing_ = false;
}

5. 开始推流到RTMP服务器:

推流的流程,如之前所述,调用RTMP推送模块,然后数据源传编码后的音视频数据即可,下图的demo源码,同时展示了,RTSP流获取到后,转推RTMP的时候,数据解密的处理:

bool nt_stream_relay_wrapper::StartPush(const std::string& url)
{if ( is_pushing_ )return false;if ( url.empty() )return false;if ( !OpenPushHandle() )return false;auto push_handle = GetPushHandle();ASSERT(push_handle != nullptr);ASSERT(push_api_ != NULL);if ( NT_ERC_OK != push_api_->SetURL(push_handle, url.c_str(), NULL) ){if ( !is_started_rtsp_stream_ ){push_api_->Close(push_handle);SetPushHandle(nullptr);}return false;}// 加密测试 +++// push_api_->SetRtmpEncryptionOption(push_handle, url.c_str(), 1, 1);// NT_BYTE test_key[16] = {'1', '2', '3'};// push_api_->SetRtmpEncryptionKey(push_handle, url.c_str(), test_key, 16);// 加密测试 --if ( NT_ERC_OK != push_api_->StartPublisher(push_handle, NULL) ){if ( !is_started_rtsp_stream_ ){push_api_->Close(push_handle);SetPushHandle(nullptr);}return false;}// // test push rtsp ++// push_api_->SetPushRtspTransportProtocol(push_handle, 1);// // push_api_->SetPushRtspTransportProtocol(push_handle, 2);// push_api_->SetPushRtspURL(push_handle, "rtsp://player.daniulive.com:554/liverelay111.sdp");// push_api_->StartPushRtsp(push_handle, 0);// // test push rtsp--is_pushing_ = true;return true;
}

6. 传递转推RTMP数据:

void nt_stream_relay_wrapper::OnVideoDataHandle(NT_HANDLE handle, NT_UINT32 video_codec_id, NT_BYTE* data, NT_UINT32 size, NT_SP_PullStreamVideoDataInfo* info)
{if (!is_pushing_ && !is_started_rtsp_stream_)return;if ( pull_handle_ != handle )return;if (data == NULL)return;if (size < 1)return;if (info == NULL)return;std::unique_lock<std::recursive_mutex> lock(push_handle_mutex_);if (!is_pushing_ && !is_started_rtsp_stream_)return;if (push_handle_ == NULL)return;push_api_->PostVideoEncodedDataV2(push_handle_, video_codec_id,data, size, info->is_key_frame_, info->timestamp_, info->presentation_timestamp_);
}void nt_stream_relay_wrapper::OnAudioDataHandle(NT_HANDLE handle, NT_UINT32 auido_codec_id,NT_BYTE* data, NT_UINT32 size, NT_SP_PullStreamAuidoDataInfo* info)
{if (!is_pushing_ && !is_started_rtsp_stream_)return;if (pull_handle_ != handle)return;if (data == NULL)return;if (size < 1)return;if (info == NULL)return;std::unique_lock<std::recursive_mutex> lock(push_handle_mutex_);if (!is_pushing_ && !is_started_rtsp_stream_)return;if (push_handle_ == NULL)return;push_api_->PostAudioEncodedData(push_handle_, auido_codec_id, data, size,info->is_key_frame_, info->timestamp_, info->parameter_info_, info->parameter_info_size_);
}

7. 关闭实时RTMP转推

void nt_stream_relay_wrapper::StopPush()
{if ( !is_pushing_ )return;is_pushing_ = false;std::unique_lock<std::recursive_mutex> lock(push_handle_mutex_);if ( nullptr == push_handle_ )return;push_api_->StopPublisher(push_handle_);// // test push rtsp ++// push_api_->StopPushRtsp(push_handle_);// // test push rtsp--if ( !is_started_rtsp_stream_ ){push_api_->Close(push_handle_);push_handle_ = nullptr;}
}

以上就是RTSP或RTMP流转RTMP推送的流程,感兴趣的开发者,可做设计参考。

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

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

相关文章

如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析

在直播系统中&#xff0c;除了直播音视频之外&#xff0c;有时候还想从主播端发布文本信息等&#xff0c;这些信息可以不通过视频传输通道发送给用户播放端&#xff0c;但如果传输的数据想和视频保持精准同步&#xff0c;那最好的办法就是这些信息和视频数据打包在一起传输&…

网易邮箱大师如何添加Word附件 添加附件方法步骤详细介绍

网易邮箱大师是一款非常好用的邮箱软件&#xff0c;可同时管理包括网易的各大邮箱&#xff0c;界面简洁&#xff0c;非常好用&#xff0c;其中还有很多功能&#xff0c;比如添加附件等&#xff0c;但是很多小伙伴不知道怎么添加Word及其他附件&#xff0c;接下来看完这篇文章你…

RTSP播放器开发过程中需要考虑哪些关键因素

好多开发者&#xff0c;在自研或者选择市面上的播放器的时候&#xff0c;除了常规的播放功能&#xff0c;还有很多点值得关注&#xff0c;如延迟、资源占用、网络异常处理、多实例支持、长时间运行稳定性等。以下是我们开发直播播放器过程中&#xff0c;考虑的部分关键因素&…

如何拉取公网RTSP/RTMP流在内网多客户端播放

好多情况下&#xff0c;一路RTSP或RTMP网络流过来后&#xff0c;想共享给更多局域网内的客户端播放&#xff0c;一般来说&#xff0c;有两种设计方案&#xff1a; 1. 拉取的RTSP或RTMP流&#xff0c;回调后的数据&#xff0c;转推RTMP服务器&#xff0c;内网部署一台RTMP服务器…

爱链工具怎么使用 爱链工具详细使用图文教程

爱链工具是爱站seo软件独立推出的一款免费友链交换平台&#xff0c;也是目前互联网上最强外链交换平台&#xff0c;不但拥有丰富的友链资源&#xff0c;智能的链接匹配系统&#xff0c;全面的SEO基础数据等等&#xff0c;而且率先推出目录链接交换功能&#xff0c;可以大大提升…

如何在Unity3d平台下低延迟播放RTMP或RTSP流

随着VR类、工业仿真、智慧城市等场景的快速发展&#xff0c;开发者对Unity3d低延迟的直播需求量越来越大&#xff0c;前两年&#xff0c;大牛直播SDK发布了Windows平台、Android平台和iOS平台的Unity3d RTMP和RTSP的播放&#xff0c;好多公司用起来体验都非常好&#xff0c;以下…

轻量级RTSP服务存在的意义

为什么要设计轻量级RTSP服务 轻量级RTSP服务解决的核心痛点是避免用户或者开发者单独部署RTSP或者RTMP服务。 轻量级RTSP服务可满足内网无纸化/电子教室等内网超低延迟的低并发需求&#xff0c;避免让用户配置单独的服务器&#xff0c;大牛直播SDK在推送端发布了轻量级RTSP服…

foxmail邮件怎样打印日历

foxmail邮件中的日历有很多信息&#xff0c;想要打印日历&#xff0c;该怎么打印呢?我们点击日历信息。点击设置按钮&#xff0c;再点击打印按钮&#xff0c;先进行设置打印机&#xff0c;然后打印邮件的日历&#xff0c;下面我们就来看看详细的图文教程。 foxmail邮件怎样打…

Windows平台RTMP/RTSP直播推送模块设计和使用说明

开发背景 好多开发者一直反馈&#xff0c;Windows平台&#xff0c;做个推屏或者推摄像头&#xff0c;推RTMP或者RTSP出去&#xff0c;不知道哪些功能是必须的&#xff0c;哪些设计是可有可无的&#xff0c;还有就是&#xff0c;不知道如何选技术方案&#xff0c;以下是基于我们…

跨平台低延迟的RTMP/RTSP直播播放器设计实现

开发背景 2015年&#xff0c;当我们试图在市面上找一款专供直播播放使用的低延迟播放器&#xff0c;来配合测试我们的RTMP推送模块使用时&#xff0c;居然发现没有一款好用的&#xff0c;市面上的&#xff0c;如VLC或Vitamio&#xff0c;说白了都是基于FFMPEG&#xff0c;在点…

win7系统锁定计算机设置方法

我们都知道电脑长时间不使用的话&#xff0c;计算机就会自动进入锁定状态&#xff0c;但是也有用户不想让计算机自动进入锁定状态&#xff0c;但是却不知道应该怎么操作&#xff0c;为此非常苦恼&#xff0c;那么Win7锁定计算机怎么设置呢?今天为大家分享win7系统锁定计算机设…

Windows平台基于RTMP实现一对一互动直播

目前市面上大多一对一互动都是基于WebRTC&#xff0c;缺点如下&#xff1a; 服务器部署非常复杂&#xff0c;不利于私有部署&#xff0c;在一些私密性高的场景下&#xff0c;无法使用&#xff0c;如公安、市政等体系&#xff1b;传输基于UDP&#xff0c;很难保证传输质量&…

网易云音乐电脑版怎么下载电台节目 主播电台节目下载教程

网易云音乐不仅可以听歌&#xff0c;还可以在主播电台中&#xff0c;听到各类主播的声音&#xff0c;下面我们就来讲讲网易云音乐电脑版怎么下载电台节目&#xff0c;一起来看教程吧! 网易云音乐电脑版怎么下载电台节目 主播电台节目下载教程 网易云音乐PC版主播电台节目下载…

如何实现RTMP推送Android Camera2数据

Camera2简介 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的API1(android.hardware.camera)就被标为 Deprecated 了。 Camera API2相较于API1有很大不同, 并且API2是为了配合HAL3进行使用的, API2有很多API1不…

Android平台RTMP多实例推送的几种情况探讨

好多开发者提到&#xff0c;如何实现Android平台&#xff0c;多实例推送&#xff0c;多实例推送&#xff0c;有几种理解&#xff1a; 多路编码&#xff0c;多个实例分别推送到不同的RTMP URL&#xff08;如Android采集板卡同时接2路出去&#xff09;&#xff1b;同一路编码&am…

雨林木风win11 64位全新专业版系统v2021.08

雨林木风win11 64位全新专业版系统v2021.08是目前非常火热的电脑操作系统&#xff0c;系统运行速度非常的快速&#xff0c;拥有稳定、安全、兼容性强等特点&#xff0c;多样化的服务可供你的使用&#xff0c;支持在线的升级&#xff0c;非常的便捷&#xff0c;可以提高系统的性…

面向内网无纸化会议/智慧教室/实时同屏,组播还是RTMP?

一、背景 为满足内网无纸化/电子教室等内网超低延迟需求&#xff0c;避免让用户配置单独的服务器&#xff0c;我们研发了轻量级RTSP服务开发包。 单播不再赘述&#xff0c;这里重点介绍下我们的组播技术方案&#xff1a; 组播解决的主要痛点是服务器部署和带宽占用问题&…

打印更无缝:微软改善Win11中通用打印体验

微软昨日透露&#xff0c;将会在 Windows 11 系统中改进打印体验。从下面的截图中可以看到&#xff0c;用户可以直接在设置应用中添加打印机。对于使用通用打印机驱动的打印机&#xff0c;微软增加了为打印作业添加密码的功能。 打印更无缝&#xff1a;微软改善Win11中通用打印…

Windows平台如何快速实现RTSP/RTMP直播播放

前段时间&#xff0c;我们在 https://blog.csdn.net/renhui1112/article/details/104143794 提到“RTSP播放器开发过程中需要考虑哪些关键因素”&#xff0c;本次主要介绍&#xff0c;如何调用SDK实现RTSP/RTMP播放能力。 本文以调用大牛直播SDK为例&#xff1a; demo说明 SD…

Windows平台RTSP播放器/RTMP播放器设计需要考虑的几个点

我们在实现Windows平台RTSP播放器或RTMP播放器的时候&#xff0c;需要考虑的点很多&#xff0c;比如多实例设计、多绘制模式兼容、软硬解码支持、快照、RTSP下TCP-UDP自动切换等&#xff0c;以下就其中几个方面&#xff0c;做个大概的探讨。 1. 视频绘制模式 我们在实现Windo…