用Darwin和live555实现的直播框架

2024-02-22 03:58

本文主要是介绍用Darwin和live555实现的直播框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在开发视频直播或者监控类项目的时候,如场馆监控、学校监控、车载监控等等,往往首先希望的是形成一个项目的雏形,然后再在这个框架的基础上进行不断的完善和扩展工作,那么我们今天要给大家介绍的就是,如何形成一个这样的框架:

采集本地音视频数据(Win) -->视频分发服务器-->客户端随意接入

大致流程:我们首先通过DShow采集Windows(XP、Win7经过测试)主机的视频设备(Camera)和音频设备(Mic)的音视频资源,经过live555的RTSP推送流程和RTP封包过程,将直播数据推送给Darwin分发服务器,Darwin分发服务器接收live555的推送数据并做相应的缓存(超过缓存时间的数据将会被移除),同时响应客户端的接入,将推送来的直播数据转发给客户端。

设备采集端:采集端是以live555为基础框架,以DarwinInjector做为与Darwin交互的接口,再在live555 Source端分别实现CamH264VideoStreamFramer(H264视频)和AudioInputMicDevice(AAC音频)的数据源。


当然,在采集和发送数据之前,我们需要进行的是与Darwin服务器之间的信令通道交互,这里我们采用的是RTSP标准的Announce(SDP payload)、Setup、Play过程,让Darwin服务器端建立转发类(主要是在QTSSReflectorModule中),等待RTP数据的推送。

设备采集端代码:http://pan.baidu.com/s/1y1E8s 

转发服务器:转发服务器是RTSP服务器Darwin Streaming Server,在之前的博客:基于DSS的推送式转发已经描述了RTSP标准推送流程,这里只说明一点小小的修改,就是在Darwin中,当设备端意外断线,也就是不经过标准的RTSP Teardown流程就与服务器断开的话,服务器端将会等待设备推送超时才会释放转发资源,那么对于这一点,我们做了一个小小的更改,这个在:Darwin推送端断开的处理问题中已经描述了。那么最新代码的下载可以到EasyDarwin开源项目中去获取:https://github.com/xiejiashu/EasyDarwin,后续对Darwin的扩展,如分布式RTSP服务器、RTSP直播服务器、服务器端录像、Hint模块等功能,都会在这个开源项目中加入,希望有兴趣的朋友加入到这个开源项目组中来。

客户端端:客户端当然不用太多描述,标准的RTSP流播放器都能播放Darwin视频,不过如果有想开发RTSP客户端的朋友,也可以加入到讨论群中(288214068)。


框架扩展:在上述的流程中,我们是在采集程序一开启时,就开始向Darwin服务器推送数据,那么在通常情况下,点播或者直播通常都是On Demand的形式,就是说,只有有需要的时候,我们才推送视频给服务器,没有需要的时候,设备处在空闲状态的,那么我们可不可以在上述的框架上做到这一点呢?当然可以!


如上图,我们可以先在设备端,开启一条tcp通道,连接到Darwin服务器,Darwin服务器中扩展一个管理模块,专门管理与设备的通信与接入,这样,在服务器不需要设备数据的时候,只与设备保持信令通道的连接和畅通就可以了,当有需要设备当前音视频数据的时候,就通过这条信令通道发送开启命令,采集设备收到命令(自定义命令),就开始本地采集、编码、打包和RTP传输流程,RTP通道可以与信令通道公用也可以单独建立,不过建议还是单独建立的好。当服务器端对此设备分发的客户端数量为0或者其他更高级的需求来到时,可以通过信令通道,发送停止命令到采集设备,这样采集设备就停止本地采集、编码等工作,进入最开始时候的空闲等待状态。如此,就实现了实时视频的点播效果。当然,图中的转发模块与管理模块可以在同一个程序里面开发,也可以分开,分为管理服务器和转发服务器。

这篇关于用Darwin和live555实现的直播框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734055

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2