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参数。
FFmpeg命令行工具系列二---转码流程及过滤器相关推荐
- Android 下使用 FFmpeg 命令行工具与问题排查
目录 FFmpeg 命令行工具 将相关文件加入到项目中 修改 ffmpeg 源码 问题排查 上一篇文章 中,我们已经成功编译了 FFmpeg 的主要库并集成到了我们的 Android 应用中.我们暂时 ...
- [总结]FFMPEG命令行工具之ffprobe详解
目录 0 前言 1 语法 Synopsis 2 描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opt ...
- [总结]FFMPEG命令行工具之ffmpeg详解
目录 0 前言 1 语法 Synopsis 2 描述 Description 3 详细描述 Detailed description 3.1 滤镜 Filtering 3.1.1 简单滤镜图 Simp ...
- [总结]FFMPEG命令行工具之ffplay详解
目录 0 前言 1 语法 Synopsis 2 描述 Description 3 选项 Options 3.1 流指定器 Stream specifiers 3.2 通用选项 Generic opti ...
- FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...
- 堪称神器的命令行工具系列——curl
作者 | 琼璞 责编 | 张红月 来源 | 晚晴幽草轩(ID:nice-links) curl 非常有用的命令行工具库,用于通过 URL 传输数据.它的名字就是客户端(client)的 URL ...
- FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...
- FFmpeg命令行工具-实用命令
目录 help命令使用 流选择选项 视频封装解封装 3.1 视频格式转换 3.2 分离/合并视频音频流 3.3 截取视频片段 3.4 视频转换为m3u8格式 3.5 把视频文件推送到rtmp服务器 3 ...
- FFmpeg命令行工具学习(五):FFmpeg 调整音视频播放速度
FFmpeg对音频.视频播放速度的调整的原理不一样.下面简单的说一下各自的原理及实现方式: 一.调整视频速率 调整视频速率的原理为:修改视频的pts,dts 实现: ffmpeg -i input.m ...
最新文章
- Visio绘制功能分解图
- [转]汇编语言的准备知识--给初次接触汇编者 2
- PHP----------PHP自身的性能优化注意事项
- hdu-1877(大数+进制转换)
- 资料:vue 3.0+版本发布
- 用java实现归并,算法:JAVA实现归并排序
- C++ 20 还未发布,就已凉凉?
- scala编程_Scala编程语言简介
- Xilisoft iPad Magic Platinum for Mac如何制作铃声?将联系人传输到计算机/设备?
- jQuery实现简单的百分比进度条
- js复制隐藏域中的文字
- 我曾经在课间给学生讲过的金庸小说片段
- miniprogram-ci官方文档
- 神雕侠侣手游服务器维护,《神雕侠侣》2020年6月18日更新维护新服开启公告
- java开发社交网站_仿知乎问答社交平台网站
- qq空间把android改成iphone,装逼时代 教你如何修改QQ微信小尾巴为来自iphone6
- 4.5.2 地址变换机构 4.5.3 访问内存的有效时间
- 第 20 章 Document Tools
- filedownload实现
- BatchNorm的通俗解释