当前位置: 代码迷 >> 多媒体/流媒体开发 >> RTP包使用TCP发送的有关问题
  详细解决方案

RTP包使用TCP发送的有关问题

热度:5720   发布时间:2013-02-26 00:00:00.0
RTP包使用TCP发送的问题
最近做了一个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);}
  相关解决方案