RTP包使用TCP发送的问题

seaandsee 2011-08-04 03:05:59
最近做了一个rtsp的小型视频服务器,用UDP进行发送的时候可以在VLC上看到完整的视频,但是通过TCP进行发送的时候只能看到一幅图像,然后过十几秒钟VLC就自动断掉了,抓包可以看到数据已经成功发送。两种发送方式的RTP包的打包方式和内容都是一样的,不同的地方主要是rtsp会话交互发送的信息还有通过TCP方式发送的RTP包前面再加四个字节的头,加四个字节头以及数据发送的代码如下:

static int send_rtp_packet(rtpclientparam_info* pinfo, unsigned char *buf,int len)
{
int sfd = 0;
int sendtonum;
struct sockaddr_in s;

if(!pinfo || !buf)
return 1;

if(pinfo->rtpovertcp)
{
unsigned char tcp_pkt[len + 4];
uint16 *intlvd_ch = (uint16 *)&tcp_pkt[2];

tcp_pkt[0] = '$';
tcp_pkt[1] = (unsigned char)(pinfo->dst_videoport);//在这里目标端口号就是Channel id

printf("tcp_pkt[1]=%d,port=%d\n",tcp_pkt[1],pinfo->dst_videoport);
*intlvd_ch = htons((uint16)len);
memcpy(tcp_pkt + 4, buf, len);

sendtonum = send(pinfo->tcpfd, tcp_pkt, len+4, MSG_NOSIGNAL);

}
else
{
s.sin_family = AF_INET;
s.sin_addr.s_addr = pinfo->dstip;

sfd = video_sockethandle;
s.sin_port = htons(pinfo->dst_videoport);

sendtonum = sendto(sfd, buf, len, 0, (struct sockaddr *)&s, sizeof(s));

}

if(sendtonum != len)
return 2;

return 0;
}


希望高手帮忙找一下问题,不胜感激啊
...全文
1628 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
joywings 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 seaandsee 的回复:]
引用 3 楼 forrest_chen 的回复:
唉..流媒体这东东老精细了,最近我也在学习,一头雾水T-T。不过在Live源码中对于使用tcp发送rtp信息有下面这一段代码,不知道你有没有看过,我发给你,希望能够给你帮助,然后我也继续等高手:

C/C++ code


void sendRTPOverTCP(unsigned char* packet,
unsigned pack……
[/Quote]

你好,我想问下用vlc链接自己写的rtsp服务器,服务器发送data信息和response信息是向同一个端口发吗,如果不是那该怎样呢,谢谢
seaandsee 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 forrest_chen 的回复:]
唉..流媒体这东东老精细了,最近我也在学习,一头雾水T-T。不过在Live源码中对于使用tcp发送rtp信息有下面这一段代码,不知道你有没有看过,我发给你,希望能够给你帮助,然后我也继续等高手:

C/C++ code


void sendRTPOverTCP(unsigned char* packet,
unsigned packetSiz……
[/Quote]
十分感谢,问题已经找到了,是我代码里面一个很低级的错误导致的。。。
蓝阳 2011-08-09
  • 打赏
  • 举报
回复
唉..流媒体这东东老精细了,最近我也在学习,一头雾水T-T。不过在Live源码中对于使用tcp发送rtp信息有下面这一段代码,不知道你有没有看过,我发给你,希望能够给你帮助,然后我也继续等高手:

void sendRTPOverTCP(unsigned char* packet,
unsigned packetSize,
int socketNum,
unsigned char streamChannelId) {

do {
char const dollar = '$';
if (send(socketNum, &dollar, 1, 0) != 1) break;
if (send(socketNum, (char*)&streamChannelId, 1, 0) != 1) break;

char netPacketSize[2];
netPacketSize[0] = (char) ((packetSize&0xFF00)>>8);
netPacketSize[1] = (char) (packetSize&0xFF);
if (send(socketNum, netPacketSize, 2, 0) != 2) break;

if (send(socketNum, (char*)packet, packetSize, 0) != (int)packetSize) break;

return;
} while (0);
}
seaandsee 2011-08-05
  • 打赏
  • 举报
回复
自己顶一下
ryfdizuo 2011-08-05
  • 打赏
  • 举报
回复
不懂,帮顶了。

2,553

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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