当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 }