FFmpeg(一)

FFmpeg简介

ffmpeg是一个非常快的视频/音频转换器,其也可以现场抓取音频/视频源,并在任意采样率、尺寸之间调整视频,以及提供多种高品质的滤镜系统。

FFmpeg涉及的基本概念

  1. 分辨率: 分辨率可以分为显示分辨率与图像分辨率.

显示分辨率是指屏幕显示器的分辨率,是屏幕的像素(每一个像素 pixel是由多个颜色单元subPixel组成)密度决定的在单位英寸内像素越多,
硬件所能控制的颜色点位越多,屏幕的显示的画面就会越精细。在手机参数一栏都会标有屏幕分辨率是多少。目前手机上常见的分辨率有720p,
1080p以及2K,以720p、1080p、2k为例:720p表示的是1280*720的分辨率;1080p表示的是19201080的分辨率;2K则表示的是
2560*1440的分辨率(这里需要说明的是,"
”前面的数字指的是屏幕长度像素个数,后面的数字指的是屏幕宽度像素个数,而且比例对应了以
前16:9的屏幕比例. 进入“全面屏”时代,屏幕比例基本上改成了18:9的比例,进而衍生出了720p+,1080p+,2K+等分辨率)

图像分辨率就是只图像长宽乘积的大小,横向和纵向的像素(pixel)的数量

  1. 屏幕像素密度: ppi(Pixels per Inch)

所表示的是每英寸所拥有的像素数量。因此ppi数值越高,即代表显示屏能够以越高的密度显示图像。以长宽方向的像素个数为直角三角形的两边,通过勾股定义就可以计算出对角线上像素的个数,然后用这个数值除以屏幕对角(左下顶点到右上顶点的)距离就是 ppi了.

因此屏幕显示异常清晰、锐利。对于目前的AMOLED屏幕,子像素排列方式有别于LCD的RGB排列方式,AMOLED屏幕的子像素排列方式基本上都是采用PenTile排列, PenTile排列技术最关键的地方就是利用不规则的子像素排列,以更少的子像素点代替更多的子像素点。在同尺寸同分辨率的情况下采用PenTile排列的屏幕像素密度实际只有RGB排列的屏幕像素密度的80%,所以就有了“无2K,不A屏”的说
更多请参考: http://www.360doc.com/content/19/0908/03/40520079_859759183.shtml

  1. Dpi: 基于上文的 sub pixel物理的排列格式,人们就发明了新的计算方式DPI

Dpi表示分辨率,指每英寸长度上的点数, DPI又可以细分为水*分辨率和垂直分辨率,例如一张1英*1英寸的图片,如果它的水*分辨率是100 dpi,垂直分辨率是50 dpi,那么就是说,它水*每英寸分成100小段,垂直每英寸分成50小段,就像米尺上的一格格那样.这张图总共有100*50=5000个格子, 这张图片共有5000像素.由于它的水*分辨率和垂直分辨率不相等,所以每个像素是一个微小的长方形.

  1. 帧速率: FPS(Frames PerSecond)的缩写——帧/秒

它指每秒钟界面屏幕刷新的次数,一般帧率25以上人眼就很难发觉,但如果是告诉流动的画质还是会有卡顿的感觉. 一般手机内的应用帧率都控制在60以上,这样能更好的保证界面的流畅度.影像FPS的物理因数主要是显卡, 如果FPS值过低可以尝试通过调节一些游戏或者电脑参数来缓解如:降低游戏分辨率、开启垂直同步等等。

  1. 脉冲编码调制:(Pulse Code Modulation,PCM))

就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。它包含几个关键指标

a.抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号
b.量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电*,把瞬时抽样值用最接*的电*值来表示,通常是用二进制表示.
c.量化误差:量化后的信号和抽样信号的差值。量化误差在接收端表现为噪声,称为量化噪声。 量化级数越多误差越小,相应的二进制码位数越多,要求传输速率越高,频带越宽。为使量化噪声尽可能小而所需码位数又不太多,通常采用非均匀量化的方法进行量化。 非均匀量化根据幅度的不同区间来确定量化间隔,幅度小的区间量化间隔取得小,幅度大的区间量化间隔取得. 一个模拟信号经过抽样量化后,得到已量化的脉冲幅度调制信号,它仅为有限个数值。这样就能完成将一个模拟信号周期内的数组以事件单位按顺序记录每个时刻的信号强弱值。

  1. 采样位深:

基于上面的PCM调制解调的原理,上面最终取到信号强弱值存储大小和采样位深的大小有着密切的联系,常见的16bit(16比特),可以记录大概96分贝的动态范围,也就是说这个点的信号值用 16bit的内存空间来表示

  1. 采样率:
    采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,它用赫兹(Hz)来表示。采样率是指将模拟信号转换成数字信号时的采样频率,也就是单位时间内采样多少点。一个采样点数据有多少个比特。我们人耳能听到的声音一般在20Hz~20KHz之间,根据奈奎斯特采样定理,采样频率fs大于信号中最高频率fmax的2倍时,采样之后的数字信号便能完整的反应真实信号。所以44.1KHz为常见的采样率。

人的发音器官发出的声音频率大约是803400Hz,但人说话的信号*率通常为3003000Hz,人们把这种频率范围的信号称为话音(speech)信号。

  1. 码流: Data Rate

也叫码率是指在1秒钟内,通信端口在传输数据时高低电*变化的次数,也叫码率,单位时间内传送的数据越多,所包含的信息量也越多,是视频编码中画面质量控制中最重要的部分
一般情况下,DVD格式歌曲的码流为6~8M;VCD歌曲的码流约为1.5M。相同配置和同样网络环境下,DVD歌曲和VCD歌曲的并发流是不一样的。视频比特率与码流只是同一个问题两种叫法,比如一个MPEG2视频文件,一般不但包含视频信息还有音频信息,音频也有自己的比特率,这是音视信息复合在一起的文件,这个文件的码流是其音视码流的总和。

多码流:
多码流技术是通过在编码过程中同时产生多种不同码流及分辨率的流媒体数据,根据用户实际网络带宽条件为之自动分配相对最佳解码画质的解决方案。在实际网络直播应用中,由于位于不同网络位置的访问者所在网络环境存在差异,而仅以某种固定码流分辨率进行网络直播流媒体传送往往会导致网速较高的用户看到的画质仍不够清晰,网速较低的用户解码时间过长而使得画面不够流畅,为解决二者的矛盾使访问者浏览到尽可能看到兼顾清晰和流畅的直播内容,采用多码流技术成为了一个最简单最有效的办法。

码率=采样率(hz) X 位深度(也叫量化精度,电频信号振幅的上下范围) X 声道(同时采集的输入源)

文件大小=码率 x 时长(s) ,这里暂时省略了文件属性以及压缩编码后的数据,仅从原始文件的角度来分析

  1. 采样率: 也成为采样速度和采样频率,定义了每秒钟从连续信号中提取并组成离散信号的采样个数,用Hz表示,它记录了将模拟信号专程数字信号的采样频率,也就是单位事件内采样多少点,一个采样点就多个bi数据, 采样率 乘以每秒钟采样的个数就能得出它的码率

  2. 视频比特率
    视频比特率是指每秒传送的比特(bit)数。单位为bps(Bit Per Second),比特率越高,每秒传送数据就越多,画质就越清晰。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。 视频中的比特率(码率)原理与声音中的相同,都是指由模拟信号转换为数字信号后,单位时间内的二进制数据量。

  3. 通道数

即声音的通道的数目。常有单声道和立体声之分,单声道的声音只能使用一个喇叭发声(有的也处理成两个喇叭输出同一个声道的声音),立体声可以使两个喇叭都发声(一般左右声道有分工) ,更能感受到空间效果,当然还有更多的通道数。

  1. 通道

通道条(channel strip)其实一个继承自模拟时代的概念,原本是指调音台上任一通道上所有处理元件,通常有话放、高低切、均衡、压缩等等, 除了调音台,设备商也推出了各种单通道(有时也有双通道供立体声输入使用)的通道条

  1. mutxers 视音频复用器(Muxer)

