SharpStreaming项目开发纪实:项目架构二次调整

news/2024/5/17 18:50:56 标签: 服务器, constants, server, tcp, 网络

本篇文章将介绍SharpStreaming项目架构的二次调整。在本系列的文章中,笔者曾经有一篇关于项目工程结构调整的文章,里面比较粗略地谈到了该项目大致划分。今天这里要谈的是该项目架构的二次调整,并将在下一篇文章中简要介绍一个客户端是如何请求并获得所需要的音视频数据流的。

首先来看此次架构都做了哪些方面的调整,归结起来大概涉及到以下几个方面:

1、从项目工程角度来看,对项目解决方案中的项目工程由原来的SharpStreaming.Core、SharpStreamingServer.Core、SharpStreamingClient.Core、SharpStreamingServer、SharpStreamingClient调整为SharpStreaming.Core、SharpStreamingServer、SharpStreamingClient,主要是将原来的SharpStreamingServer.Core、SharpStreamingClient.Core两个项目工程中的代码合并到了SharpStreaming.Core项目工程中,这样在SharpStreaming.Core项目工程中就形成了这样的结构:Common、Server、Client。

 

2、从模块划分角度来看,服务器与客户端新增或修改完善了以下几大模块:

l  核心管理控制模块,该模块的职责在服务器方由RtspServer类承担,在客户端方由RtspClient类承担。

网络通信传输模块,包括SocketListener(服务器侦听类) 、ClientSocketBase(客户端套接字基类,包含异步接收与发送数据的虚方法,服务器与客户端共用)、ClientSocketTcp(客户端TCP套接字类,继承于ClientSocketBase)、ClientSocketUdp(客户端UDP套接字类,继承于ClientSocketBase)及相应的事件数据处理类。

l  会话管理模块,主要包括ClientSession(属于服务器方,继承自客户端会话信息类ClientSessionInfo)、ServerMediaSession(属于服务器方,为媒体会话处理类,包括生成SDP会话描述信息、获取流参数信息、开始流、暂停流、寻找流、删除流等功能)、MPEG2TransportFileServerMediaSession(属于服务器方,针对.ts格式的媒体源作相关操作,继承ServerMediaSession类并重写了其中的大部分方法)、MediaSession(属于客户端方,用于处理媒体会话信息,包括解析SDP会话描述信息、创建RtpSource等)。

l  RTP/RTCP处理模块,用于建立基于RTP/RTCP协议的应用,该模块当前包含了RtpSink(属于服务器方)、RtpSource(属于客户端方)、RtpPacket(服务器与客户端共用,将数据包组成RTP包)、RtpUtils(服务器与客户端共用,为RTP提供一些共用的静态方法);对于该模块,还有很多地方需要完善,重点是在RTP/RTCP应用方面。

l  文件处理模块,包括MediaSource(属于服务器方,作为服务器各类媒体源的基类,当前提供了SeekWithinFileGetNextFrameCloseMediaSource等虚方法,以供派生类重写)、MPEG2TransportStreamFileSource(属于服务器方,针对.ts格式的媒体源的文件操作,继承自MediaSource并重写了其中所有的虚方法)、FileSink(属于客户端方,负责将解包后的数据帧写入本地临时文件)。

l  配置及日志记录模块,包括Config(服务器与客户端共用,用于从配置文件读取或写入配置信息,当前客户端暂未使用该类)、Log(服务器与客户端共用,源自于CodeProject上的一个开源代码,用于作日志记录)。

l  公共单元模块,包括Utils(包含一系列公共静态方法的静态类,如字节数组/字符串/整数/浮点数等之间的相互转换)、RtspCommon(包含一系列与RTSP请求响应串处理的公共静态方法的静态类)、Constants(常量类)。

l  事件处理及枚举模块,包括TExceptionEventArgs、TSocketEventArgs、TClientSessionEventArgs、ClientSessionState、MsgLevel、PlayerState等。

 

