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

本文深入探讨了FFmpeg库中的关键函数avformat_open_input(),详细阐述了其在媒体文件打开过程中的作用,涵盖了函数内部的工作流程、主要功能和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文分析了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 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值