¥¥¥¥¥传输中音频和视频交错的问题???期待高手........¥¥¥¥

f_acme 2006-09-23 05:27:38
问题描述:利用TCP传输音视频数据的时候,由于只用了一个端口来接收数据,利用包头来区分音视频数据的,可是现在发现音视频数据发生了干扰,即一个包中即包含了音频数据,也包含了视频数据,导致在客户端根本就解码不出来。

测试的时候只发送音频数据的话,就会发现在接收端几个数据包是一起接收的,假设一个音频数据包为212字节,在媒体服务器端接收的时候发现居然是424字节和636字节的数据包,甚至最大达到5个数据包在一起的情况,只发送视频数据同样也有该问题,音视频同发的时候就全部混淆了。利用Socket选项发现TCP和UDP的发送和接收缓冲区的大小都为8192字节,利用setsockopt把发送和接收缓冲区的大小该为2048(如果再小就不能容纳一个视频数据包了),再加上::setsockopt(teachersock, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof(BOOL));也同样解决不了。可是改用UDP的传输方式来传输的话,就没任何问题,都是一个个的包分开来的。

由于视频数据包的大小不能确定,因为视频有图象晃动的情况下数据包比较大,而静止时很小,所以不可能按照大小来分开一个包。

由于某种特殊原因,所以想用TCP来传送,请问高手怎么解决这个问题?
...全文
194 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一剑 2006-09-24
  • 打赏
  • 举报
回复
可以这样定义包结构

数据包格式:
数据头===包序号===音视频类型===数据长度===数据内容======校验
1字节 ===2字节 ===1字节 === 2字节 ===数据长度个字节===1字节
f_acme 2006-09-24
  • 打赏
  • 举报
回复
嗯,利用包头中长度的信息然后再把包分开,解决了。
谢谢各位。
---------
to:hurryboylqs(中山三郎)
我弄的是网络的部分,他们把数据传给我,我负责发送和接收,怎么获得音视频数据我不太清楚,关于传输方面的问题,可以交流,呵呵
mango279 2006-09-24
  • 打赏
  • 举报
回复
tcp传输的时候会粘包或者分包,这是正常现象。
必须象fastxyf(迅影)说的那样处理。
还有,你最好用setsockopt把socket缓冲区设置的大一点,我一般接受视频都是设置成32768*4。
太小对于tcp他会影响发送端的处理,对于udp会导致数据在接受端网卡上被丢掉,导致丢包。
但缓冲大小和tcp的粘包没有关系。
hurryboylqs 2006-09-24
  • 打赏
  • 举报
回复
用两个端口,开两个连接,互不干扰。
hurryboylqs 2006-09-23
  • 打赏
  • 举报
回复
楼主,我想知道在VC下怎么实现TCP获得并传输音视频数据,我在做文件传输的,我的QQ:421120834,邮箱:liqisong611@souhu.com ,加我可以吗?交流交流^_^
DentistryDoctor 2006-09-23
  • 打赏
  • 举报
回复
包的概念是你在逻辑上设计的,你必须保证接收方能正确将音视频拆分出来。
fastxyf 2006-09-23
  • 打赏
  • 举报
回复
TCP是流的,没有包的概念

你可以在每个音频包前加上包头,可以就是长度,这样,你读时数据时,先读包头,就知道一个包的大小.再读接下来的实际数据.每次都这样,就不会有问题了..

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