当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包。这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户端,此时RTSP客户端可以调用GetMediaData等接口获取媒体流数据。

 

一、uint8_t * RtspClient::GetMediaData(string media_type, uint8_t * buf, size_t * size, size_t max_size)

该函数的作用即获取媒体流数据,并将数据放入参数buf中,数据大小放入size中,media_type可以为字符串“audio”或“video”,max_size为buf的最大值。

if(it->second.MediaType == "video") return GetVideoData(&(it->second), buf, size, max_size);
if(it->second.MediaType == "audio") return GetAudioData(&(it->second), buf, size, max_size);

该函数首先在MediaSessionMap中查询匹配media_type的媒体会话,然后选择调用GetVideoData或GetAudioData。

 1 uint8_t * RtspClient::GetMediaData(string media_type, uint8_t * buf, size_t * size, size_t max_size) 
 2 {
 3         MyRegex Regex;
 4         map<string, MediaSession>::iterator it;
 5         bool IgnoreCase = true;
 6         if(!buf) return NULL;
 7         if(!size) return NULL;
 8 
 9         *size = 0; 
10 
11         for(it = MediaSessionMap->begin(); it != MediaSessionMap->end(); it++) {
12                 if(Regex.Regex(it->first.c_str(), media_type.c_str(), IgnoreCase)) break;
13         }
14 
15         if(it == MediaSessionMap->end()) {
16                 fprintf(stderr, "%s: No such media session\n", __func__);
17                 return NULL;
18         }
19 
20         if(it->second.MediaType == "video") return GetVideoData(&(it->second), buf, size, max_size);
21         if(it->second.MediaType == "audio") return GetAudioData(&(it->second), buf, size, max_size);
22         return NULL;
23 }
View Code

相关文章: