创建RTSP 的Mjpeg,初始化SDP不成功。
各位高手,
小弟,正在开发一个RTSP的代码用于,从相机采集MJPEG视频流。
目前在创建RTSP的mjpeg通道时,遇到问题,问题是初始化SDP不成功。
附件是代码。
附件代码基于windows平台。
程序会死在这里GetMediaAttrbute(Attribute,subsession,subsessionNum);
错误见附件图片。
错误原因是:MediaSubsession * subsession中的subsession没有被初始化。
在执行if(strcmp(mediasub->fCodecName,"MP4V-ES") != 0)代码是,由于mediasub->fCodecName没有赋值,所以会报错。
想请教一下,如何才能赋值成功。谢谢。
int init_rtsp(char *url,struct MediaAttribute *Attribute)
{
char* sdpDescription = NULL;
struct MediaSubsession *subsession = NULL;
int subsessionNum = 0;
int socketNum = -1;
int result = -1;
//*********************************************
//Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
//*********************************************
fBaseURL = strDup(url);//解析rtsp地址。
fprintf(stderr,"start openConnectionFromURL %s\n",fBaseURL);
socketNum = openConnectionFromURL(fBaseURL);
fprintf(stderr,"socketNum is %d\n",socketNum);//是C/C++中的一个格式化写—库函数;其作用是格式化输出到一个流/文件中; 打印信息。
if(socketNum<0)
{
fprintf(stderr,"failed to open the URL\n");
return (-1);
}
sdpDescription = (char*)malloc(MAX_READBUFSIZE*sizeof(char));//Malloc 向系统申请分配指定size个字节的内存空间。
if(sdpDescription == NULL)
{
fprintf(stderr,"failed to alloc the memory\n");
return (-1);
}
memset(sdpDescription,0,MAX_READBUFSIZE);
fprintf(stderr,"start getSDPDescriptionFromURL \n");
result = getSDPDescriptionFromURL(socketNum,fBaseURL,sdpDescription);
if (result<0)
{
fprintf(stderr,"Failed to get a SDP description from URL\n");
free(sdpDescription);
close(socketNum);
return (-1);
}
fprintf(stderr,"Opened URL %s Sreturning a SDP description:\n%s\n",fBaseURL,sdpDescription);
fprintf(stderr,"start initializeWithSDP\n");
subsession = initializeWithSDP(sdpDescription,&subsessionNum);
if(subsession == NULL)
{
fprintf(stderr,"Failed to initialize a SDP description\n");
free(sdpDescription);
close(socketNum);
return (-1);
}
GetMediaAttrbute(Attribute,subsession,subsessionNum);
setupStreams(socketNum,subsession,subsessionNum);
startPlayingStreams(socketNum,subsession,subsessionNum);
free(sdpDescription);
return socketNum;
}