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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java异常处理之try...catch...finally详解
![](https://img.aspxhome.com/file/2023/5/62405_0s.png)
Java语言实现简单FTP软件 FTP上传下载队列窗口实现(7)
![](https://img.aspxhome.com/file/2023/3/63343_0s.png)
MyBatis在SQL语句中如何获取list的大小
详解Android OkHttp完全解析
Java数据结构之双向链表图解
![](https://img.aspxhome.com/file/2023/4/88194_0s.jpg)
Spring boot+beetl+i18n国际化处理的方法
![](https://img.aspxhome.com/file/2023/5/66685_0s.png)
Java中双大括号初始化的理解与使用
java去除字符串中的空格、回车、换行符、制表符的小例子
C#的String和StringBuilder详解
![](https://img.aspxhome.com/file/2023/4/98174_0s.gif)
MybatisPlus #{param}和${param}的用法详解
JavaFX实现UI美观效果代码实例
![](https://img.aspxhome.com/file/2023/6/62206_0s.jpg)
Spring Cloud Eureka 服务上下线监控的实现
使用SpringBoot开发Restful服务实现增删改查功能
![](https://img.aspxhome.com/file/2023/8/61658_0s.png)
java使用归并删除法删除二叉树中节点的方法
JavaWeb入门教程之分页查询功能的简单实现
Idea 搭建Spring源码环境的超详细教程
![](https://img.aspxhome.com/file/2023/9/132059_0s.jpg)
Android 中在有序广播中添加自定义权限的实例
asp.net实现遍历Request的信息操作示例
![](https://img.aspxhome.com/file/2023/3/126053_0s.png)
Unity Shader片段着色器使用基础详解
![](https://img.aspxhome.com/file/2023/2/106372_0s.png)
Android框架组件Lifecycle的使用详解
![](https://img.aspxhome.com/file/2023/9/91039_0s.png)