广告
返回顶部
首页 > 资讯 > 后端开发 > Python >InputStream数据结构示例解析
  • 621
分享到

InputStream数据结构示例解析

InputStream数据结构InputStream结构 2022-11-13 19:11:08 621人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录正文struct InputStream数据结构定义各个字段的解析正文 struct InputStream 是单个输入流的管理器。是由 add_input_

正文

struct InputStream 是单个输入流的管理器。是由 add_input_stream() 函数申请内存,以及赋值 InputStream 的各个字段的。

而 input_streams 数组是一个全局变量,包含了所有输入文件里面的所有输入流。

nputStream **input_streams = NULL;
int        nb_input_streams = 0;

你在二次开发 FFmpeg.exe 的时候,可以用 input_streams 全局变量来获取到所有的输入流

struct InputStream数据结构定义

typedef struct InputStream {
    int file_index;
    AVStream *st;
    int discard;             
    int user_set_discard;
    int decoding_needed;     
#define DECODING_FOR_OST    1
#define DECODING_FOR_FILTER 2
    AVCodecContext *dec_ctx;
    const AVCodec *dec;
    AVFrame *decoded_frame;
    AVFrame *filter_frame; 
    AVPacket *pkt;
    int64_t       start;     
    
    int64_t       next_dts;
    int64_t       dts;       ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
    int64_t       next_pts;  ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
    int64_t       pts;       ///< current pts of the decoded frame  (in AV_TIME_BASE units)
    int           wrap_correction_done;
    int64_t filter_in_rescale_delta_last;
    int64_t min_pts; 
    int64_t max_pts; 
    // when forcing constant input framerate through -r,
    // this contains the pts that will be given to the next decoded frame
    int64_t cfr_next_pts;
    int64_t nb_samples; 
    double ts_scale;
    int saw_first_ts;
    AVDictionary *decoder_opts;
    AVRational framerate;               
    int top_field_first;
    int guess_layout_max;
    int autorotate;
    ...省略字幕相关字段...
    int dr1;
    
    InputFilter **filters;
    int        nb_filters;
    int reinit_filters;
    
    ...省略硬件解码相关字段...
    
   ...省略硬件解码相关字段...
    
    // combined size of all the packets read
    uint64_t data_size;
    
    uint64_t nb_packets;
    // number of frames/samples retrieved from the decoder
    uint64_t frames_decoded;
    uint64_t samples_decoded;
    int64_t *dts_buffer;
    int nb_dts_buffer;
    int Got_output;
} InputStream;

各个字段的解析

(省略了字幕相关的字段):

1, int file_indexinput_files 数组里面的下标,代表 InputStream 对应的 InputFile

2, AVStream *stAVFORMatContext 里面的 AVStream 。

3, int discard,如果是 1 会丢弃读取到的 AVPacket,刚开始的时候都是 1。例如文件里面有多个视频流,会全部都把 discard 设置为 1,然后再从中选出质量最好的视频流,把它的 discard 设置为 0 。

或者当输出流需要这个输入流的时候,也会置为 0 ,如下:

if (source_index >= 0) {
    ost->sync_ist = input_streams[source_index];
    input_streams[source_index]->discard = 0;
    input_streams[source_index]->st->discard = input_streams[source_index]->user_set_discard;
}

因此,如果你用 ffmpeg.exe 对一个有多个视频流的文件进行转换,默认只会输出一个视频流。

4, int user_set_discard,命令行选项 -discard 的值,默认是 AVDISCARD_NONE,可选的值在 AVDiscard 枚举里面。

enum AVDiscard{
    
    AVDISCARD_NONE    =-16, ///< discard nothing
    AVDISCARD_DEFAULT =  0, ///< discard useless packets like 0 size packets in avi
    AVDISCARD_NONREF  =  8, ///< discard all non reference
    AVDISCARD_BIDIR   = 16, ///< discard all bidirectional frames
    AVDISCARD_NONINTRA= 24, ///< discard all non intra frames
    AVDISCARD_NONKEY  = 32, ///< discard all frames except keyframes
    AVDISCARD_ALL     = 48, ///< discard all
};

5, int decoding_needed,大于 0 代表输入流需要进行解码操作,有两个值,DECODING_FOR_OST ,DECODING_FOR_FILTER

6, AVCodecContext *dec_ctx,解码器上下文/解码器实例,输入流的 AVPacket 会丢给解码实例进行解码。

7, const AVCodec *dec,解码器信息

