- 功能描述
H264VideoRTPSource类实现了rtsp下的媒体数据rtp和rtcp协议的功能,提供了媒体数据传输的逻辑。从rtp的socket源源不断的接收数据,解析接收一个h264的帧,回调函数通知上层APP处理。
原始视频流数据传输的时候通常不会直接将编码码流进行传输,而是先将码流打包成一个个 RTP 包再进行发送。RTP H264 码流打包分为三种方式:第一种单 NALU 封包方式适合比较小的RTP报文,比如 P 帧和 B 帧编码之后比较小或者SPS、PPS帧报文,可以使用这种打包方式。第二种组合封包方式,将多个NALU组合在一个rtp报文中,比较少用。第三种分片分包方式,将一个 NALU 分开打包在连续的多个 RTP 包中;是最常用的一种方式,由于一般一个NALU比较大,需要拆分到连续多个rtp报文中发送,接收端再组装成一个NALU返回上层app。
二、继承关系
H264VideoRTPSource –>
MultiFramedRTPSource –>
RTPSource –>
FramedSource ->
MediaSource ->
Medium
H264VideoRTPSource也是可以保存Medium队列,通过名称查找到该对象实例指针。
三、代码分析
3.1 MediaSource分析
与Medium类似,定义了一个source的基类,实现了type的设置;支持如下的类型
class MediaSource: public Medium {
virtual char const* MIMEtype() const;
// 判断该source是何种类型的source
virtual Boolean isFramedSource() const;
virtual Boolean isRTPSource() const;
virtual Boolean isMPEG1or2VideoStreamFramer() const;
virtual Boolean isMPEG4VideoStreamFramer() const;
virtual Boolean isH264VideoStreamFramer() const;
…
}
3.2 FramedSource分析
定义了启动source的getNextFrame接口、doGetNextFrame虚函数、 获取媒体数据回调函数、关闭回调函数和一些状态变量。到目前只是定义接口,还没涉及到具体的传输协议。
class FramedSource: public MediaSource {
// 成功读取一帧媒体数据回调函数
typedef void (afterGettingFunc)(void* clientData, unsigned frameSize,
unsigned numTruncatedBytes,
struct timeval presentationTime,
unsigned durationInMicroseconds);
// 媒体关闭的回调函数
typedef void (onCloseFunc)(void* clientData);
// 启动source开始接收数据的接口;需要设置缓存和回调函数
void getNextFrame(unsigned char* to, unsigned maxSize, /* 接收数据缓存和大小*/
afterGettingFunc* afterGettingFunc, /* 成功接收帧回调函数*/
void* afterGettingClientData, /* 回调函数的入参*/
onCloseFunc* onCloseFunc, /* 关闭媒体回调函数*/
void* onCloseClientData);
<