RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
实时传输协议RTP(Real-time Transport Protocol)是一个网络传输协议,RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。
将TS/PS的解析文件定义在libavformat/mpegts.c文件中
将音频、视频的解码定义在libavcodec/mpeg12.c文件中
- MPEG2-TS的demuxer函数
AVInputFormat ff_mpegts_demuxer = {
.name = "mpegts",
.long_name = NULL_IF_CONFIG_SMALL("MPEG-TS (MPEG-2 Transport Stream)"),
.priv_data_size = sizeof(MpegTSContext),
.read_probe = mpegts_probe, //分析是三种TS格式的哪一种
.read_header = mpegts_read_header,//读数据头信息,比如在ts流当中的数据包大小,还ts流中的节目信息,
//sdt表,pmt表,video pid,audio pid等等,以便后面读数据时使用。
.read_packet = mpegts_read_packet,
.read_close = mpegts_read_close,
.read_timestamp = mpegts_get_dts,
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT,
.priv_class = &mpegts_class,
};
该结构通过av_register_all函数注册到ffmpeg的主框架中,通过mpegts_probe函数来检测是否是TS流格式,然后通过 mpegts_read_header函数找到一路音频流和一路视频流(注意:在该函数中没有找全所有的音频流和视频流),最后调用 mpegts_read_packet函数将找到的音频流和视频流数据提取出来,通过主框架推入解码器。
- 解析流中的TS格式
/*
* 出现3种格式,主要原因是:
* TS标准是 188Bytes;
* 日本标准是192Bytes的DVH-S格式;
* 第三种的 204Bytes则是在188Bytes的基础上,加上16Bytes的FEC(前向纠错).
*/
#define TS_DVHS_PACKET_SIZE 192
#define TS_FEC_PACKET_SIZE 204
#define TS_PACKET_SIZE 188
mpegts_probe, //分析是三种TS格式的哪一种
- MPEG2-TS头解析
static int mpegts_read_header(AVFormatContext *s)
{
MpegTSContext *ts = s->priv_data;
AVIOContext *pb = s->pb;
pos = avio_tell(pb);//保存流的当前位置,便于检测操作完成后恢复到原来的位置
len = avio_read(pb, buf, sizeof(buf));//从pb中读入一段流到buf
ts->raw_packet_size = get_packet_size(buf, len);//主要是调用analyze,获得ts包的类型
ts->auto_guess = 0;
if (s->iformat == &ff_mpegts_demuxer)
{
//挂载解析SDT表的回调函数到ts->pids变量上,这样在handle_packet函数中根据对应的pid找到对应处理回调函数。
mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);// 向ts