FFmpeg Principle分析Out put File 数据结构

目录
  • struct OutputFile
  • struct OutputFile 字段解析

struct OutputFile

struct OutputFile 是单个输出文件的管理器。之前在 parse_optgroup() 处理好的 OptionsContext o 变量,有一部分字段会赋值给 OutputFile 管理器

如下:

OptionsContext o 变量的另一部分字段,会在 open_output_file() 里面传递给 API 函数,例如:avformat_write_header(),或者赋值给 OutputStream 的一些字段。

ret = avformat_write_header(of->ctx, &of->opts);

output_files 全局变量是一个数组,里面的成员正是 OutputFile,所以你在二次开发 ffmpeg.exe 的时候,可以通过 output_files 全局变量获取到所有的输出文件的信息。

OutputFile   **output_files   = NULL;
int         nb_output_files   = 0;

我们接下来仔细学习一下 struct OutputFile 的结构,如下:

typedef struct OutputFile {
    AVFormatContext *ctx;
    AVDictionary *opts;
    int ost_index;       /* index of the first stream in output_streams */
    int64_t recording_time;  ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
    int64_t start_time;      ///< start time in microseconds == AV_TIME_BASE units
    uint64_t limit_filesize; /* filesize limit expressed in bytes */
    int shortest;
    int header_written;
} OutputFile;

相比 InputFileOutputFile 数据结构的字段简直太少了,读起来太爽了。

struct OutputFile 字段解析

1, AVFormatContext *ctx,容器上下文,也叫容器实例。

2, AVDictionary *opts,容器格式的参数,是从 OptionsContext 里面 的 OptionGroup 的 format_opts 复制过来的,如下:

av_dict_copy(&of->opts, o->g->format_opts, 0);

opts 会传递给 avformat_write_header() 函数,如下:

ret = avformat_write_header(of->ctx, &of->opts);

3, int ost_index,输出文件的第一个流在 output_streams 数组里面的索引,output_streams 数组是一个全局变量,里面包含所有输出文件的所有输出流。你二次开发 ffmpeg.exe 的时候,可以使用 output_streams 数组,获取到所有的输出流。

4, int64_t recording_time,命令行选项 -t 的值,设置输出文件的时长,单位是微秒,具体的功能是通过 trim 滤镜来实现的。

5, int64_t start_time,标记输出文件的开始时间,例如一个输入文件本来是 6 分钟的,你可以用 -ss 120 指定 start_time,这样,输出文件就会裁剪成 第 2 ~ 6分钟 的视频,前面 2 分钟丢弃。

6, uint64_t limit_filesize,限制输出文件的大小,一旦达到这个大小,输出文件立即结束。

7, int shortest,命令行选项 -shortest 的值,当最短的输出流结束的时候,整个文件就结束了,例如一个输出文件里面有 音频流 跟 视频流,视频流 3 分钟,音频流 5 分钟。如果启用了这个选项,音频流就会被裁剪成 3 分钟。

8, int header_written,是否已经调用了 avformat_write_header() 函数,往输出文件写入了头部信息。

