ffmpeg的学习-00

  1. 命令行 大体样式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

有道翻译的 以后仔细回看
2.描述
ffmpeg是一个非常快的视频和音频转换器,也可以从一个实时音频/视频源抓取。它还可以转换之间的任意采样率和调整大小的视频在飞行与高品质多相滤波器。
ffmpeg读取由-i选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、抓取设备等),并写入由普通输出url指定的任意数量的输出“文件”。在命令行中发现的任何不能解释为选项的内容都被认为是输出url。
原则上,每个输入或输出url可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可能受到容器格式的限制。选择哪个输入流将自动进入哪个输出流,或者使用-map选项(请参阅流选择章节)。
要引用选项中的输入文件,必须使用它们的索引(基于0)。例如,第一个输入文件是0,第二个是1,等等。类似地,文件中的流也由它们的索引引用。2:3是指第三个输入文件中的第四个流。还请参阅流说明符一章。
通常,选项应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每个事件应用到下一个输入或输出文件。这个规则的例外是全局选项(例如冗长级别),应该首先指定它。
不要混合输入和输出文件-首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项只适用于下一个输入或输出文件,并在文件之间重置。
To set the video bitrate of the output file to 64 kbit/s:
将输出文件的视频比特率设置为64 kbit/s:

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

To force the frame rate of the output file to 24 fps:
强制输出文件帧率为24帧/秒:

ffmpeg -i input.avi -r 24 output.avi

To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:
强制输入文件的帧速率(只适用于原始格式)为1帧,输出文件的帧速率为24帧:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

???只适用于原始格式 不理解???
对于原始输入文件,可能需要format选项。
3.详细描述
ffmpeg中每个输出的转码过程如下图所示:

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+
|_______|            |______________|      |v_________|         || decoded || frames  ||_________|________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+
| file   |   muxer   | packets      |   encoder
|________|           |______________|

???decoded frames 这里不明白???

ffmpeg调用libavformat库(包含demuxers)来读取输入文件并从其中获取包含编码数据的包。当有多个输入文件时,ffmpeg试图通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。
???最低时间戳 什么概念 是不是最后的????
然后将经过编码的包传递给解码器(除非为流选择streamcopy,否则请参阅进一步的描述)。解码器产生未压缩的帧(原始视频/PCM音频/…),可以通过过滤进一步处理(参见下一节)。过滤后,帧被传递给编码器,编码器对帧进行编码并输出编码后的数据包。最后,它们被传递给muxer, muxer将经过编码的包写入输出文件。
3.1过滤
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链接过滤器形成一个过滤器图。ffmpeg区分了两种过滤图:简单过滤图和复杂过滤图。
3.1.1 简单过滤器图
简单的过滤器图是那些只有一个输入和输出的过滤器,它们都属于同一类型。在上图中,只要在解码和编码之间插入一个额外的步骤,就可以表示为:

|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|\   __________   /simple     _\||          | /  encoderfiltergraph   | filtered |/| frames   ||__________|

简单的过滤器图配置为每流过滤器选项per-stream -filter option (分别为视频和音频配置-vf和-af别名)。一个简单的视频过滤图可以像这样:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

注意,有些过滤器改变帧属性,但不改变帧内容。例如,上面例子中的fps过滤器会改变帧数,但不会触及帧内容。另一个例子是setpts过滤器,它只设置时间戳,并以其他方式不变地传递帧。
3.1.2 复杂过滤器图
复杂的过滤图不能简单地描述为应用于一个流的线性处理链。例如,当图形有多个输入和/或输出时,或者当输出流类型与输入不同时,就会出现这种情况。它们可以用下图表示:

 _________
|         |
| input 0 |\                    __________
|_________| \                  |          |\   _________    /| output 0 |\ |         |  / |__________|_________     \| complex | /
|         |     |         |/
| input 1 |---->| filter  |\
|_________|     |         | \   __________/| graph   |  \ |          |/ |         |   \| output 1 |_________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

