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

不过跟打开输入文件一样,都只是创建了编码器实例,但是都还没真正打开编码器

打开编码器是在init_output_stream()函数里面的,如下:

if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {...}

打开解码器是在init_input_stream()函数里面的,如下:

if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) {...}

在讲解open_output_file()函数的逻辑之前,需要先学习struct OutputFile结构,推荐阅读《OutputFile数据结构分析

open_output_file()函数流程图

由于open_output_file()的流程比较长,所以拆成了两列来画,中间的两列其实是一列。

open_output_file()函数的逻辑其实比上面的流程图更加复杂的,有比较多的细枝末节的逻辑,例如一些赋值操作,nb_stream_maps的逻辑,处理 metadata,chapters,programs 的数据等等,这些逻辑其实在简单场景下不会跑进去,所以可以先不管。

我说的简单场景,是指下面这样一条命令。juren-5s.mp4的下载地地址:GitHub

ffmpeg -i juren-5s.mp4 juren-5s-copy.mp4

本章节,大部分的代码分析都是基于简单场景的。

简单场景下,没有使用复杂滤镜的选项-filter_complex,所以只会调init_simple_filtergraph()函数来初始化滤镜。

ffmpeg.exe的转换器就是这么实现的,即便你命令行没有使用滤镜,他也会创建一个空白的滤镜,这是为了让逻辑更加通用。

open_output_file()函数里面有比较多的复杂滤镜的逻辑,通常都是判断nb_filtergraphs是否大于 0,这些逻辑你可以暂时不看。

简单场景下,nb_filtergraphs会是 0 。

open_output_file()函数重点

open_output_file()函数里面有 4 个重点的地方。

第一个重点: 选出最高分辨率的视频流,选出最多声道数的音频流。

如果 mp4 文件有多个视频流,多个音频,ffmpeg.exe转换器会选出最好的那个来进行处理,如下:

第二个重点: new_video_stream()函数的 最后一个参数,如下:

最后一个参数source_index代表输出流对应的输入流,在简单场景下,输出流都是对应一个输入流。

但是在复杂滤镜下,有可能是多个输入流合并输出一个输出流,所以在复杂滤镜下,source_index会设置成 -1,代表没有对应的输入流。

第三个重点初始化简单滤镜,如下:

注意ist->decoding_needed会因此变成 非 0,所以对应的输入流会进行解码操作。

第四个重点: 设置出口滤镜的宽高等等信息,由于出口滤镜出来的AVFrame会进行编码,然后保存进去容器,所以出口滤镜的宽高,采样等等,必须更容器的保持一致。

后面的都是一些简单场景不会跑进去的逻辑,如下:

至此,open_output_file()函数分析完毕。

以上就是FFmpeg Principle学习open_output_file打开输出文件的详细内容,更多关于FFmpeg Principle打开输出文件的资料请关注我们其它相关文章!

(0)

相关推荐

  • 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

  • Android FFmpeg音视频解码播放示例详解

    目录 前言 一丶FFmpeg简介 1.简介 2.FFmpeg两个强大功能 2.1 命令功能 常用参数说明: 二丶FFmpeg音视频解码播放 前言 1.FFmpeg 音视频解码流程 2.FFmpeg 音视频解码原理 2.1.解协议 2.2.解封装 2.3.解码 2.4.音视频同步 2.5.FFmpeg音视频解码 3.FFmpeg接口使用 三丶Clang编译FFmpeg常见问题 1.命令找不到 2.xmakefile 文件没有生成 3.arm-linxu-androideabi-gcc is una

  • 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

  • 详解node服务器中打开html文件的两种方法

    本文介绍了详解node服务器中打开html文件的两种方法,分享给大家,具体如下: 方法1:利用 Express 托管静态文件,详情查看这里 方法2:使用fs模块提供的readFile方法打开文件,让其以text/html的形式输出. 代码: var express = require('express'); var fs=require("fs"); var app = express(); //方法1:通过express.static访问静态文件,这里访问的是ajax.html //

  • 从零学习node.js之文件操作(三)

    一.文件操作 在文件操作里,主要是有文件读写,创建.移动文件等. 1.1 读取文件 读取文本文件时,如.txt, .js, .json等文件,直接使用readFile就可以获取文件的内容. // server.js var fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){ if(err) throw err; console.log(data); }); 读取图片时,我们是不能直接输出到控制台中

  • c#打开py文件的方法

    每个编程语言都有它的优势,那么我们如何在一个语言中使用其他编程语言的代码,并完成工作呢?今天我就用C#打开py文件,不调用py的方法.程序执行的效果如下图 1.在百度上搜索"ironpython官网",选择ironpython. 2.进入官网后选择Download下载,下载资源. 3.选择要下载的文件,下载到本地磁盘.我存储在了F盘下的迅雷下载. 4.下载完成,在我们存储的路径中找到刚下载的文件,单击打开,进入安装向导界面. 5.同意上面的文件. 6.设置软件安装的位置,这里我就使用了

  • Redis打开rdb文件常用方法详解

    阿里云的redis 备份后为 rdb 文件,那么如何使用本地redis 打开rdb 文件呢? windows上操作方法整理 方法一: windows 安装的 redis 目录下,有个dump.rdb 文件 先把原来的备份,再把要打开的xxx.rdb文件命名成 dump.rdb 然后运行 redis-server.exe 就打开了 再运行 redis-cli.exe 就可以命令访问了 方法二: 在redis.windows.conf 文件中修改配置,搜索dbfilename, 把dump.rdb

  • 什么是ASP?如何打开ASP文件

    ASP是基于WEB的一种编程技术,可以说是CGI的一种.它可以完成以往CGI程序的所有功能,如计数器.留言簿.公告板.聊天室等等.ASP可以轻松地实现对页面内容的动态控制,根据不同的浏览者,显示不同的页面内容.而浏览者一点觉察不出来,就像为他专门制作的页面一样.使用各种各样的组件,ASP可以完成无比强大的功能.使用FileSystemObject,可以对服务器上的文件进行操作,浏览.复制.移动.删除等.有ADO(Active Database Object,动态数据库对象)的支持,ASP对数据库

  • 怎样打开XML文件?xml文件如何打开?

    可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输.XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据. 格式特性 XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引.排序.查

  • 什么是PHP文件?如何打开PHP文件?

    在平时我们可能会碰到过php文件,可是很多用户不知道php文件是什么文件?也不知道怎么打开php文件?为了满足一些用户的好奇心,小编现在就给大家讲解php文件以及如何打开php文件的方法. 1.PHP文件是什么? PHP(Hypertext Preprocessor)超文本预处理器,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用于互联网开发,学习起来比较容易! PHP语法混合了 C.java.Perl 以及 PHP 自创的语法.(可以看php与java比

  • Vim中文件编码处理与重新打开乱码文件详解

    前言 Vim 中有两个与编码有关的变量,如果理解了基本就不会再为编码问题头疼了. encoding  :Vim 内部编码,例如 buffer.寄存器.文本等.这个值一般用户不要设置,另外打开 Vim 之后再设置这个值也是没有意义的.大家可以将这个值看作是 Vim 程序自己的变量,如果在工作中遇到文件的编码问题,和 encoding  这个变量是万万没有关系的. fileencoding  :顾名思义了,就是文件的编码. 此外还有一个值,叫 fileencodings 是个复数.一般我们将这个值在

随机推荐