转载自:
http://blog.csdn.net/hjksfw900/article/details/3777436
int av_find_stream_info(AVFormatContext *ic)
{
- for(i=0;i<ic->nb_streams;i++) {
- 分析AVCodecContext的每个AVStream
- st = ic->streams[i];
- if(st->codec->codec_type == CODEC_TYPE_VIDEO){
- /* if(!st->time_base.num)
- st->time_base= */
- if(!st->codec->time_base.num)
- st->codec->time_base= st->time_base;
- }
- //only for the split stuff
- if (!st->parser) {
- 寻找AVStream的parser,
- st->parser = av_parser_init(st->codec->codec_id);
- if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
- st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
- }
- }
- }
av_parser_init根据AVStream的codec_id找到对应的parser,所有的parser在libavcodec/all_codec.c中注册,例如mpegvideo_parser在(libavcodec/mpegvideo_parser.c):
- AVCodecParser mpegvideo_parser = {
- { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO },
- sizeof(ParseContext1),
- NULL,
- mpegvideo_parse,
- ff_parse1_close,
- };
如果AVStream对应的codec根本没有媒体的信息,比如采样率等(has_codec_parameters(st->codec)返回0),那么需要读取AVStream的数据来获取媒体的信息。读取AVStream一个packet的函数是av_read_frame_internal
在av_read_frame_internal返回后,ffmpeg从媒体数据中获取到了一个packet的数据,如果这个时候还是不知道媒体的格式(codec已经知道),那么可能需要解码媒体数据来获取媒体格式,这个时候调用try_decode_frame来解码frame
}