复杂过滤器图配置为-filter_complex选项。注意,这个选项是全局的,因为复杂的过滤器图本质上不能与单个流或文件明确关联。
-lavfi选项相当于-filter_complex。
复杂过滤图的一个简单示例是overlay filter,它有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。它的音频对应项是amix过滤器。
3.2 Stream copy
流复制是通过向-codec选项提供复制参数来选择的模式。它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和muxing。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上面的图表将简化为:

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

由于没有解码或编码,它是非常快的,没有质量损失。然而,由于许多因素,它可能在某些情况下不起作用。应用过滤器显然也是不可能的,因为过滤器处理未压缩的数据。
4. Stream selection
ffmpeg为手动控制每个输出文件中的流选择提供了-map选项。用户可以跳过映射,并让ffmpeg执行如下所述的自动流选择。可以使用-vn / -an / -sn / -dn选项分别跳过视频、音频、字幕和数据流的包含,无论是手动映射还是自动选择,但那些流是复杂过滤图的输出。
4.1 描述
下面的子部分描述了在流选择中涉及的各种规则。下面的示例将展示如何在实践中应用这些规则。
虽然已经尽了一切努力来准确地反映程序的行为,但是FFmpeg还在不断地开发中,而且代码可能在编写本文时就已经更改了。
4.1.1 Automatic stream selection
在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式,以检查可以包含哪种类型的流,即视频、音频和/或字幕。对于每个可接受的流类型,ffmpeg将在所有输入中选择一个可用的流。
它将根据以下标准选择该流:
对于视频,它是分辨率最高的流,
对于音频,它是拥有最多频道的流,
对于字幕,这是第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只选择相同类型的字幕流。
在相同类型速率的多个流相同的情况下,选择索引最低的流。
数据或附件流不会自动选择,只能使用-map包含。
4.1.2 Manual stream selection
当使用-map时,该输出文件中只包含用户映射的流,下面描述的filtergraph输出可能有一个例外。
4.1.3 Complex filtergraphs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Linux]消息队列

我们知道进程间通信的方法有多种&#xff0c;主要有管道&#xff0c;消息队列&#xff0c;信号量&#xff0c;共享内存&#xff0c;socket等。之前介绍过管道&#xff0c;今天再介绍一个新的概念–消息队列。 消息队列&#xff1a;将一个进程到另一个进程之间发送数据块的方式…

详解centos7 YCM YouCompleteMe自动补全安装,亲测成功

文章经重新排版转移至以下链接 https://blog.csdn.net/csdn_kou/article/details/84633663

python 异步与io

文档地址&#xff1a; https://docs.python.org/zh-cn/3/library/asyncio.html 以后再记录学习笔记 待续。。。

tornado 学习注意事项--00

设置url匹配的时候&#xff0c; (r/(.*), AMStaticFileHandler,dict(pathos.path.join(current_path, html), default_filenameindex.html))像这种语句要放到最后&#xff0c;因为放到前面的话&#xff0c; 后面的就无法匹配&#xff01;

C++关键字速查手册

[TOC] https://blog.csdn.net/csdn_kou/article/details/81113215 C98关键字 C11 关键字共73个 alignas alignof用于获取取指定表达式指定的&#xff08;类似sizeof&#xff0c;可以直接是类型名&#xff09;的对齐(alignment)。alignas用于声明时指定对齐类似于现有的类型…

[Linux]信号

Linux下的信号是一个什么概念呢。我们在现实生活中也遇到过信号之类的。比如红绿信号灯&#xff0c;班主任叫你去办公室并且脸色不好&#xff0c;诸如此类的都会给你一个信号。让你辨别事情的发生。同样&#xff0c;Linux下也有许多的信号&#xff0c;让你执行相应的操作。比如…

怎么用VLC播放器将m3u8链接视频下载到本地

转载 https://blog.csdn.net/saddyyun/article/details/85245135

【1】C++面试题函数引用重载宏命名空间

函数重载的条件 • 同一个名字 • 函数名字相同 • 参数列表不同 • 同一个作用域 为什么c支持函数重载而c不支持&#xff1f; c函数名字的修饰规则不一样。c编译器对函数修饰规则把int的参数列表形式加了进来&#xff0c;从而保证底层使用不同 cAdd(int a,int b)_AddcA…

