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

一、概述

       在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参数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值