【问题标题】:What does the avformat_open_input() do?avformat_open_input() 有什么作用?
【发布时间】:2012-12-17 13:26:52
【问题描述】:

我正在关注this 代码以使用 C 中的 FFmpeg 库。FFmpeg 库的文档很少,很难理解每个函数的具体作用。

我了解代码(正在做什么)。但我缺乏清晰度。谁能帮帮我?

Q1) **struct AVFrameContext **** 和 filename(所需的最小非 NULL 参数)被传递给函数 avformat_open_input()。顾名思义,输入文件是“打开的”。怎么样?

【问题讨论】:

  • ffmpeg 自带源码,你看/进去了吗?
  • 你的意思是看库函数的代码?感谢您的建议:)我会立即看到它:)
  • @RomanR。让用户阅读该死的 FFmpeg 源代码绝对是荒谬的,这是一个庞大的代码库,函数名称和代码风格很难遵循,我说作为为他们扩展内部解码器的人......
  • @MarcusJ:我发现找到avformat_open_input(在给定目录中搜​​索几秒钟)并快速查看参数验证以及这里通常发生的事情没有什么可笑的。最终,这就是其他开发人员所做的事情而不会抱怨。那么这里的问题是“它做了什么”:所以你打开它,你会看到它做了什么。
  • 问题是在 avformat_open_input 中有 3 或 4 个函数调用,而且在这些函数中越来越多,它很快就会变得疯狂。

标签: c ffmpeg


【解决方案1】:

您可以在 FFmpeg 的 libavformat\utils.c 中查找那里真正发生的事情:

int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
{
    AVFormatContext *s = *ps;
    int ret = 0;
    AVDictionary *tmp = NULL;
    ID3v2ExtraMeta *id3v2_extra_meta = NULL;

    if (!s && !(s = avformat_alloc_context()))
        return AVERROR(ENOMEM);
        // on and on

【讨论】:

  • 感谢您的回答.. :)
【解决方案2】:

file_open 中主要完成的事情是

  • 为 AVFormatContext 分配内存。
  • 从文件中读取数据的probe_size(输入url)
  • 尝试猜测输入文件格式,输入文件的编解码器参数。这是通过为每个解复用器调用 read_probe 函数指针来完成的
  • 分配编解码器上下文、解复用上下文、I/O 上下文。

【讨论】:

  • 我在this链接中读到-“该函数分配一个AVFormatContext,打开指定的文件(自动检测格式)并读取标题,将存储在那里的信息导出到我们传递的指针中” .什么是文件头?它是文件的前几个字节吗?标题的大小是固定的吗?头文件里有probe_size的信息吗?
  • 感谢您的回答。你能详细说明一下吗? :)
  • header 是混合文件头,例如 flv 头、mp4 头、avi 头。标题中的信息特定于文件格式。探针大小是ffmpeg“-probesize”的命令行参数。这是 ffmpeg 用于自动检测文件格式和其他信息(编解码器、宽度、高度 ....)的数据量
  • probe_size 表示函数决定从打开的文件中“读取”以检测一些重要内容的数据量,对吗?是固定的吗?
  • 你的解释是正确的。它有一个默认值,你可以通过“-probesize”命令行参数来改变它。
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2011-07-17
  • 2014-09-13
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多