用于FFmpeg音视频复用,是将视频压缩数据(例如H.264)和音频压缩数据(例如AAC)合并到一个封装格式数据(例如MKV)中去。在这个过程中并不涉及到编码和解码。同样的还有复用器。

FFmpeg中音视频编码格式

  1. Mp3: 一种音频编码方式,利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件

  2. ACC: 高级音频编码技术,Advanced Audio Coding.

AAC(高级音频编码技术,Advanced Audio Coding)是杜比实验室为音乐社区提供的技术。AAC可以支持多达48个音轨,15个低频(LFE)音轨,5.1多声道支持,更高的采样率(最高可达96kHz,音频CD为44.1kHz)和更高的采样精度(支持8bit、16bit、24bit、32bit,音频CD为16bit)以及有多种语言的兼容能力,更高的解码效率,一般来说,AAC可以在对比MP3文件缩小30%的前提下提供更好的音质。

AAC编码的主要扩展名有三种:
.AAC - 使用MPEG-2 Audio Transport Stream(ADTS,参见MPEG-2)容器,区别于使用MPEG-4容器的MP4/M4A格式,属于传统的AAC编码(FAAC默认的封装,但FAAC亦可输出MPEG-4封装的AAC)
.MP4 - 使用了MPEG-4 Part 14(第14部分)的简化版即3GPP Media Release 6 Basic(3gp6,参见3GP)进行封装的AAC编码(Nero AAC编码器仅能输出MPEG-4封装的AAC);
.M4A - 为了区别纯音频MP4文件和包含视频的MP4文件而由苹果(Apple)公司使用的扩展名,Apple iTunes对纯音频MP4文件采用了".M4A"命名。M4A的本质和音频MP4相同,故音频MP4文件亦可直接更改扩展名为M4A

对比Mp3
比特率:AAC - 最高512kbps(双声道时)/MP3 - 32~320kbps
采样率:AAC - 最高96kHz / MP3 - 最高48kHz
声道数:AAC - (5.1)六声道 / MP3 - 两声道
采样精度:AAC - 最高32bit / MP3 - 最高16bit

  1. H.264,视频编码格式

是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。

H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。

同H.263等标准的特率效率相比,能够*均节省大于50%的码率。技术上,它集中了以往标准的优点,并吸收了标准制定中积累的经验.
帧内预测编码,整数变换,帧间预测编码,多帧预测,整数变换,量化,熵编码 ...

  1. YUV: 颜色编码格式
    YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

为节省带宽起见,大多数YUV格式*均使用的每像素位数都少于24位。主要的抽样(subsample)格式有YCbCr4:2:0、YCbCr4:2:2、YCbCr4:1:1和YCbCr4:4:4。YUV的表示法称为A:B:C表示法:

4:4:4表示完全取样。
4:2:2表示2:1的水*取样,垂直完全采样。
4:2:0表示2:1的水*取样,垂直2:1采样。
4:1:1表示4:1的水*取样,垂直完全采样。
图解:

yuv

每个像素占2*4个格子,8bit. 其中亮度每个格子都有值。Cb和Cr根据不同的格式进行取样, 上面的方块非常的有规律,除去前面的4, 按照从左到右从上到下的顺序数格子就能清楚的明白了什么是垂直扫描,什么是水*扫描了,扫描间隔了。

  1. 容器格式

视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容,一般是通过.号加后缀组成。我们电脑上和手机上的任何文件都是以容器存储的。

FFmpeg基础帮助命令介绍

  1. 下载github源码https://github.com/FFmpeg/FFmpeg.git,本地安装make,然后参照install.md编译ffmpeg,然后在终端之行ffmpeg
qxq4633@LSCN897187 FFmpeg % ffmpeg
ffmpeg version N-98900-gccc7120ee7 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 11.0.3 (clang-1103.0.32.62)
configuration: --disable-x86asm
libavutil 56. 58.100 / 56. 58.100
libavcodec 58.101.100 / 58.101.100
libavformat 58. 51.101 / 58. 51.101
libavdevice 58. 11.101 / 58. 11.101
libavfilter 7. 87.100 / 7. 87.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
  1. 它的语法格式主要分为三大块
    ffmpeg [全局选项] [输入文件选项及输入文件路径] [输入文件选项及输出文件路径]也可以细分成5块

  2. 由于命令比较多,使用ffmpeg -h查看一些基础的用法

