ffmpeg——TS流解析

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文件中

  1. 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函数将找到的音频流和视频流数据提取出来,通过主框架推入解码器。

  1. 解析流中的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格式的哪一种
  1. 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, 

你可能感兴趣的:(ffmpeg)