一、概述

在FFmpeg命令行工具系列一中,对FFmpeg的命令行工具FFmpeg.exe进行了简单的介绍,并举出了几个简单的例子。在这一章中,将进行一次详细的介绍,主要是对转码过程和过滤器进行介绍。

二、主要内容

ffmpeg转码的流程可以用下图进行说明:

ffmpeg调用libavformat库(该库包含解复用工具)来读取输入文件,并获取编过码的数据包。当有多个输入文件时,ffmpeg通过跟踪活动的输入流的最低的时间戳保证同步。编过码的数据包被传送给解码器(流复制不需要解码,见后文),解码器产生解码后的数据帧(raw 视频/PCM 音频/...),这些数据帧然后通过过滤器进行过滤。过滤之后,数据帧被传送给编码器进行编码,然后对编码后的数据包进行复用,写到输出文件中去。这就是转码的整个流程。

1.过滤

在编码之前,ffmpeg可以利用libavfilter库中的过滤器对数据帧进行过滤。几个链式的过滤器组成了一个过滤器图表(本人翻译水平不高,这句话不知道有没有更好的翻译,意思是一个filter graph包含多个线性操作的filter,它们按顺序一个一个起作用)。ffmpeg有两种类型的过滤器图表:简单过滤器和复杂过滤器。

1.1简单过滤器

在简单过滤器中,只包含一个输入和一个输出,并且输入输出是同一类型。在下面的处理过程中,仅仅是在解码和编码之间加上一个额外的过滤步骤。

简单过滤器由per-stream-filter参数(视频为-vf,音频为-af)配置。一个用于处理视频的简单过滤器大概是这个流程:

一些过滤器只改变数据帧的属性,并不改变数据帧的内容。例如:fps过滤器改变数据帧的个数,并不涉及数据帧的内容。另一个例子是setpts过滤器,它仅仅改变时间戳然后传递这些数据帧而已。

1.2复杂过滤器

复杂过滤器不是简单的将线性操作链应用于一个流(上面简单过滤器过程便是如此)。当有多个输入和输出时,或者输出类型和输入类型不一致时,可以用下面的图来展示复杂过滤器的处理流程:
 
复杂过滤器类型由-filter_complex参数配置。这个参数是全局的,因为复杂过滤器类型本身就不可能只和一个流或文件关联,这是由它的本质决定的。此外-lavfi参数和-filter_complex是等价的。

关于复杂过滤器类型一个常用例子是overlay过滤器,它有两个输入,一个输出,其中一个视频覆盖在另外一个上面:

ffmpeg -i video_1.mkv -i video_2.3gp -filter_complex 'overlay' video_out.mp4

音频中与此对应的是amix过滤器。

1.3流复制

流复制通过-codec参数选择的一个模式。它让ffmpeg忽略解码和编码环节,仅仅进行解复用和复用。它经常用于改变容器格式或者修改容器级别的元数据。

因为没有了解码和编码,所以流复制非常快,而且没有质量损失。然而,出于许多原因,流复制可能在某些场合下不能正常工作。在流复制中使用过滤器,显然也不可能,因为过滤器处理的是解码后的数据。

1.4选择流

默认情况下,ffmpeg对每种类型(视频,音频,字幕)仅包含一个输入流。当有多个时它选择“最好”的那个,这个"最好"基于以下标准:视频,这是最高的分辨率,音频,它有最多的通道,字幕,这是第一个字幕流。当存在多个"最好"的时候,则选择最低序号的那个。可以通过-vn/-an/-sn参数来禁用某些默认设置。如果要全部手工控制,请使用-map参数。

FFmpeg命令行工具系列二---转码流程及过滤器相关推荐

  1. Android 下使用 FFmpeg 命令行工具与问题排查

    目录 FFmpeg 命令行工具 将相关文件加入到项目中 修改 ffmpeg 源码 问题排查 上一篇文章 中,我们已经成功编译了 FFmpeg 的主要库并集成到了我们的 Android 应用中.我们暂时 ...

  2. [总结]FFMPEG命令行工具之ffprobe详解

    目录 0 前言 1 语法 Synopsis 2  描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opt ...

  3. [总结]FFMPEG命令行工具之ffmpeg详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 详细描述 Detailed description 3.1 滤镜 Filtering 3.1.1 简单滤镜图 Simp ...

  4. [总结]FFMPEG命令行工具之ffplay详解

    目录 0 前言 1 语法 Synopsis 2 描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opti ...

  5. FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe

    一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...

  6. 堪称神器的命令行工具系列——curl

    作者 | 琼璞    责编 | 张红月 来源 | 晚晴幽草轩(ID:nice-links) curl 非常有用的命令行工具库,用于通过 URL 传输数据.它的名字就是客户端(client)的 URL ...

  7. FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg

    一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...

  8. FFmpeg命令行工具-实用命令

    目录 help命令使用 流选择选项 视频封装解封装 3.1 视频格式转换 3.2 分离/合并视频音频流 3.3 截取视频片段 3.4 视频转换为m3u8格式 3.5 把视频文件推送到rtmp服务器 3 ...

  9. FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度

    FFmpeg对音频.视频播放速度的调整的原理不一样.下面简单的说一下各自的原理及实现方式: 一.调整视频速率 调整视频速率的原理为:修改视频的pts,dts 实现: ffmpeg -i input.m ...

最新文章

  1. Visio绘制功能分解图
  2. [转]汇编语言的准备知识--给初次接触汇编者 2
  3. PHP----------PHP自身的性能优化注意事项
  4. hdu-1877(大数+进制转换)
  5. 资料:vue 3.0+版本发布
  6. 用java实现归并,算法:JAVA实现归并排序
  7. C++ 20 还未发布,就已凉凉?
  8. scala编程_Scala编程语言简介
  9. Xilisoft iPad Magic Platinum for Mac如何制作铃声?将联系人传输到计算机/设备?
  10. jQuery实现简单的百分比进度条
  11. js复制隐藏域中的文字
  12. 我曾经在课间给学生讲过的金庸小说片段
  13. miniprogram-ci官方文档
  14. 神雕侠侣手游服务器维护,《神雕侠侣》2020年6月18日更新维护新服开启公告
  15. java开发社交网站_仿知乎问答社交平台网站
  16. qq空间把android改成iphone,装逼时代 教你如何修改QQ微信小尾巴为来自iphone6
  17. 4.5.2 地址变换机构 4.5.3  访问内存的有效时间
  18. 第 20 章 Document Tools
  19. filedownload实现
  20. BatchNorm的通俗解释

热门文章

  1. 不为人知的几个微信实用技巧
  2. 入门 | 我们常听说的置信区间与置信度到底是什么?
  3. 如何更简单的使用Polly
  4. 【mmdetection】SSD训练自己的VOC数据集注意事项
  5. 清除文件用其他应用默认打开方式
  6. 【Docker】Docker安装
  7. CSS中的代表的什么
  8. linux apache 404配置文件,apache httpd服务器404错误跳转配置教程
  9. 数据、数据库、数据库管理系统、数据库系统的概念
  10. Copying File