ffmpeg解析-----解析文件格式

来源:互联网 发布:网络打印服务器软件 编辑:程序博客网 时间:2024/05/02 01:27

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 返回

原创粉丝点击