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

本篇文章将介绍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类承担。

l  网络通信传输模块,包括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的接口试图打开正在写的文件并播放它,但这个过程失败;这个涉及到文件共享读写的问题,还没有比较好的解决方案,希望哪位有此类似经验的朋友可以提供帮助;当然,现在笔者在考虑尝试使用内存文件映射的方式,也许这并不一定凑效。)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏雪无痕大黄蜂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值