ffmpeg关于mpegts码流解析部分:
1、
通过av_register_all()来注册所有的编解码器、解复用器(这里只用到mpegts_demuxer)、注册所使用的协议(这里用到文件打开的协议file_protocol,类似的还有http_protocal,pipe_protocol,rtp_protocol,tcp_protocol,udp_protocol).
代码如下:
Void av_register_all()
{
Avcodec_register_all();// 注册所有的编解码器
REGISTER_MUXDEMUX(MPEGTS,mpegts);//注册的实质是把所有的解复用器也好还是复//用器也好都加入到一个链表里面
REGISTER_PROTOCOL(FILE,file);//协议的注册也是如此,都是加入到一个链表里面
}
2、
a)
b)
这里用到URLProtocol file_protocol = {
};
};
现在程序进入到核心的部分mpegts.c中,下面来依次分析mpegts.c中的各个函数。
1.在mpegts_read_header中,先读取1024字节来得到包大小
2.然后通过if(s->iformat==&mpegts_demuxer)来判断是解复用还是复用。先看解复用的情况。程序先挂载sdt表和pat表。
Mpegts_scan_sdt(ts);//挂在sdt表到ts->pids[pid]
Mpegts_set_service(ts);//挂在pat表到ts->pids[pid]
Handle_packets(ts,s->probesize);//真正处理包信息的地方在这里
3.进入到handle_packets()中来看。
For(;;)
{
}
{
}
static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1,
{
}
关于ffmpeg程序的结构层次关系:
URLProtocol、URLContext和ByteIOContext是ffmpeg文件操作的结构,
AVFormatContext是相当于容器之类的东西,会把解析到的信息都记录在这里
AVFormatContext{
ByteIOContext{
}
}
Void *priv_data//指向MpegtsContext结构体
}
对TS码流分析:
第一个包
00000000h: 04 CA 63 A0 包头:47 4pid0 00 afc10 00 00 B0 section_length11 00 01 C1 00 ; .蔯燝@....?..?
00000010h: 00 sid00 00 network_pidE0 1F sid00 01 Epmt_pid1 00 24 AC 48 84 FF FF FF ; ...?..?$琀?
00000020h: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 后面的省略
分析:pid=0,表明后面跟的负载为pat表
Afc=01,表明没有适应段
Section_length=17,表明此段后有17个字节,包括crc
Sid为节目
第二个包
000000c0h: 04 CA 63 A0 包头47 4pid1 00 10 00 段开始:table_id:02 B0 section_length:46program_number00 01 C1 section_number00 ; .蔯燝A....癋..?
000000d0h: last_sec_number00 F PCR_PID0 01 F0 program_info_length0C tag05 len04 bytes48 44 4D 56tag88 len04 0F FF FC ; .??..HDMV?.?
000000e0h: FC stream_type1B es_pidF0 11 Fes_info_len0 06 desc_tag28 desc_len04 64 00 29 BFstream_type81 es_pidF1 00 Fes_info_len0 ; ???(.d.)縼??
000000f0h: 12 desc_tag05 desc_len04 41 43 2D 33 desc_tag81 desc_len04 08 48 0E 00 desc_tag0Adesc_len04 6A ; ...AC-3?.H....j
00000100h: 70 6E 00 stream_type90 Fes_pid2 00 Fes_info_len0 06 desc_tag0A desc_len04 7A 68 6F 004C 3A ; pn.愹.?..zho.L:
00000110h: EA 06 FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ?未完待续。。。。