创建RTSP 的Mjpeg,初始化SDP不成功。

ourhome 2013-01-09 02:18:43
各位高手,

小弟,正在开发一个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;
}
...全文
644 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
言子檡 2013-04-10
  • 打赏
  • 举报
回复
没看到楼主源码的附件。。。
言子檡 2013-04-10
  • 打赏
  • 举报
回复
subsession = initializeWithSDP(sdpDescription,&subsessionNum); 这个函数的实现在哪里?
wubian2008 2013-03-22
  • 打赏
  • 举报
回复
我只研究过live555中h264部分的代码,不过跟你需要的这部分应该是一样的道理吧。 生成sdp的地方,会先从指定文件(如果是播放本地文件的话)里读取一些数据,分析产生sdp信息。 你现在是实现实时数据播放的话,也需要提供数据源才行。 读数据的类对象构造的时候就要启动实时数据的获取,存放在内存缓冲里。然后在读数据的方法里面,从内存读数据。 ps:实现describe和play读数据的地方是一样的。
jimmyhuang168 2013-03-15
  • 打赏
  • 举报
回复
不太明白你的意思,源码在那里???
ourhome 2013-01-09
  • 打赏
  • 举报
回复


执行结果。程序死在这里。
ourhome 2013-01-09
  • 打赏
  • 举报
回复


出问题的地方。

2,543

社区成员

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

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