IPv4流媒体广播
2023-09-24 14:13:20 3 举报
基于IPv4的流媒体广播项目: -知识点:linux系统编程、网络编程、项目框架搭建、目录文件解析、锁、信号量、流控、多线程、多进程、系统日志记录信息、udp组播通信 -实现功能: 服务器端:向组播地址发送节目单结构体,以及持有各频道音频信息的结构体。 客户端:接收节目单的信息,选取指定节目,并且播放相应的音频文件,播放内容根据服务器端确定,而不是从头开始播放
作者其他创作
大纲/内容
调用读取channel的函数
初始化socket(设置组播,设置端口复用,bind)
mlib_readchannel
client端及相关知识点
结构体二:频道介绍信息结构体,包含对应频道节目的描述信息和长度,和chnid即频道号。
各个频道的多线程进行发送各自频道的信息
释放指向所有节目单首地址的指针
使用strcat拼接文件路径并查找desc.txt文件
对解析后的文件进行再解析path2entry,返回完整信息的结构体,对关心的节目单信息描述结构体的内容进行填充
当前歌曲读完,进行下一首,改变pos,改变文件描述符fd指向下一首mp3文件
mpg123解码播放
解析命令行参数getopt_long
初始化令牌桶,指定令牌桶速率和上限,这里会影响频道进程发送数据时取token的数量即发送数据的速率。
通过sockfd将音频内容结构体发送到指定的组播地址和端口
将节目单结构体进行发送交给客户端解析
分析命令行指定参数getopt
glob解析目录下文件
对节目单结构体和各节目具体信息结构体进行赋值,其中各节目具体信息的结构体指针存放在节目单结构体中
mlib_freechannel_list
proto.h文件将两端互联1、指定节目单信息结构体2、指定节目具体信息结构体3、指定频道信息结构体4、指定各个结构体的最大值5、指定各个chnid,个数,最小最大值6、组播地址以及端口7、对chnid数据类型的定义
mlib_getchannel_list
默认为守护进程。1、fork2、重定向3个文件描述符3、setsid4、chdir5、umask
使用pread读取到音频内容结构体中去,且可带偏移量的
节目单线程,频道0发送节目单thr_list
取token并且从文件描述符读数据到buf中
子进程使用exec函数执行其他进程
回收各种资源1、节目单线程回收2、频道各个线程回收3、medialib模块回收
接收数据并且写入的管道的写端,给子进程读取
父进程接收数据
将标准输入重定向到管道读端,从管道的读端一直读数据,也就是给标准输入传数据
注意:涉及到与客户端交互的模块要将结构体类型设定为共用的在proto.h中声明的结构体
创建匿名管道用于亲缘进程之间通信,使用多进程,父进程接收数据,子进程调用音频解码器
获取节目单信息medialib模块
1.socket创建2.注册异常退出函数sigaction3.bind()、设置组播、设置端口复用4.pipe匿名管道创建用于亲缘进程通信5.fork多进程实现接收数据和调用mgp123解码器同时进行6.exec函数将子进程转换为解码器程序7.接收节目单数据并显示(接收节目单接收的频道列表结构体,显示使用的是频道介绍信息结构体)8.接收频道内容并通过管道传输给解码器程序进行音频解码播放(这里接收的是频道总信息结构体)
绑定信号处理函数并防止可重入(sigaction)
这里的变长结构体的创建、赋值、指针移动,很重要
若有多余token要归还
将所有信息存放在medialib下的频道大的总信息结构体中,不仅包括节目的内容。1、pos标志频道歌曲的位置2、fd文件描述符,用于表示歌曲具体内容的位置3、offset标识播放位置的偏移量,实时播放4、流量控制的令牌桶
管道
server端
结构体一:频道总信息结构体,包含音频的所有内容,和chnid即频道号。
填充结构体信息并返回一串节目单信息结构体的首地址以节目单的个数
接收一次节目数据并显示且存储服务端的ip和端口信息
结构体三:频道列表结构体,即存储各个频道介绍信息,包括一个为0的指定chnid以及一个频道介绍信息结构体的指针,该指针后的地址以变长的结构有序的存储各个频道的介绍信息结构体
新建一个结构体来存放各线程id与频道chnid的对应关系
收藏
收藏
0 条评论
下一页