qxq4633@LSCN897187 FFmpeg % ffmpeg -h
Getting help:
-h -- print basic options
-h long -- print more options //更加详细的帮助文档
-h full -- print all options (including all format and codec specific options, very long) //查看全部的帮助文档
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol //查编解码器多路调制的命令选项详情
See man ffmpeg for detailed description of the options.

Print help / information / capabilities:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats //查看ffmpeg所支持的容器格式
-muxers show available muxers //查看所有的音视频复用器
-demuxers show available demuxers //查看所有的解音视频复用器
-devices show available devices
-codecs show available codecs //查看所有的编解格式
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters //显示所有可用的比特流过滤器
-protocols show available protocols
-filters show available filters //显示所有可用的过滤器
-pix_fmts show available pixel formats //显示所有支持的pixel fomart,如YUV,RGBA
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
  1. 常用的选项参数介绍
Global options (affect whole program instead of just one file):
-y overwrite output files //覆盖输出文件,即如果 output.wmv 文件已经存在的话,不经提示就覆盖掉
-n never overwrite output files
-vol volume change audio volume (256=normal)

Per-file main options:
-f fmt force format
-c codec codec name 指定编码器
-pre preset preset name 指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration record or transcode "duration" seconds of audio/video //设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
-to time_stop record or transcode stop time
-fs limit_size set the limit file size in bytes
-ss time_off set the start time offset
...

Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation) ,如368x208 输出的分辨率为368x208,注意片源一定要是16:9的不然会变形
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number set the number of bits per raw sample
-vn disable video //用于分离视频
-ab bitrate audio bitrate (please use -b:a)
-b bitrate video bitrate (please use -b:v)
...

Audio options:
-aframes number set the number of audio frames to output //输出多少帧
-aq quality set audio quality (codec-specific)
-ar rate set audio sampling rate (in Hz) //设置采样频率
-ac channels set number of audio channels //设置声道数, 1,2
-an disable audio //用于分离音频,搭配 -c copy,直接将视频拷贝容器
-acodec codec force audio codec ('copy' to copy stream)
-vol volume change audio volume (256=normal)

使用FFmpeg命令操作音视频

  1. 查看文件信息 ffmpeg -i 64k_output.mov, 在Mac上可以通过quickTime,MediaInfo查看
qxq4633@LSCN897187 ffmpegdemo % ffmpeg -i 64k_output.mov
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '64k_output.mov':
Metadata:
major_brand : qt
minor_version : 512
compatible_brands: qt
encoder : Lavf58.51.101
Duration: 00:00:26.63, start: 0.000000, bitrate: 1499 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 766x1334 [SAR 1:1 DAR 383:667], 1497 kb/s, 60 fps, 60 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : Core Media Video
encoder : Lavc58.101.100 mpeg4
  1. 转换视频编码格式

如转换成H.264格式 ffmpegdemo % ffmpeg -i input.mov -c:v h264_videotoolbox 264_ouput.mov,
可以通过ffmpeg -encoders来查看编码器名称
如转换成H.264格式 ffmpegdemo % ffmpeg -i input.mov -c:v hevc_videotoolbox 265_ouput.mov,

  1. 转换容器格式 ffmpeg -i input.mp4 -c copy output.webm

在前面的命令中-c主要是用来之行编码器的名字的,这里由于不需要编码,使用-c copy

-c codec codec name //为了区分音视频编码,命令选项参数后加上 :v 或者 :a 分别表示音视频
  1. 调整视频的每帧的数量
ffmpeg -i input.mov -r 20 output.mov
  1. 调整码率,一般用来减少视频的体积大小
ffmpeg -i input.mov -b 1500K output.mov
  1. 调整图片的分辨率(transsizing)
