1注册所有的av codec, av format, av device
av_register_all();
2打开文件
int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
AVInputFormat *fmt,
int buf_size,
AVFormatParameters *ap)
{
需要提供的参数:
a. AVFormatContext **ic_ptr
b. filename
eg:
if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL) != 0){
fprintf(stderr, "open rtsp failed/n");
exit(0);
}
该文件的内部实现:
2.1 构造AVProbeData:
pd->filename = "";
if (filename)
pd->filename = filename;
pd->buf = NULL;
pd->buf_size = 0;
2.2 检测文件的格式
fmt = av_probe_input_format(pd, 0);
av_probe_input_format检测左右注册的AVInputFormat,判断文件的格式,返回正确的AVInputFormat结构。如果指定的文件是rtsp格式的,那么返回AVInputFormat rtsp_demuxer(位于libavformat/rtsp.c中)
2.2 打开文件
err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap)
int av_open_input_stream(AVFormatContext **ic_ptr,
ByteIOContext *pb, const char *filename,
AVInputFormat *fmt, AVFormatParameters *ap)
pb:Bytestream IO Context.根据结构表示的是字节流的输入输出结构,那么以后读取数据是否可以从这个结构中读取?
在这个函数中给ic_ptr赋值,让ic_ptr记住文件的各种属性,因为这个结构要传递给应用程序:
ic->iformat = fmt;
ic->pb = pb;
ic->duration = AV_NOPTS_VALUE;
ic->start_time = AV_NOPTS_VALUE;
av_strlcpy(ic->filename, filename, sizeof(ic->filename));
对于rtsp协议而言, fmt->private_data_size是 sizeof(RTSPState),那么ic->priv_data应该是RTSPState结构.
/* allocate private data */
if (fmt->priv_data_size > 0) {
ic->priv_data = av_mallocz(fmt->priv_data_size);
if (!ic->priv_data) {
err = AVERROR(ENOMEM);
goto fail;
}
} else {
ic->priv_data = NULL;
}
读取rtsp信息的header,对于rtsp,就是调用rtsp_read_header函数.
if (ic->iformat->read_header) {
err = ic->iformat->read_header(ic, ap);
if (err < 0)
goto fail;
}
}
2.3 返回