为什么在接收rtsp网络视频流总是接收不到数据的!
为什么在接收rtsp网络视频流总是超时接收不到数据的!
int sockin, sc1, sc2;
sockaddr_in addr;
char *buf, *szcmd, *url;
char szip[32];
int nlen, iret, iport;
int ip1, ip2;
long lret;
//初始化变量
FD_ZERO(&rfdsock);
fp = fopen("1.txt", "w+");
//分配缓冲区
nlen = 10240;
buf = (char*)malloc(nlen);
//定义要连接的url
url = "rtsp://192.168.1.66:554/channel0";
//初始化sock
InitSocket();
//分析url请求,取出ip,端口
lret = PraseURL(url, szip, &iport);
//初始化与服务器连接的socket
sockin = InitTCPSocket(0);
//与服务器连接
addr.sin_family = AF_INET;
addr.sin_port = htons(iport);
addr.sin_addr.s_addr = inet_addr(szip);
iret = connect(sockin,(struct sockaddr*)&addr, sizeof addr);
//发送option命令
szcmd = GetOptionCmd(url);
lret = SendRTSPCmd(sockin, "OPTIONS",szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen,100);
//发送DESCRIBE命令
szcmd = GetDescribeCmd(url);
lret = SendRTSPCmd(sockin, "DESCRIBE", szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
//解析Response
lret = PraseDescribeCmd((const char*)buf);
//创建客户端接收端口
sc1 = InitUDPSocket(NULL, 6544);
sc2 = InitUDPSocket(NULL, 6545);
//将sock加入到要等待的队列
FD_SET(sc1, &rfdsock );
FD_SET(sc2, &rfdsock);
lret = GetSokcetPort(sc1, &ip1);
lret = GetSokcetPort(sc2, &ip2);
//发送Setup命令,告诉服务器客户端的接受数据的端口
szcmd = GetSetupCmd(url, ip1, ip2);
//告诉服务器客户端的端口
lret = SendRTSPCmd(sockin, "SETUP", szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
//解析Response返回的命令串
lret = PraseSetupCmd(buf, szip);
char *session, *srange;
session = szip;
//发送PLAY命令
srange = "Range: npt=0.000-39.471\r\n";
szcmd = GetPlayCmd(url, session, srange);
lret = SendRTSPCmd(sockin, "PLAY", szcmd);
free(szcmd);
lret = ReadSocket(sockin, buf, nlen, 100);
timeval tv;
fd_set fr;
int i;
tv.tv_sec = 20;
tv.tv_usec = 0;
struct sockaddr_in addr2;
int addrlen;
addrlen = sizeof addr;
//将数据写到文件中去
FILE *ffp;
ffp = fopen("receive.m4e", "wb");
//开始接受数据了
while(true)
{
fr = rfdsock;
/*此处在接收到一定时候后,超时 */
lret = select(0, &fr, NULL, NULL, &tv);
if(lret == SOCKET_ERROR)
{
break;
}
else if(lret >0)
{
//判断是哪个socket可以读取数据了
for(i = 0; i< 2;i ++)
{
if(FD_ISSET(rfdsock.fd_array[i], &fr)
&& FD_ISSET(rfdsock.fd_array[i], &rfdsock))
{
lret = recvfrom(rfdsock.fd_array[i], buf, nlen,0, (struct sockaddr*)&addr2, &addrlen );
if(lret > 0 && ffp)
{
fwrite(buf+12, 1, lret-12, ffp);
}
else if(lret == SOCKET_ERROR)
{
break;
}
}
}
}
else if(lret == 0)
break;
}
fclose(ffp);
//退出后的清理工作
closesocket(sockin);
closesocket(sc1);
closesocket(sc2);
fwrite("\r\nend", 1, 5, fp);
fclose(fp);
...全文
相关推荐
Qt + FFmpeg RTSP视频流解码,延迟0.2s以内!
实现了一路Qt + FFmpeg RTSP视频流的解码,调用FFmpeg API实现,版本为FFmpeg 4.1.2。实测视频延迟为200ms 以内,已达到商业使用标准。
ffmpeg拉取rtsp网络视频流报错解析
在使用ffmpeg调用api方式对一个rtsp网络视频流拉流播放时,应用程序出现了一些错误提示,并且拉流播放的画面也出现了一些马赛克的现象。所以这里便对应用程序所产生的错误提示进行了详细的研究和分析。这里将分析结果贴在下面,若其他朋友遇到类似的错误,供参考。丢失了部分rtp协议数据包,造成的影响是可能是马赛克 卡顿或者跳帧。
Qt基于ffmpeg的rtsp视频流接收播放工具
个人原创,仅供交流学习。
C# FFmpeg保存rtsp视频流到本地文件
C# 使用FFmpeg库保存rtsp视频流为本地文件,获取摄像头rtsp视频流地址可以参考我的另一个资源
HTML播放海康视频的RTSP视频流
亲测,可用,通过HTML播放海康视频的RTSP视频流 效果不错


网络编程