3、从界面展现角度来看,服务器与客户端均对界面的展现形式做了调整,尤其是客户端,以一个普通的视频播放器进行设计与实现,当前客户端播放器已经可以播放本地的一些视频文件(如*.avi; *.mov; *.mpg; *.mpeg; *.ts; *.wmv; *.vob; *.dat等,当然要顺利播放还需要安装相应的解码器)。

 

    另外,在视频文件数据的传输方面,笔者将仅采用UDP协议,并在后面将要实现的RTP/RTCP中也采用UDP协议。当下,经改进调整后的SharpStreaming项目已经实现了基于UDP协议的文件数据传输,不过流式播放尚未实现。(注:笔者在流式播放这一块遇到了一个比较棘手的问题,一方面利用FileStream来完成文件的写入,一方面当完成一部分的写入之后(这里有一套判断逻辑,以后有机会再介绍),DirectShow的接口试图打开正在写的文件并播放它,但这个过程失败;这个涉及到文件共享读写的问题,还没有比较好的解决方案,希望哪位有此类似经验的朋友可以提供帮助;当然,现在笔者在考虑尝试使用内存文件映射的方式,也许这并不一定凑效。)


http://www.niftyadmin.cn/n/1863348.html

相关文章

java8流原理_java8实战与原理学习---stream流

尽管java8已经出来很多年了,但很多java开发甚至资深java开发程序员对于java8的使用和新增的一些设计还处于很简单的基础使用阶段,对于一些新特性,只会讲一些大概,理解不够深。基于此,我决定也好好重新整理一份java8的一…

NUCLEO-L496ZG防火墙 - 可执行的易失性数据段

STM32L496ZG微控制器提供了防火墙的功能,用于保护FLASH或SRAM中的代码或数据。STM32CubeL4提供了两个使用防火墙功能的示例,FIREWALL_VolatileData_Executable和FIREWALL_VolatileData_Shared。本文主要结合FIREWALL_VolatileData_Executable示例简单介绍…

SharpStreaming项目开发纪实:客户端请求获取流的大致过程

本篇文章将简要介绍一个客户端是如何请求获取视频流的这么一个过程。 对于服务器与客户端而言,要建立通信、要传输数据都少不了网络通信模块的支持。在本项目中,通过TCP协议来建立并维护服务器与客户端之间的连接,并传输通信指令&#xff0c…

《Pragmatic Programmer》读后感(三):利用一些基本工具提高编程效率

说实在的,编写程序是一件费时又费精力的事情。虽然,我们在实际的开发过程中,大都采用面向对象的编程思想来实践着,同时在代码重用方面也有了质的飞跃,但是,不过如何,程序还得需要我们动手去完成…

如何使用Arduino和SIM900A GPRS / GSM模块将数据发送到Web服务器

今天我们在这里介绍一个非常有趣的项目,我们将使用Arduino开发板和GPRS将数据发送到SparkFun服务器。这是一个基于IoT的项目,我们将使用GSM模块SIM900A将一些数据发送到互联网上的Web服务器。 在这个项目中,我们将使用4x4数字键盘输入一些文…

德州仪器发布99%高效GaN逆变器功率级的参考设计

德州仪器发布了新的功率级参考设计 - TIDA-00915,官方称其效率可高达99%。该参考设计主要是用于三相高频GaN逆变器。它内置TI的LMG3410 600 V 12-A氮化镓(GaN)电源模块。特别之处是,该设计内建了六个这样的电源模块。 …

用JAVA实现排序算法之一:冒泡排序

最近一段时间在努力学习回顾JAVA方面的相关知识,这其中涉及到了几种常用的排序算法。笔者虽知用JAVA实现简单的排序算法早已不是什么新鲜事,类似的实现更是多如牛毛,而笔者在这里之所以老调重弹,最基本的出发点无非就是巩固已学知…

用JAVA实现排序算法之二:直接插入排序

本篇介绍直接插入排序算法的JAVA实现。 直接插入排序算法的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素&#xff…