[数据结构]Map和Set

说起map和set&#xff0c;想必我们都学过红黑树了吧&#xff0c;map和set就是红黑树的一个应用领域。它的底层就是由红黑树来实现的。下面简单说一下map和set的使用吧。 首先&#xff0c;有一个栗子是这样的&#xff0c;让我们统计出每种水果出现的次数。 我们会想到怎么解决…

js获取Json对象的长度

有两种Json形式&#xff1a; 第一种&#xff1a; var json1 {"data":[{"name":"zs","age":"10"}]};对于这种格式的json数据&#xff0c;如果想获取data的长度&#xff0c;就可以用以下这种方式&#xff1a; var length …

生产者消费者模型(条件变量)

三种关系&#xff1a;互斥&#xff0c;同步&#xff0c;互斥和同步 两类角色:生产者&#xff0c;消费者&#xff08;线程&#xff09; 一个交易场所&#xff1a;生产者消费者共享的区域 卖苹果的模型 dish上面只有一个苹果买家必须要等卖家把苹果放到dish上才可以去买苹果。…

linux之信号

信号&#xff1a;在生活中&#xff0c;我们遇到过不同种类的信号&#xff0c;比如&#xff1a;&#xff08;交通信号&#xff0c;乃至某个人的表情&#xff0c;动作等带给你不同的信号&#xff09;然而&#xff0c;在我们的linux下&#xff0c;我们最熟悉的就是&#xff0c;当遇…

视频解析有感,在解析 iqiyi与qq视频的时候,记录一些发现

最近对iqiyi与qq视频解析发现&#xff0c;两个网站的解析流程&#xff0c;尤其是反解析措施 各有特点&#xff0c;简单记录一下 先说iqiyi&#xff0c; 浏览器模拟移动端可以拿到视频的mp4链接&#xff0c;这个不多说。 iqiyiPC端浏览器获取 ts过程&#xff1a; a.iqiyi一次性…

C语言atoi函数的用法

#include < stdlib.h > int atoi(const char *nptr);用法&#xff1a;将字符串里的数字字符转化为整形数。返回整形值。 注意&#xff1a;转化时跳过前面的空格字符&#xff0c;直到遇上数字或正负符号才开始做转换&#xff0c;而再遇到非数字或字符串结束时(’/0’)才…

[Linux]继续探究mysleep函数(竞态条件)

之前我们探究过mysleep的简单用法&#xff0c;我们实现的代码是这样的&#xff1a; #include<stdio.h> #include<signal.h>void myhandler(int sig) {}unsigned int mysleep(unsigned int timeout) {struct sigaction act,oact;act.sa_handler myhandler;sigempt…

C语言的atoi和C++的to_string

to_stringint to string将其他型转换成字符串型atoiascii to integer是把字符串转换成整型数的一个函数 to_string #include <iostream> // std::cout #include <string> // std::string, std::to_stringint main () {std::string perfect std::to_string…

ubuntu 升级python3.5到python3.7,并升级pip3

1, 下载python3.7.tgz 文件&#xff0c;解压&#xff0c; 2. 编译安装 3. 删除 /usr/bin 目录下的 pip3, python3 4. 建立新的软连接&#xff1a; #添加python3的软链接ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3#添加 pip3 的软链接ln -s /usr/local/python3/b…

[Linux]死锁

死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局&#xff0c;当进程处于这种僵持状态时&#xff0c;若无外力作用&#xff0c;它们都将无法再向前推进。之前信号量的时候我们知道&#xff0c;如果多个进程等待&#xff0c;主要体现在占有锁的问题上。死锁也可以被定义…

Python安装第三方模块总结 转载的

转自 https://www.jellythink.com/archives/541

[C++]vector创建二维数组

c.resize(n);将c重置为大小为n个元素向量&#xff0c;如果n比原来的元素多&#xff0c;则多出的元素常被初始化为0//节选《面向对象的程序设计》杜茂青 int N5, M6; vector<vector<int> > Matrix(N); for(int i 0; i< Matrix.size(); i){ Matrix[i].resize(M…