一个简单的流媒体项目,基于客户端/服务器模型(C/S)开发,采用UDP组播技术,实现MP3格式音乐广播系统。服务器端采用多线程处理频道信息,实现媒体库(MP3)读取并进行流量控制(令牌桶),并通过UDP组播发送;客户端采用多进程,实现父进程接受来自网络的数据,通过进程间通信技术管道发送给子进程,子进程进行数据解码并输出到特定频道。
- 实现一个音乐广播系统
- 考虑到流量控制
- 基于客户端/服务器模型,服务器设计成守护进程。
- 用户可选择音乐频道,同时考虑加入节目单频道
- 由于是一个广播系统,C/S之间的通讯采用无连接的udp组播,组播相对于广播更加灵活并且节省资源,故采用组播技术
- 由于需要考虑到节目单频道,让用户可以提前了解到每一个频道的类型,所以在各音乐频道内容的基础上,加上节目单频道,这样无需遍历每一个频道,就可以知道各频道的内容,从而针对性的选择。因此需要规定节目单数据格式和节目频道数据格式
- 由于广播的内容是音乐(后续可延伸扩展为视频),所以需要进行流量控制。流量控制采用令牌桶实现,可设置传输的速率。
- 由于频道数目媒体库信息调整,故采用多线程获取并发送频道数据。不涉及多线程之间的通讯,需要考虑的令牌桶资源的互斥访问。
- 服务器最后以守护进程方式运行,系统运行过程中的数据采用系统日志保存。
git clone https://github.com/missFuture/IPv4_streaming_media.git
cd clinet/
make
cd ../server
make
|/var
|---media
| --- | --- ch1
| --- | --- | --- desc.txt
| --- | --- | --- 1.mp3
| --- | --- | --- 2.mp3
| --- | --- | --- 需要人陪.mp3
| --- | --- ch2
| --- | --- | --- desc.txt
| --- | --- | --- 3.mp3
| --- | --- | --- 4.mp3
| --- | --- | --- 你不知道的事.mp3
| --- | --- ch3
| --- | --- | --- desc.txt
| --- | --- | --- 好心分手.mp3
| --- | --- ...
注:频道目录chn(ch1, ch2, ch3...)位于 /var/media 目录下(如果不存在需要自己创建),每一个频道中包含需要播放的媒体文件(mp3),以及该频道音乐的类型(中文,英文,流行,古典?),将该标签写入 desc.txt ,将来会在节目单频道出现供用户选择。
欢迎沟通交流~Q:913644113, email:[email protected]
前期项目还是存在丢帧的问题,解决方案参考https://cloud.tencent.com/developer/article/1638140 调试过程:
- (1)排除发送放获取本地媒体数据间断的情况
- (2)排除发送放为将该发送的数据发出问题
- (3)排除客户端父子进程间通信,由于系统管段内核缓冲区不足的问题,这个是通过将匿名管道更换程命名管道发现。也可以采用其他IPC机制,例如共享内存,信号量,消息队列。
- (4)令牌通采取的定时器sleep(1)会被中断打断,不是很完美,后期采用nanosleep获取更加精准的定时器,同样有问题。最后更换成采用select实现定时,令牌通这一块还是存在读取的速度过快问题,这就会导致接受端缓冲区持续增长,以至于后期会丢弃部分数据。
- (5)最后不得已采用修改系统参数,linux的socket缓冲区buffer,如下(在client中通过setsocket设置socket接受缓冲区大小参数)
uint64_t receive_buf_size = 20*1024*1024; //20 MB
setsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &receive_buf_size, sizeof(receive_buf_size));
- (1) 参考TCP的可靠传输,实现UDP的可靠传输,可参考实时流式传输协议RTSP。目前个人感觉不到明显的丟帧问题
- (2) 点播机制
- (3) 客户端界面