02FFMPEG的AVInputFormat结构体分析

2023-11-04

02FFMPEG的AVInputFormat结构体分析

概述:
该结构体位于libavformat库中的avformat.h中。

1 AVInputFormat结构体
对于FFmpeg没给注释的,我尽量找对应的注释,确实没有的证明我们不需要知道。

/*
 * 该结构体保存着输入文件指明码流数据用到封装格式。例如flv,mkv。 可认为是存放文件的头部相关属性信息。例如flv的头部。位于封装上下文结构体AVFormatContext的内部。
 * 
 * 注意:该结构体只有在解复用时才有效,由avformat_open_input打开时初始化赋值。复用时该结构体无效,因为复用时是输出,有效的是输出的AVOutputFormat *oformat。
*/
typedef struct AVInputFormat {
    /**
     * 以逗号分隔的格式短名称列表。新名字可能会追加一个小突起(某个辅助标识)。
     */
    const char *name;

    /**
     * 格式的描述性名称,这意味着比名称name更易于人类阅读。你应该使用NULL_IF_CONFIG_SMALL()宏来定义它。即与上面的name是一样的意思。
     */
    const char *long_name;

    /**
     * flags可以使用的标记宏: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
     */
    int flags;

    /**
     * 如果定义了扩展,则不执行探查。通常不应该使用猜测扩展格式,因为它不够可靠。
     */
    const char *extensions;

    const struct AVCodecTag * const *codec_tag;

    const AVClass *priv_class; ///< AVClass for the private context

    /**
     * 用逗号分隔的mime类型列表。
     * 在探测时,它用于检查匹配的mime类型。
     * 可查看av_probe_input_format2函数
     */
    const char *mime_type;

    /*****************************************************************
     * 这一行以下的字段都不是公共API的一部分。它们可能不会被libavformat之外的使用,并且可以被随意更改和删除。
     * 新的公共字段应该在正上方添加。
     *****************************************************************
     */
#if FF_API_NEXT
    ff_const59 struct AVInputFormat *next;//指向下一输入封装格式的结构体
#endif

    /**
     * Raw demuxers store their codec ID here.
     * 原始demuxer解复用存储它们的编解码器ID在这里。
     */
    int raw_codec_id;

    /**
     * 私有数据的大小,以便在wrapper包装器中进行分配。
     */
    int priv_data_size;

    /**
     * 告知给定文件是否有机会以这种格式被解析。
     * 提供的缓冲区保证是AVPROBE_PADDING_SIZE字节大,所以除非您需要更多,否则不必检查它。
     */
    int (*read_probe)(const AVProbeData *);

    /**
     * 读取格式头,并初始化AVFormatContext结构体
     * return 0 表示操作成功。
     * 应该调用avformat_new_stream来创建新的流(这里可不看,防止混乱,它这里指的应该是输入时内部自己需要创建新的流)。
     */
    int (*read_header)(struct AVFormatContext *);

    /**
     * 读一个包,把它放在'pkt'。还设置了pts和旗帜。
     * 'avformat_new_stream'只能在AVFMTCTX_NOHEADER标志被使用的情况下被调用,并且只能在调用线程中调用(不是在后台线程中)。
     * return 0表示操作成功, < 0 发生异常。
     * 在返回一个错误,pkt必须是未被调用者引用。即没有allocated或者在函数返回之前被释放了。
     */
    int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);

    /**
     * 关闭流。
     * AVFormatContext和AVStreams不是由这个函数释放的。
     */
    int (*read_close)(struct AVFormatContext *);

    /**
     * 在stream_index流组件的流中,使用一个给定的timestamp,seek到附近帧。
     * 参1:stream_index不能为-1。
     * 参3:选择在没有精确匹配的情况下应该首选的方向。即如果没有完全匹配,决定向前还是向后匹配。
     * return >= 0 成功。(但不一定是新的偏移)
     */
    int (*read_seek)(struct AVFormatContext *,
                     int stream_index, int64_t timestamp, int flags);

    /**
     * 获取流[stream_index]中的下一个时间戳。time_base单位。
     * 
     * 如果发生错误,返回这个时间戳或AV_NOPTS_VALUE。
     */
    int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                              int64_t *pos, int64_t pos_limit);

    /**
     * 开始/恢复播放-只有在使用基于网络的RTSP格式时才有意义。
     */
    int (*read_play)(struct AVFormatContext *);

    /**
     * 暂停播放-只有在使用基于网络的格式(RTSP)时才有意义。
     */
    int (*read_pause)(struct AVFormatContext *);

    /**
     * seek到指定时间戳ts。
     * 进行seeking搜索的目的是使所有活动流都可以成功显示的点最接近ts,并且在min/max_ts区间内。
     * 活动流是所有拥有AVStream.discard < AVDISCARD_ALL的流(我也暂时不太懂这句话的意思)。
     * 参1:s输入封装格式上下文。
     * 参2:stream_index 需要快进/后退操作的流。
     * 参3,参4:seek的区间,ts需要在这个范围中。
     * 参5:与上面的一样,如果没有完全匹配,决定向前还是向后匹配。
     */
    int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);

    /**
     * 返回设备列表和它的属性。
     * 更多详细可查看avdevice_list_devices()函数。
     */
    int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);

    /**
     * 初始化创建设备功能子模块。
     * 更多详细可查看avdevice_capabilities_create()函数。
     */
    int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);

    /**
     * 释放设备能力子模块。
     * 更多详细可查看avdevice_capabilities_free()函数。
     */
    int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
} AVInputFormat;