8, AVFrame *decoded_frame,从解码器上下文 解码出来的 AVFrame

9, AVFrame *filter_frame,这个字段主要是用来增加引用计数的,可能在调用 av_buffersrc_add_frame_flags() 之后,AVFrame 的引用技术会减一,所以需要先复制一份引用,如下:

10, AVPacket *pkt,从 av_read_frame() 里面读出来的 AVPacket,只是复制了一下引用。

11, int64_t start,记录此流是什么时候开始处理的,主要是给 -re 选项使用的,模拟帧率速度,录制视频模拟直播用的。

12, int64_t next_dts,下一帧的 解码时间,这是通过计算得到的预估值,如果读取出来的 AVPacket 没有 dts ,会用这个值代替。

13, int64_t dts,最近一次从 av_read_frame() 读出来的 AVPacket 的 dts

14, int64_t next_pts,下一个 AVFrame 的 pts,通过当前 AVFrame 的 pts 加上 duration 计算出来的,应该是给一些没有 pts 值的 AVFrame 用的。

15, int64_t pts,最近一次从解码器里面解码出来的 AVFrame 的 pts,记录这个值主要是给 send_filter_eof() 用的,防止回滚。

15, int64_t wrap_correction_done,在一些流格式,例如 TS,会有时间戳环回的问题,int64 是有大小限制的,超过这个大小会环回,ffmpeg.exe 需要处理环回的逻辑。

16, int64_t filter_in_rescale_delta_last,专门给音频帧转换时间基用的,因为音频的连续性太强,如果有些许误差需要保存下来,在下次转换的时候进行补偿。

17, int64_t min_pts, 从 av_read_frame() 读出来的 AVPacket 的最小 pts ,不一定是第一帧的 pts,因为命令行参数通过 -ss 选项,指定从哪里开始处理。

18, int64_t max_pts,从 av_read_frame() 读出来的 AVPacket 的最大 pts ,不一定是最后一帧的 pts,因为命令行参数通过 -t 选项,指定只处理多久的时长。

19, int64_t cfr_next_pts,给 -r 选项用的。

20, int64_t nb_samples,记录的是最近一次解码出来的 AVFrame 里面的 nb_samples。用途我也不清楚,后面补充。

21, double ts_scale,默认值是 1.0,可通过命令行选项 -itsscale 进行改变,主要作用是将 pts ,dts 进行放大,放大的方法是乘以 ts_scale

22, int saw_first_ts,标记是不是已经读取到属于该流的第一个 AVPacket

23, AVDictionary *decoder_opts,从 OptionsContext 里面转移过来的解码器参数。

24, AVRational framerate,命令行选项 -r 的值。

25, int top_field_first,命令行选项 -top 的值,好像是给隔行扫描视频用的。

26, int guess_layout_max,命令行选项 -guess_layout_max 的值,猜测的最大的声道布局。

27, int autorotate,命令行选项 -autorotate 的值,是否插入纠正旋转的 filter 滤镜,有些视频的画面中途会上下旋转,设置这个选项可以自动纠正旋转,不会上下颠倒。

28, int dr1,用 Find Useage 找不到使用这个字段的代码,所以是没用的字段。

29, InputFilter **filters 跟 int nb_filters,输入流绑定的 入口滤镜,可以是绑定多个入口滤镜的,输入流解码出来的 AVFrame 会往多个入口滤镜发送。

30, int reinit_filters,命令行选项 -reinit_filter 的值,0 代表输入信息如果产生变化也不重新初始化 FilterGraph,输入信息产生变化是指 解码出来的 AVFrame 的宽高中途变大或者变小之类的。reinit_filters 默认是 -1,就是会重新初始化 FilterGraph

下面这些都是统计相关的字段。

31, uint64_t data_size,从 av_read_frame() 读出来的 AVPacket 的 size 的总和。也就是统计当前流一共读出出来了多少字节的数据。

32, uint64_t nb_packets,从 av_read_frame() 读出来的 AVPacket 数量的总和。

33, uint64_t frames_decodeduint64_t samples_decoded,从解码器解码出来的 AVFrame 的数量。

34, int64_t *dts_bufferint nb_dts_buffer,我没看懂这两个字段干什么的,可能是旧代码没有删除。

35, int got_output,只要解码器已经解码出一帧 AVFrame,这个字段就会置为 1。

以上就是InputStream数据结构示例解析的详细内容,更多关于InputStream 数据结构的资料请关注编程网其它相关文章!

--结束END--