ffmpeg -i input.mov -vf scale=480:-1 output.mov

可以使用ffmpeg -h filter=scale来查看sacle相关帮助命令,不过这里的描述并不是很具体,在FFmpeg/doc/filters.texi文件中找到了关于scale的详细描述

我的原始文件为766x1334,执行此命令后表示为480x836, 关于后面的-1选项与这段文字有关

One useful instance of this option is that when you know a specific device's
maximum allowed resolution, you can use this to limit the output video to
that, while retaining the aspect ratio. For example, device A allows
1280x720 playback, and your video is 1920x800. Using this option (set it to
decrease) and specifying 1280x720 to the command line makes the output
1280x533.

Please note that this is a different thing than specifying -1 for @option{w}
or @option{h}, you still need to specify the output resolution for this option
to work.

大致意思就是由于我们事先不知道设备支持的最大分辨率,使用此参数可以支持缩小视频以适配系统设备分辨率。

关于scale的选项参数更多请参考FFmpeg/doc/filters.texi文件,
常用的选项还有
指定宽高: scale=w=200:h=100 , scale=200:100 ,scale=200x100
指定一个大小的名字: scale=qcif, scale=size=qcif
放大两倍: scale=w=2*iw:h=2*ih, scale=2*in_w:2*in_h
缩小一半: scale=w=iw/2:h=ih/2
增大宽,高保持一样: scale=3/2*iw:ow,同理scale=3/2*iw:ow
将宽度增加到最大500像素: scale=w='min(500\, iw*3/2):h=-1'

上面语法中使用的字符在filters.texi均有定义,通过@item定义的
i表示input输入文件的意思,其它的依次类推
qcif代表某个写好的尺寸,在utils.texi文件中有详细的定义,常用的如下

@item sqcif
128x96
...
@item hd720
1280x720
@item hd1080
1920x1080
  1. 提取音频
ffmpeg -i input.mov -vn -c:a copy output.aac

命令描述

-vn disable video
-an disable audio

vn,an分别表示为 video no, audio no,这样可以方便记忆

  1. 为视频文件添加音轨
ffmpeg -i input.aac -i input.mp4 output.mp4
  1. 截图
ffmpeg \
-y \ //overwrite output files
-i input.mov \
-ss 00:01.00 -t 00:00:01 \
output_%3d.jpg

涉及的命令

-ss time_off set the start time offset
-t duration record or transcode "duration" seconds of audio/video
-timecode hh:mm:ss[:;.]ff set initial TimeCode value. //也可以指定time的格式
  1. 设置图片质量
ffmpeg \
-ss 01:23:45 \
-i input \
-vframes \1 -q:v 2 \
output.jpg

相关命令

-vframes number set the number of video frames to output

关于q:v命令在encoders.texi中可以找到描述,q为quality的首字母, v推测为VBR的首字母。格式为[options]:[options specifier] [option value]

Set maximum constant quality (VBR) encoding with @command{ffmpeg}:
@example
ffmpeg -i INPUT -codec:v libtheora -q:v 10 OUTPUT.ogg
  1. 裁切视频的指定区域
ffmpeg -i input.mov -strict -2 -vf crop=20:20:0:20 output.mov

通过ffmpeg -h filter=crop文档介绍,格式crop=width:height:x:y表示宽高(20,20),裁剪区域的左上角坐标(0,20)。
strict没有找到相关的帮助文档,代码中有一些断言要求使用strict -1-2,推测应该是某种约束

参考链接

百度百科-PCM脉冲编码调制
百度百科-采样率
百度百科-帧
百度百科-ACC
百度百科-Mp3
ffmpeg音频样本
音频相关知识:声道、采样率、采样位数、样本格式、比特率
FFmpeg 视频处理入门教程
FFmpeg帮助文档翻译
知乎-音频通道
H264编码协议详解
YUV-PIXEL FORMATS
github-ffmpeg
FFmpeg-命令参数
FFmpeg-官方文档
ppi/分辨率
FFmpeg实例集合

posted @ 2021-03-14 01:40  阿甘左  阅读(565)  评论(0编辑  收藏  举报