以上就是FFmpeg Principle分析Out put File 数据结构的详细内容,更多关于Out put File 数据结构的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java中FileOutputStream流的write方法

    本文为大家分享了FileOutputStream流的write方法,供大家参考,具体内容如下 /*------------------------ FileOutputStream: ....//输出流,字节流 ....//write(byte[] b)方法: 将b.length个字节从指定字节数组写入此文件输出流中 ....//write(byte[] b, int off, int len)方法:将指定字节数组中从偏移量off开始的len个字节写入此文件输出流 ---------------

  • FFmpeg Principle学习new_video_stream添加视频输出流

    目录 new_video_stream() 函数流程 流程图 原因解析 滤镜出口里面获取宽高 new_video_stream() 函数流程 new_video_stream() 函数的流程相对来说比较简单,主要的逻辑如下: 1, 调 new_output_stream() 函数来创建 OutputStream 输出流,以及 AVCodecContext 编码器上下文. new_output_stream() 是一个公共函数,创建 音频流,数据流,字幕流都用了它. new_output_stre

  • Android编程中FileOutputStream与openFileOutput()的区别分析

    本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. public void save() { try { FileOutputStream outStream=this.openFileO

  • java中FileOutputStream中文乱码问题解决办法

    java中FileOutputStream中文乱码问题解决办法 使用FileOutputStream序列化可以直接向文件写入文本内容,代码如下: FileOutputStream outStream = new FileOutputStream(file); outStream.write(str.getBytes()); outStream.close(); 但这里的字符串如果包含中文,就会出现乱码,这是因为FileOutputStream是字节流,将文本按字节写入文件,而一个汉字是两个字节,

  • FFmpeg Principle学习open_output_file打开输出文件

    目录 open_output_file()打开输出文件流程 open_output_file()函数流程图 open_output_file()函数重点 open_output_file()打开输出文件流程 open_output_file()打开输出文件的流程,跟open_input_file()打开输入文件的流程是非常类似的. 都是创建一个文件管理器,输出的文件管理器是struct OutputFile,然后添加输出流OutputStream,创建编码器上下文ost->enc_ctx. 不过

  • FFmpeg Principle分析Out put File 数据结构

    目录 struct OutputFile struct OutputFile 字段解析 struct OutputFile struct OutputFile 是单个输出文件的管理器.之前在 parse_optgroup() 处理好的 OptionsContext o 变量,有一部分字段会赋值给 OutputFile 管理器 如下: OptionsContext o 变量的另一部分字段,会在 open_output_file() 里面传递给 API 函数,例如:avformat_write_he

  • Python cookbook(数据结构与算法)保存最后N个元素的方法

    本文实例讲述了Python保存最后N个元素的方法.分享给大家供大家参考,具体如下: 问题:希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计 解决方案:选择collections.deque. 如下的代码对一系列文本行做简单的文本匹配操作,当发现有匹配时就输出当前的匹配行以及最后检查过的N行文本: from collections import deque def search(lines, pattern, history=5): previous_lines = deq

  • python整合ffmpeg实现视频文件的批量转换

    转换工具层出不穷,ffmpeg才是全能的转换工具,只是不支持图形操作. 没有关系,命令行方式,在freebsd/linux下直接来 我们的思路是,设定一个文件夹存放源视频文件,python读取该文件夹下的全部文件,并对文件通过ffmpeg进行分析,根据需要,修改目标文件的编码.分辨率等等,调用ffmpeg转换. 我这次的需求是,我家液晶电视只支持分辨来,长宽均小于720,编码只支持divx/xvid的avi文件,且fps只能小于25--多次实践,才总结出来的,电视说明书也没说!! 下面的程序将

  • C#中File类的文件操作方法详解

    本文实例讲述了C#中File类的文件操作方法.分享给大家供大家参考.具体分析如下: File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件.File类方法的参量很多时候都是路径path.File的一些方法可以返回FileStream和StreamWriter的对象.可以和他们配套使用. System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用S

  • Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例

    本文实例讲述了python从任意长度的可迭代对象中分解元素操作.分享给大家供大家参考,具体如下: 从某个可迭代对象中分解出N个元素,但是可迭代对象的长度可能超过N,会出现"分解值过多"的异常: 使用"*表达式"来解决该问题: Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 Type "copyright",

  • Python cookbook(数据结构与算法)将序列分解为单独变量的方法

    本文实例讲述了Python cookbook(数据结构与算法)将序列分解为单独变量的方法.分享给大家供大家参考,具体如下: 如果对象是可迭代的(任何序列),则可以进行分解操作,包括元组.列表.字符串.文件.迭代器以及生成器,可通过简单的一个赋值操作分解为单独的变量. 唯一要求:变量的总数和序列相吻合,否则将出错: Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on wi

  • Python cookbook(数据结构与算法)从字典中提取子集的方法示例

    本文实例讲述了Python从字典中提取子集的方法.分享给大家供大家参考,具体如下: 问题:想创建一个字典,其本身是另一个字典的子集 解决方案:利用字典推导式(dictionary comprehension)可轻松解决 # example of extracting a subset from a dictionary from pprint import pprint prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ':

  • Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法

    本文实例讲述了Python将多个映射合并为单个映射的方法.分享给大家供大家参考,具体如下: 问题:在逻辑上将多个字典或映射合并为一个单独的映射结构,以此执行某些特定的操作,比如查找值或者检查键是否存在 解决方案:利用collections模块中的ChainMap类 ChainMap可接受多个映射然后在逻辑上使它们表现为一个单独的映射结构.这些映射在字面上并不会合并在一起.相反,ChainMap只是简单地维护一个记录底层映射关系的列表,然后重定义常见的字典操作来扫描这个列表. # example.

  • ArrayList源码和多线程安全问题分析

    1.ArrayList源码和多线程安全问题分析 在分析ArrayList线程安全问题之前,我们线对此类的源码进行分析,找出可能出现线程安全问题的地方,然后代码进行验证和分析. 1.1 数据结构 ArrayList内部是使用数组保存元素的,数据定义如下: transient Object[] elementData; // non-private to simplify nested class access 在ArrayList中此数组即是共享资源,当多线程对此数据进行操作的时候如果不进行同步控

随机推荐