ffmpeg文档03-详细说明

news/2024/7/10 20:57:50 标签: ffmpeg

3 详细说明

ffmpeg的每个转换过程像下图描述的程序

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

ffmpeg调用libavformat库(含分离器)读取输入文件,分离出各类编码的数据包(流),当有多个输入文件时,ffmpeg试图跟踪最低时间戳实现任意输入流同步。编码数据包(除非是指定为流式拷贝,相关内容请参考特性描述对流式拷贝的说明)通过解码器解码出非压缩的数据帧(raw视频/PCM格式音频...),这些数据帧可以被滤镜进一步处理(下面会讲到)。经过滤镜处理的数据被重新编码为新的数据包(流),然后经过混合器混合(例如按一定顺序和比例把音频数据包和视频数据包交叉组合),写入到输出文件。

滤镜处理/Filtering

在编码前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的滤镜进行处理。多个滤镜可以组成滤镜链图(滤镜链图filtergraphs )。在ffmpeg看来只有2种滤镜:简单滤镜,复合滤镜。

简单滤镜

简单滤镜就是只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的,可以理解为在非压缩数据帧到再次编码前简单附加了一步:

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

简单滤镜一般用于配置每个流 -filter 选项(-vf 和 -af 分别对应视频和音频)。一个最简单的视频滤镜如下:

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

注意一些滤镜改变帧属性而不是帧内容。例如前面提到的fps滤镜就只是引起帧率的变化,但不处理帧内容,另外一个例子是setpts则仅仅设置时间戳,通过滤镜的帧内容完全不变化。

复合滤镜

复合滤镜是那些不能简单描述为一个线性处理过程应用到一个流的情况,例如当过程中有多个输入和/或输出,或者输出流类型不同于输入时,示意图如下:

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

复合滤镜由-filter_complex选项进行设定。注意这是一个全局选项,因为一个复合滤镜必然是不能只关联到一个单一流或者文件的。-lavfi选项等效于-filter_complex

一个复合滤镜的简单例子就是overlay滤镜,它从两路输入中,把一个视频叠加到一个输出上。对应的类似音频滤镜是amix

流拷贝

流拷贝(Stream copy)是一种对指定流数据仅仅进行复制的拷贝(copy)模式。这种情况下ffmpeg不会对指定流进行解码和编码步骤,而仅仅是分离和混合数据包。这种模式常用于文件包装格式的转换或者修改部分元数据信息,这个过程简单图示如下:

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

因为这种模式下不存在解码和编码过程,所以也特别快,而且不会造成新的质量损失。然而这也使得这样的模式不能适合很多工作需求,例如这个模式下不能使用大量的滤镜了,因为滤镜仅能对未压缩(编码)的数据进行处理。

转载于:https://www.cnblogs.com/xdsnet/p/5196046.html


http://www.niftyadmin.cn/n/1810605.html

相关文章

android中asynctask的使用实例

参考此blog写的非常的好http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html MainActivity.java 1 import android.support.v7.app.AppCompatActivity;2 import android.os.Bundle;3 import android.view.View;4 import android.widget.Button;5 import androi…

eclipse配置python运行环境_Eclipse配置python开发环境过程图解

1、下载python 安装包.python-2.6.6.msi.并安装。 默认python会安装在C:\Python26下&#xff0c;查看环境变量&#xff0c;如果没有在path路径中写入则手动添加。打开一个dos窗口&#xff0c;验证python是否安装成功&#xff1a; C:\Documents and Settings\Administrator>p…

java redis 库_Java后端--25--内存数据库Redis讲解

一、Redis简介redis是Nosql数据库中使用较为广泛的非关系型内存数据库&#xff0c;redis内部是一个key-value存储系统。它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型&#xff0c;类似于Java中的map)。…

不得不去奋斗的原因

一、 为了生存 人人都想讨饭&#xff0c;个个都得饿死。路上坑愈坑&#xff0c;人间贫愈贫。满足过去将失去现在&#xff0c;满足现在将失去将来。春天不耕耘&#xff0c;秋天将无粮。 人家都在飞奔&#xff0c;你若停滞不前&#xff0c;就是在大倒退。在奔跑的人群中&#xff…

牛B的vim编辑器使用

从csdn上看到的&#xff0c;分享在这里&#xff0c;大家可以好好学习学习&#xff01; http://blog.csdn.net/namecyf/article/details/7787479 转载于:https://www.cnblogs.com/farbeyond/p/5196781.html

php 半角全角,php 全角半角正则表达式代码

正则表达式代码//$keyword破坏;//当值为破坏时可以加上超连接$keyword真皮层;//当值为直皮层时则不能匹配加上招连接$urlwww.jquerycn.cn;$content激光光束透过表皮和真皮层&#xff0c;破坏色素细胞和色素颗粒;$content preg_replace( |(?<[^&])(.$keyword.)(?[^&am…

MySQL-分库分表详解(三)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

python中的装饰器、装饰器模式_python-装饰器模式

说明&#xff1a; 有时为了给某个对象而不是给整个类添加一个功能&#xff0c;使用继承机制是添加功能的一个有效途径&#xff0c;但是不够灵活&#xff0c;用户不能控制对组件加边框的方式和时机&#xff0c;并且会导致子类膨胀。一种较为灵活的方式就是将组件嵌入另一个对象中…