1 FFmpeg的由来

FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写。官网:ffmpeg.org

编译好的可执行程序也可以从官网上下载。当然你也可以自己搭建编译环境编译。

2 FFmpeg命令行工具

主要包括:

  • ffmpeg 快速的音频、视频编码器/解码器
  • ffplay 多媒体播放器
  • ffprobe 多媒体文件特征解析

同时FFmpeg编译之后包含libavcodec、libavformat、libavdevice、libavfilter、libavutil、libpostproc、libswresample、libswscale。

3 ffmpeg命令行格式

ffmpeg.exe [global options] [input file options] -i input_file [output file options] output_files
[]表示可选的参数

4 ffplay命令行格式

ffplay和ffmpeg命令行参数一致,只是ffplay没有输出相关的参数。
比如: ffmpeg -i input_file ... test_options ... output_files
使用ffplay可以直接预览
ffplay -i input_file ... test_options

5 ffmpeg中数值前缀或后缀语法

ffmpeg中表示数字可以使用K、M、G形式的后缀,分别表示千、兆、吉;默认是10进制的,可以使用后缀B表示以2为单位的KB、MB、GB等。比如在设置转码率的时候可以使用下面几种形式表示视频编码码率为1.5Mb:

ffmpeg -i input.avi -b:v 1500000 output.mp4

ffmpeg -i input.avi -b:v 1500K output.mp4

ffmpeg -i input.avi -b:v 1.5M output.mp4

ffmpeg -i input.avi -b:v 0.015G output.mp4

设置转码码率为10MB,形式如下:

ffmpeg -i input.mpg -b:v 10MB output.mp4

7 ffmpeg转码及filter

ffmpeg转码的基本逻辑是如下图所示:

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

ffmpeg从输入文件(input_file)中通过解复用器(demuxer,包含在libavformat库中)读取到压缩之后的编码数据(encoded data);压缩的数据通过解码器(decoder)的解码,还原为原始的数据(decoded frame,音频PCM、视频YUV),这些数据可作为filter的输入;原始音视频数据通常可以直接传递给编码器(encoder),输出编码后的数据(encoded packet,重新编码),这个过程也可以省略;通过复用器(muxer)的处理输出指定的封装格式。

这里提到filter的概念,在ffmpeg的转码过程中filter是最复杂的。多个filter可以构成filterchain,使用逗号分隔;多个filterchain可以构成filtergraph,用分号分隔。filtergraph分为简单和复杂两种。简单的filtergraph通常是可以线形顺序描述的filtergraph,比如下图:

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

复杂的filtergraph通常是具有多个输入输出文件,并有多条执行路径。比如下面的例子,

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

filter在实际使用中语法如下:(注意区分,前面是输出标签,后面是输出标签)

[in_label1][in_label2][...] filter_name=parameters [out_label1][out_label2][...]

举例说明下,先看下面语法:
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w

最终的filter是这样的:

  [a]  [a]pad=2*iw[A]  [A]

split                overlay=w

  [b]  [b]hqdn3d[B]    [B]

(后续部分内容会介绍不同的filter语法)

8 Lavfi virtual device

-f表示使用filter,而lavfi是libavfilter virtual input device的别名。其支持的命令行格式如下:

-f lavfi [-graph [-graph_file]]

-graph是作为输入的filtergraph,graph_file表示filtergraph文件的。

比如下面输入显示SMPTE测试图:

ffplay -f lavfi -i smptebars

9 颜色的表示方法

  • 固定的名字(可以查看颜色表),比如red、blue;
  • 十六进制的颜色描述0xRRGGBB[@AA],注意透明度A必须是浮点数,范围[0.0,1.0]或者十六进制描述(0x前缀);
  • #RRGGBB@AA,网页中描述颜色的格式,AA使用十六进制;
  • random,系统随机计算一个颜色;

可以用下面语句验证下颜色的描述:

ffplay -f lavfi -i color=c=0xff0000@0.5

ffplay -f lavfi -i color=c=blue

ffplay -f lavfi -i color=c=#0000ff@0x80

ffplay -f lavfi -i color=c=random

10 ffmpeg帮助文档查询

