最近做了一个rtsp的小型视频服务器,用UDP进行发送的时候可以在VLC上看到完整的视频,但是通过TCP进行发送的时候只能看到一幅图像,然后过十几秒钟VLC就自动断掉了,抓包可以看到数据已经成功发送。两种发送方式的RTP包的打包方式和内容都是一样的,不同的地方主要是rtsp会话交互发送的信息还有通过TCP方式发送的RTP包前面再加四个字节的头,加四个字节头以及数据发送的代码如下:
- C/C++ code
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;}
希望高手帮忙找一下问题,不胜感激啊
------解决方案--------------------------------------------------------
不懂,帮顶了。
------解决方案--------------------------------------------------------
唉..流媒体这东东老精细了,最近我也在学习,一头雾水T-T。不过在Live源码中对于使用tcp发送rtp信息有下面这一段代码,不知道你有没有看过,我发给你,希望能够给你帮助,然后我也继续等高手:
- C/C++ code
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);}