本文标题: InputStream数据结构示例解析

本文链接: https://www.lsjlt.com/news/170323.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • InputStream数据结构示例解析
    目录正文struct InputStream数据结构定义各个字段的解析正文 struct InputStream 是单个输入流的管理器。是由 add_input_...
    99+
    2022-11-13
    InputStream 数据结构 InputStream 结构
  • Python Pandas数据结构的示例分析
    这篇文章将为大家详细讲解有关Python Pandas数据结构的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 Pandas介绍2008年WesMcKinney开发出的库专门用于数据挖...
    99+
    2023-06-29
  • python数据结构堆的示例分析
    小编给大家分享一下python数据结构堆的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、说明堆是用数据结构来实现的一种算法:树,数组均可。堆本身是一棵完全二叉树。2、特点最大堆:所有父节点的值大于子节点的值最小...
    99+
    2023-06-15
  • Java中数据结构的示例分析
    这篇文章将为大家详细讲解有关Java中数据结构的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.1.1.       增量内存分配 ArrayList 、 Hash...
    99+
    2023-06-03
  • PHP数据结构之图存储结构的示例分析
    这篇文章主要介绍PHP数据结构之图存储结构的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!图的存储结构图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容。如果没有什么问题的话,我们就继续学习接下来的...
    99+
    2023-06-20
  • JavaScript数据结构中串的示例分析
    这篇文章将为大家详细讲解有关JavaScript数据结构中串的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:类似于线性表的顺序存储结构,用一组地址连续的...
    99+
    2022-10-19
  • Python数据结构创建的示例分析
    本篇文章为大家展示了Python数据结构创建的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 列表list:变量赋值方式:shoplist = ['apple', '...
    99+
    2023-06-17
  • Java数据结构中图的示例分析
    这篇文章给大家分享的是有关Java数据结构中图的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。有向图有向图的定义及相关术语定义∶ 有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的...
    99+
    2023-06-29
  • java数据结构之树的示例分析
    这篇文章主要介绍java数据结构之树的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!树定义和基本术语定义树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:(1)有且仅有一个特定的称为根...
    99+
    2023-05-30
    java
  • python数据结构算法的示例分析
    小编给大家分享一下python数据结构算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.算法分析的定义有这样一个问题:当两个看上去不同的程序 解决同...
    99+
    2023-06-22
  • C++数据结构中list的示例分析
    小编给大家分享一下C++数据结构中list的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言list相较于vector来说会显得复杂,它的好处是在任意位置插入,删除都是一个O(1)的时间复杂度。一、list的节点...
    99+
    2023-06-25
  • Java数据结构与算法的示例分析
    这篇文章给大家分享的是有关Java数据结构与算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。第1章 数据结构与算法基础概述1.1 数据结构和算法的重要性算法是程序的灵魂,优秀的程序可以在海量数据计算时...
    99+
    2023-06-29
  • JavaScript数据结构之链表的示例分析
    这篇文章主要为大家展示了“JavaScript数据结构之链表的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript数据结构之链表的示例分析...
    99+
    2022-10-19
  • JS中数据结构之栈的示例分析
    这篇文章给大家分享的是有关JS中数据结构之栈的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且...
    99+
    2022-10-19
  • C++数据结构红黑树的示例分析
    这篇文章给大家分享的是有关C++数据结构红黑树的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念和性质红黑树的概念: 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或...
    99+
    2023-06-29
  • JDK 1.8中HashMap数据结构的示例分析
    这篇文章给大家分享的是有关JDK 1.8中HashMap数据结构的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述JDK 1.8对HashMap361天恒平台制作,进行了比较大的优化,底层实现由之前的“...
    99+
    2023-06-04
  • Java数据结构之链表的示例分析
    小编给大家分享一下Java数据结构之链表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、链表的介绍什么是链表链表是一种物理存储单元上非连续、非顺序的存...
    99+
    2023-06-15
  • Redis中数据结构与数据操作的示例分析
    小编给大家分享一下Redis中数据结构与数据操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis完成数据操作的...
    99+
    2022-10-18
  • ES6中Set和Map数据结构的示例分析
    这篇文章主要介绍了ES6中Set和Map数据结构的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ES6 的 Set:ES6 提供了新...
    99+
    2022-10-19
  • Java数据结构之红黑树的示例分析
    小编给大家分享一下Java数据结构之红黑树的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、红黑树所处数据结构的位置:在JDK源码中, 有treeMap...
    99+
    2023-05-30
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作