ffmpeg.exe支持以下命令后缀 -h、-h long、-h topic
ffmpeg -h decoder=decoder_name
ffmpeg -h encoder=encoder_name

  • 支持的码流filter -bsfs
  • 可用的编解码器 -codecs
  • 可用的解码器 -decoders
  • 可用解码器 -encoders
  • 可用filter -filters
  • 支持的音视频格式(后缀或文件格式) -formats
  • 支持的音频声道layout -layouts
  • 支持的像素格式 -pix_fmts
  • 支持的协议类型 -protocols
  • 支持的音频数字化精度 -sample_fmts

附加说明

本部分内容主要涉及《Ffmpeg Basic》的前两章,建议认真阅读下,这将是后续学习和扩展的基础,不需要全部搞明白,但是需要理解ffmpeg基本的转码、和libavfilter的工作原理。
至于ffmpeg的帮助文档,在需要的时候知道哪里可以找到,可以参考什么就可以了。

参考:http://ffmpeg.org/ffmpeg-filters.html#Filtering-Introduction

FFmpeg Basics学习笔记(1)ffmpeg基础的更多相关文章

  1. FFmpeg Basics学习笔记(2)

    帧率 fps的概念 帧率,单位FPS(frame per second), 用于衡量视频每秒的处理帧数,对于编码器而言说明编码器在1s的编码的速度,通常可以使用一帧的编码时间倒数简单计算:对于解码器而 ...

  2. FFmpeg Basic学习笔记(3)

    视频叠加--画中画效果 overlay video filter 视频叠加比较常见的应用场景是台标的叠加,在画面左上角.右上角.左下角或右下角叠加台标. ffmpeg提供的overlay filter ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  5. 卷积神经网络(CNN)学习笔记1:基础入门

    卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Vie ...

  6. 「学习笔记」字符串基础:Hash,KMP与Trie

    「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...

  7. 【学习笔记】Linux基础(零):预备知识

    学习笔记(连载)之Linux系列 Note:本学习笔记源自<鸟哥的Linux私房菜(基础学习篇)>一书,为此书重要内容的摘要和总结,对于一些常识性的知识不再归纳 新型冠状病毒引发的肺炎战& ...

  8. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  9. ios开发学习笔记001-C语言基础知识

    先来学习一下C语言基础知识,总结如下: 在xcode下编写代码. 1.编写代码 2.编译:cc –c 文件名.c 编译成功会生成一个 .o的目标文件 3.链接:把目标文件.o和系统自带的库合并在一起, ...

随机推荐

  1. 【RS】Amazon.com recommendations: item-to-item collaborative filtering - 亚马逊推荐:基于物品的协同过滤

    [论文标题]Amazon.com recommendations: item-to-item collaborative filtering (2003,Published by the IEEE C ...

  2. #探究# HTTP长连接和短连接

    本文速读: HTTP协议与TCP/IP协议的关系 因TCP协议可靠,所以HTTP通常基于TCP实现 如何理解HTTP协议是无状态的 多次请求之间没有关联关系 什么是长连接.短连接? 每次请求都建立TC ...

  3. 运维人员20道必会iptables面试题

    1.详述iptales工作流程以及规则过滤顺序? iptables过滤的规则顺序是由上至下,若出现相同的匹配规则则遵循由上至下的顺序 2.iptables有几个表以及每个表有几个链? Iptables ...

  4. python中,花括号,中括号,小括号的区别

    python中,花括号,中括号,小括号的区别 Python主要有三种数据类型:字典.列表.元组.其分别由花括号,中括号,小括号表示. 如: 字典:dic={'a':12,'b':34} 列表:list ...

  5. 【ASP.NET】第一个ASP.NET MVC应用程序

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递 ...

  6. .NET跨平台实践:用C#开发Linux守护进程-Daemon

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  7. 1 时间戳 2 C# 如何生成一个时间戳 3 js 时间加一分钟... 4 js string->date 5 js 取得当天0点 / 23:59:59 时间

    var str = 'Jan 23, 2019 10:25:47 AM';var strnow = new Date(str); 时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经 ...

  8. mvc 缓存页面 减轻服务器压力

    方法: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  9. Mac OS X 下多个JDK版本的切换小技巧

    如果在系统中安装了多个Java JDK 版本,可能会根据项目或编译环境的不同来回切换,下面有两种非常方便的方法供大家选择. 我的机器上有 Java 7 和 Java 8,大家根据自己的 JDK 版本自 ...

  10. 在java项目中使用 Lombok 及可能问题

    一.Maven项目使用步骤一般包含两步,1)引入依赖 2)特定的 IDE 引入对应的插件 1)在POM中引入依赖 <!-- https://mvnrepository.com/artifact/ ...