FFMPEG源码分析:avformat_open_input()(媒体打开函数)

本文分析了FFMPEG中的媒体打开函数avformat_open_input()

//参数ps包含一切媒体相关的上下文结构,有它就有了一切,本函数如果打开媒体成功,  
//会返回一个AVFormatContext的实例.  
//参数filename是媒体文件名或URL.  
//参数fmt是要打开的媒体格式的操作结构,因为是读,所以是inputFormat.此处可以  
//传入一个调用者定义的inputFormat,对应命令行中的 -f xxx段,如果指定了它,  
//在打开文件中就不会探测文件的实际格式了,以它为准了.  
//参数options是对某种格式的一些操作,是为了在命令行中可以对不同的格式传入  
//特殊的操作参数而建的, 为了了解流程,完全可以无视它.  
int avformat_open_input(AVFormatContext **ps,  
        const char *filename,  
        AVInputFormat *fmt,  
        AVDictionary **options)  
{  
    AVFormatContext *s = *ps;  
    int ret = 0;  
    AVFormatParameters ap = { { 0 } };  
    AVDictionary *tmp = NULL;  
  
    //创建上下文结构  
    if (!s && !(s = avformat_alloc_context()))  
        return AVERROR(ENOMEM);  
    //如果用户指定了输入格式,直接使用它  
    if (fmt)  
        s->iformat = fmt;  
  
    //忽略  
    if (options)  
        av_dict_copy(&tmp, *options, 0);  
  
    if ((ret = av_opt_set_dict(s, &tmp)) < 0)  
        goto fail;  
  
    //打开输入媒体(如果需要的话),初始化所有与媒体读写有关的结构们,比如  
    //AVIOContext,AVInputFormat等等  
    if ((ret = init_input(s, filename)) < 0)  
        goto fail;  
    //执行完此函数后,s->pb和s->iformat都已经指向了有效实例.pb是用于读写数据的,它  
    //把媒体数据当做流来读写,不管是什么媒体格式,而iformat把pb读出来的流按某种媒体格  
    //式进行分析,也就是说pb在底层,iformat在上层.  
  
    //很多静态图像文件格式,都被当作一个格式处理,比如要打开.jpeg文件,需要的格式  
    //名为image2.此处还不是很了解具体细节,作不得准哦.  
    /* check filename in case an image number is expected */  
    if (s->iformat->flags & AVFMT_NEEDNUMBER) {  
        if (!av_filename_number_test(filename)) {  
            ret = AVERROR(EINVAL);  
            goto fail;  
        }  
    }  
  
    s->duration = s->start_time =

你可能感兴趣的:(ffmpeg)