2 AVInputFormat中重要的成员
实际上该结构体并无太重要的成员,它里面只是存储了输入文件的相关属性。例如flv,mkv封装格式名称。其它均为avformat内部处理封装格式的API,即mime_type以下的字段。

typedef struct AVInputFormat {
	const char *name;//输入时的封装格式名
	const char *long_name;//同上,但是更人性化
	const char *extensions;//输入封装格式的扩展名
	/*......*/
}AVInputFormat;

3 总结AVInputFormat输入封装格式结构体
1)解复用时由avformat_open_input初始化赋值,且只在解复用有效,复用无效(不使用它,而使用另一个AVOutputFormat )。
注:有效是指输入时的AVFormatContext->AVInputFormat有效,而输出时是指另一个AVFormatContext->AVOutputFormat有效,第一个AVFormatContext和第二个AVFormatContext是不同的,一个是输入时的解封装上下文,一个是输出时的封装上下文。

2)存放输入文件的相关封装属性和其它处理封装格式的API,且这些API只在avformat内部有效。

这个结构体非常简单,我们只需要知道总结的那两点,即它如何初始化赋值和它的作用即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

02FFMPEG的AVInputFormat结构体分析 的相关文章

  • Ffmpeg 无法正确转换为 ogg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用 ffmpeg 在我的网站上转换音频和视频 Ffmpeg 可以正确转换为其他格式 如 mp3 mp4 等 但无法正确转换为 ogg 虽然 f
  • 使用 Coldfusion 的 CFFILE 标签监控 FFMpeg 的进度日志

    我想学习如何使用 ColdFusion 中的 CFFILE 标签来读取文本文件的内容 就我而言 该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志 我想编写一个 ColdFusion 脚本 该脚本将定期轮询进度日志 直到日志表
  • Node.js - 将数据缓冲到 Ffmpeg

    我使用 Node js 和 Ffmpeg 来创建动画 因为我试图避免第三方 avi mp4 解析器 所以我决定将动画输出为原始 rgb24 数据文件 然后使用一些程序将其转换为 mp4 文件 我发现 Ffmpeg 是免费且开源的 它完全可以
  • 如何在服务器上使用 ffmpeg 从 WebRTC 流获取音频和视频

    我正在尝试从 WebRTC 流获取音频和视频 并在 ubuntu 服务器上使用 ffmpeg 处理它 转码或转储 我天真地期望它能简单地解释 WebRTC 提供的 sdp 但我错了 我怀疑 ffmpeg 无法发回答案 sdp 必须手动完成
  • 将 ffmpeg 编译为独立二进制文件

    我正在尝试编译ffmpeg作为独立的二进制文件 因为我想在 AWS lambda 中使用它 我可以让事情在我正在编译的服务器上正常工作 但是如果我复制二进制文件并从另一台服务器运行它 我会得到 ffmpeg error while load
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将
  • id3 图像编辑后播放 mp3 时遇到问题

    由于硬件限制 我们生产的软件试图确保导入到其库中的任何音频文件 准备复制到硬件上 都是可接受的比特率 最近 我们开始使用 FFmpeg 将许多不同的音频类型转换为 mp3 以便在我们的硬件上导入和使用它们 虽然转换工作正常并且 mp3 文件
  • FFmpeg 缩放不是平滑中心(而是锯齿形)

    我尝试执行基本操作zoompan https www ffmpeg org ffmpeg all html zoompan with FFmpeg 我有一个输入图像 png 1280x720 并从中创建一个 8 秒的视频 mp4 320x1
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • ffmpeg 命令行,用于使用 Windows 7 从 Decklink 卡捕获(和录制)720p 音频和视频

    我正在尝试使用 Windows 7 720p 从 blackmagic Decklink 捕获卡捕获音频和视频 但我似乎无法正确获取 ffmpeg 命令行设置 ffmpeg list devices true f dshow i 虚拟 ds
  • 如何将ffmpeg中的ataenoise迁移到我自己的项目中?

    这是 ataenoise 滤波器的入口 libavfilter vf ataenoise c static int filter slice AVFilterContext ctx void arg int jobnr int nb job
  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • 图像序列到视频质量[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在尝试从一系列图像创建视频 当我使用建议的 ffmpeg 方法时 ffmpeg f image2 i image d jpg video mpg
  • FFMPEG:尝试从图像和音频创建 facebook 流时出现转换失败错误?

    目标是从图像和音频文件创建 Facebook 流 这是我的命令 ffmpeg re y loop 1 f image2 i maxresdefault jpg i audio loop mp3 ar 44100 b a 128k vcode
  • 尝试在 Android 上使用 FFMPEG。编译但是还是不行

    首先 我尝试使用 ffmpeg 将图像数组编译成 Android 上的视频 我已经遵循了各种在线教程 并且已经能够编译 Android 的库 但仍然需要项目运行 我现在使用的存储库可以在这里找到 https github com Batte
  • 使用 ImageMagick 有效地将线扫描图像拼接在一起

    我正在寻找线扫描相机的替代品 用于体育计时 或者更确切地说 用于需要确定位置的部分 我发现普通工业相机可以轻松与商业相机解决方案的速度相匹配 每秒 gt 1000 帧 对于我的需求来说 通常计时的准确性并不重要 重要的是运动员的相对位置 我
  • 使用 Java FFmpeg 包装器,还是简单地使用 Java 运行时来执行 FFmpeg?

    我对 Java 还很陌生 需要编写一个程序来监听视频转换指令 并在新指令到达时转换视频 说明存储在 Amazon SQS 中 但这与我的问题无关 我面临一个选择 要么使用 Java 运行时来执行 FFmpeg 转换 如从命令行 要么使用用
  • FFmpeg 代码无法在用于缩略图提取的 http url 上工作

    我正在尝试从 sharepoint 2013 视频库中提取缩略图 我找到了一个可以使用 ffmpeg 提取的链接 这是链接 如何将视频的第一帧保存为图像 https stackoverflow com questions 3575311 h
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是

随机推荐

  • CSerialPort教程4.3.x (7) - CSerialPort在vcpkg中的使用

    CSerialPort教程4 3 x 7 CSerialPort在vcpkg中的使用 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python
  • JWT认证、drf-jwt安装和简单使用、实战之使用Django auth的User表自动签发、实战之自定义User表,手动签发

    一 JWT认证 在用户注册或登录后 我们想记录用户的登录状态 或者为用户创建身份认证的凭证 我们不再使用Session认证机制 而使用Json Web Token 本质就是token 认证机制 Json web token JWT 是为了在
  • 数据分析学习之路——(十)专题分析:怎样挖掘4w篇文章中的隐藏信息

    说明 随着现代社会互联网不断发展壮大的趋势 越来越多的专题网站 论坛也趁着东风连续高速发展 广大互联网用户身处这个 信息爆炸 的时代 怎样才能选出令自己感兴趣的优质内容 已成了大多数互联网用户最为关注的目的 也正是如此 对于网站运营来讲 如
  • VS code编辑器对代码的检查----flake8

    打开vs code编辑器 点帮助 所有命令 搜索 select linter 选中点开后 里面有很多个检查器 选择flake8 如果没有安装 会提示你进行安装 安装好后 编写的代码会进行检查 出现问题都会有提示 在改正错误后 要保存文件后才
  • 33-js-concepts(二)原始类型

    原始类型 原始类型 2 1 2 2 2 3 2 4 2 5 2 6 原始类型 2 1 基本类型 基本数值 基本数据类型 是一种既非对象也无方法的数据 在 JavaScript 中 共有7种基本类型 string number bigint
  • 聊聊在集群环境中本地缓存如何进行同步

    前言 之前有发过一篇文章聊聊如何利用redis实现多级缓存同步 有个读者就给我留言说 因为他项目的redis版本不是6 0 版本 因此他使用我文章介绍通过MQ来实现本地缓存同步 他的同步流程大概如下图 他原来的业务流程是每天凌晨开启定时器去
  • el-icon使用方法

    如果我要使用upload的图标 1 导入icon import Upload from element plus icons vue 2 声明 components Upload 3 使用
  • grpc在linux端编译,gRPC 编程指南

    gRPC 介绍 gRPC 是谷歌开源的高性能 RPC 框架 RPC 也即远程方法调用 对于 RPC client 来说 它可以调用远程 server 上的某个方法 看起来就像是在调用本地方法一样 区别就在于 通过 RPC 调用远程方法时 数
  • 服务器系统2008能升级2012吗,盗版的windows server 2008可以升级成windows server 2012吗...

    这样 就可以生成规则排列的十六进制字节码并存储在文件2 txt中 如代码清单1 2所示 是不是和FlexHEX显示的结果差不多呢 代码清单1 2 HelloWorld exe文件的字节码 chapter1 2 txt 13B7 0100 4
  • mysql对身份证号进行脱敏处理

    一 数据脱敏解释 在日常开发需求中会经常遇到数据脱敏处理 比如身份证号 手机号 需要使用 进行部分替换显示 这样能使敏感隐私信息在一定程度上得到保护 那么什么是数据脱敏呢 在涉及客户安全数据或者一些商业性敏感数据的情况下 在不违反系统规则条
  • GPU的存储结构

    CPU的存储单元包括全局存储 纹理存储 常量存储 共享存储 局部存储和寄存器等 另外 CPU端 主机端 存储类型 页锁定存储 pinned 存储 和可分页存储 pagable 存储 以及CPU和GPU的通信接口和通信方式也是会影响GPU程序
  • Scala条件判断语句

    下面是一个典型的决策中IF ELSE结构的一般形式使用在大多数的编程语言中 if 语句 if 语句包含一个布尔表达式后跟一个或多个语句 语法 一个 if 语句的语法 if Boolean expression Statements will
  • js逆向-金沙赌场参数k值

    声明 本文仅供学习参考 请勿用于其他途径 违者后果自负 前言 目标网站 aHR0cHM6Ly93d3cuOTc3OTlmLmNvbTo5OTAwLw 接口 https www 97799f com 9900 entrance login j
  • 求最长路径和最大的消耗代价(阿里巴巴2018年秋招提前批内推编程题)

    题目要求如下 示例代码如下 include lt iostream gt include lt vector gt using namespace std int main int nSystem 系统个数 int nDependency
  • 滴滴 - dispatching

    这里写目录标题 1 2017 A Taxi Order Dispatch Model based On Combinatorial Optimization 2 2018 Large Scale Order Dispatch in On D
  • json字符串转map集合

    Java字符串转map集合 List集合转转数组 使用json转map原因是因为 我们发送短信是多渠道的 阿里和腾讯云的发送短信变量不一样 通过自己封装的统一code 和模板变量进行发送短信 所以模板变量就需要统一 这样就要想怎么在发送腾讯
  • 【华为OD机试 2023】 最多几个直角三角形(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 记录一次南京华为OD iOS岗位机试流程

    投递完简历 hr会进行初步筛选 筛选完后 给你发面试流程 面试流程大概是这样的 hr告诉我华为面试流程是这样 笔试 机试 综测 技术面试 HR面试 综合面试 offer 全程线上完成 华为机考是在牛客网上考的 1 牛客网机考答题规则 3道题
  • 运营入门——全栈市场人

    运营入门 全栈市场人 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 特别说明 本文内容部分摘自 全栈市场人 互联网市场营销入门通用宝典 Lydia所著 如摘抄内容存在不妥或版权问题 请联系博客作者予以删除 阅读目
  • 02FFMPEG的AVInputFormat结构体分析

    02FFMPEG的AVInputFormat结构体分析 概述 该结构体位于libavformat库中的avformat h中 1 AVInputFormat结构体 对于FFmpeg没给注释的 我尽量找对应的注释 确实没有的证明我们不需要知道