init output stream初始化输出流源码分析
作者:Loken1 发布时间:2023-01-08 09:53:20
init_output_stream()
是一个公共的函数,无论是音频,还是视频的输出流的初始化,都是通过它来完成的。
init_output_stream()
上面还会套一个 wrapper
,主要是做一些简单的封装,例如已经初始化了,就直接返回,代码如下:
音频 OutputStream初始化
音频 OutputStream
的初始化主要有两个地方。
1, 如果是 stream copy,不进行编解码,就是在 transcode_init()
里面如下:
从上图可以看到,如果不进行编解码,音频,视频的输出流,都是在 transcode_init()
里面初始化的。
2, 滤镜模式,进行了编解码,就是在 reap_filter()
里 初始化音频的输出流的,如下:
音频的输出流可以在未从滤镜读取到 AVFrame
的时候就开始初始化,而视频的输出流的初始化,需要从滤镜拿到 AVFrame
之后才能初始化,视频的初始化是在 封装在do_video_out()
函数里面的。
至于为什么音频输出流需要提前初始化,可以看一下他的注释,我没细看。
init_output_stream()
函数其实没有太多的重点,主要就是设置编码器参数,然后打开编码器,再设置一下 OutputStream
的一些字段,就初始化完成了。
不过 OutputStream
有一个字段特别重要,就是 initialized
,如下:
这个 initialized
特别重要,只有输出文件里面的所有输出流,包括音频跟视频流,他们的 initialized 都是 1,才能调 avformat_write_header()
函数写入头部信息,
因为 init_output_stream()
会对 AVStream
设置一些信息,例如编码信息等等。
必须设置完这些信息,initialized
全部都是 1,才能调 avformat_write_header()
。
因此,如果音频输出流没初始化完成,那视频流的 AVPacket
就不能写入文件,必须先写到队列缓存下来,如下:
init_output_stream() 函数流程图
来源:https://juejin.cn/post/7160400432274571277


猜你喜欢
- 前言项目中时不时遇到查字典表等数据,只需要返回数据,不需要写其他业务,每个字典表可能都需要写一个接口给前端调用,比较麻烦,所以采用下面这种方
- 废话不多说了,直接给大家贴代码了,具体代码如下所述:package com.example.esp8266;import java.io.I
- 1.问题在MyBatisPlus中经常会用到如下所示的代码来构造查询条件:QueryWrapper<User> queryWra
- 全面总结Android Service的使用方法,具体内容如下1、Service的种类按运行地点分类:其实remote服务还是很少见的,并且
- 时间戳转换:/// <summary>/// C#时间格式转换为时间戳(互转)/// 时间戳定义为从格林威治时间 1970年01
- spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境。可是当我们要同时启动2个spri
- 单个字符分割 string s="abcdeabcdeabcde"; string[]
- OpenFeign介绍一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们
- Android 帧动画的实例详解对于 Android 帧动画 大体上可以理解成 一张张图片 按一定顺序切换, 这样当连续几张图是一组动画时,
- 使用工具:Android studio 3.0使用方法:一:在build.gradle(Module:app)中添加依赖implementa
- 这篇文章主要介绍了SpringMVC Mybatis配置多个数据源并切换代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- 黑白棋介绍黑白棋,又叫苹果棋,最早流行于西方国家。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。黑白棋非常易于上手,但精通则
- 笔者语录: 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧。过滤器简介:简介logba
- 默认格式public class MyClass implements Serializable{...}序列化:ObjectOutputS
- Java 多线程方法详解startstart方法 启动线程 在start方法中调用start0方法,而start0是一个
- 开发环境 android studio 3.0.1 已支持 kotlin1、定义接口interface CallBack{ fun call
- C# FileStream类在 C# 语言中文件读写流使用 FileStream 类来表示,FileStream 类主要用于文件的读写,不仅
- 上篇博客我们了解了请求参数的获取,那么获取到请求参数之后,需要对参数进行出来,然后进行数据响应。那么这篇博客我们就来了解 Controlle
- 本文借由并发环境下使用线程不安全的SimpleDateFormat优化案例,帮助大家理解ThreadLocal.最近整理公司项目,发现不少写
- 文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成