视频网络传输机制的设计(续)

       线程对系统内存的开支比进程要少,在视频Server端,采用两个线程在后台分别完成采集处理和网络传输的工作,两个线程的协调工作靠struct videodev *dev,所以在程序设计中,必须把这个数据结构设为全局变量。

      首先看一下上述数据结构中对两个线程工作协调相关的参数:

       unsigned char* pFramebuffer:mmap返回的数据指针,指向采集进来的原始数据;

       unsigned char* ptframe[4]:指向四个buffer缓冲数组,存放已压缩完成的数据;

       int lock[4]:对四个ptframe的标示,0表示可以写入视频压缩数据,1表示可以发送到网络,两者互斥。

       接下来描述一下整个代码运行的过程:

       1. 初始化:1.1 分配ptframe的大小,其大小为:sizeof(struct frame_t)+width*height*3;其中struct frame_t 描述了压缩数据的各个特征参数,如w*h,size,format等;  1.2 将2个frame的数据采集保存在数据结构videombuf中,这两个frame的指针分别为pFramebuffer和pFramebuffer+offset,offset为一个frame的大小;1.3 对4个lock置0;

       2. 采集开始:具体见上一篇文章,启动采集线程,做一个big loop,简单说:如果没有网络发送的线程在跑,采集线程不停的把pFramebuffer和pFramebuffer+offset指向的数据压缩后依次存放到ptframe+sizeof (struct frame_t)的位置,大小为frame压缩后的大小;注意数据压缩并存放到ptframe+sizeof (struct frame_t)时必须上线程互斥锁;

        3. 网络传输的线程:线程打开之前sock套接口都已经打开,传到线程函数的参数为accept后产生的新的socket描述符(假设传输协议为标准TCP/IP协议),传输过程相对比较简单,从prframe[0]开始查看,查看ptframe[0]是否写完,ok则将lock[0]置1;根据struct frame_t的size参数,发送ptframe[0]+sizeof (struct frame_t)数据到网络,发送完成后解锁,然后继续下一个ptframe[],and so on...............

To be continue for RTP/RTCP...................

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值