04月15, 2020

视频基础知识和FFmpeg介绍

强大的FFmpeg

当下抖音、网课、直播卖货等非常流行,这些流行产物都离不开一个关键技术,视频处理技术,无论是视频创作者本人,还是发布平台都是具体的用户。惠子、刀小刀等网红利用PS、premiere、final cut等视频编辑软件进行视频编辑,抖音利用视频加解密、编码技术将视频压缩上传至平台。这些技术的背后其实都或多或少的基于一个强大的开源软件“ FFmpeg”

关于视频的基础知识

在介绍FFmpeg之前,有必要先了解一下音视频的基础知识,以便更好的学习。

分辨率

分辨率这个我们最熟悉,在看三大视频网站“爱奇艺”、“腾讯视频”和“优酷”的时候,我们最常使用的功能就是切换清晰度,“720p”或“1080p”,分辨率其实就是代表的是像素点的多少。分辨率为1920x1080的图片和视频就是其拥有1920x1080个像素。在屏幕大小一定的情况下,分辨率越高,图像就会越清晰;在分辨率一定的情况下,屏幕越小,图像越清晰。

*.png

同样,如果你的手机屏幕很小,但是分辨率很高,那么你的手机屏幕素质就很高,比如iPhone 11的屏幕大小为6.1英寸。它的PPI计算公式是:√(1792^2+828^2)/6.1约为326;而iPhone 11 Pro的ppi就更高,所以屏幕就会更清晰。

帧速率

我们看到的视频,其实就是一张张图片组成的,每一张图片就是一帧。如果一秒钟播放24帧图片,那么帧速率就是24帧/秒(fps)。电影的帧数一般至少要24帧以上,而游戏的帧数至少要求在30帧以上,一般最好在60帧以上才会比较爽。

码率(比特率)

这个是最难懂的,视频码率是视频数据(视频色彩量、亮度量、像素量)每秒输出的位数。一般用的单位是kbps。可以理解成一个视频是包括“视频”、“音频”、“字幕”等元素的,这些元素的信息量、数据量的大小就是码率,码率越大,体验效果越好。

平常我们总在想,如何让视频文件更小,让视频更清晰呢?答案就在码率上,对码率进行处理,就叫做编码方式,一般有CBR/ABR/VBR三种方式.

*.png

CBR全称constant bitrate,意思是固定码率,就是在整个视频当中,码率固定不变;VBR全称Variable Bitrate,意为可变码率。其实在视频当中,画面内容越丰富,所需码率越高,成像质量也会越好,画面内容不怎么丰富的地方用高码率就是浪费,所以可变码率根据画面内容的丰富程度自动调节,保证成像质量的同时,让文件变得更小。所以要让视频文件更小,内容更清晰,采用VBR的编码方式,并设定科学的数值,就是解决问题的关键。ABR全称average bitrate ,意为平均码率,是一种介于CBR和VBR之间的折中方式。

视频格式

视频格式分为视频文件格式(简称:文件格式),视频封装格式(简称:视频格式),视频编码方式(简称:视频编码)。

*.png

具体可以参考视频格式那么多,MP4/RMVB/MKV/AVI 等,这些视频格式与编码压缩标准 mpeg4,H.264.H.265 等有什么关系? - 知乎用户的回答 - 知乎

FFmpeg介绍

下载安装

安装教程直接参考官方文档下载对应系统版本即可。参考Download FFmpeg

正如上文提到,视频文件本身就类似一个“容器”,它包括字幕、音频、视频等元素。

文件/容器格式

常见的容器格式,即文件格式有如下几种:

  • mp4
  • mkv
  • webm
  • avi
  • ts
  • flv

其中MP4比较常见,ts格式在一些网课中比较常见。那么他们有啥区别呢?他们的编码方式是不同的,MP4,全称MPEG-4 Part 14,是一种使用MPEG-4的多媒体电脑档案格式,副档名为.mp4,以储存数码音讯及数码视讯为主。另外,MP4又可理解为MP4播放器,MP4播放器是一种集音频、视频、图片浏览、电子书、收音机等于一体的多功能播放器。TS是日本高清摄像机拍摄下进行的封装格式,先来简要介绍一下什么是MPEG2-TS吧。MPEG2格式大家都通过对DVD的接触而多多少少了解了一些,DVD节目中的MPEG2格式,确切地说是MPEG2-PS,全称是Program Stream,而TS的全称则是Transport Stream。MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。这两种格式的主要区别是什么呢?简单地打个比喻说,你将DVD上的VOB文件的前面一截cut掉(或者干脆就是数据损坏),那么就会导致整个文件无法解码了,而电视节目是你任何时候打开电视机都能解码(收看)的,所以,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

当你用FFmpeg下载视频时,下载一半,停电了。如果你下载的是mp4格式的视频,那么很抱歉,这个文件你打不开。会报如下错误:

*.png

但是如果是ts格式的,恭喜你,可以打开和正常观看。

下面的命令查看 FFmpeg 支持的容器。

ffmpeg -formats

image.png

FFmpeg命令格式

FFmpeg 的命令行参数非常多,可以分成五个部分。

ffmpeg {1} {2} -i {3} {4} {5}

上面命令中,五个部分的参数依次如下。

  1. 全局参数
  2. 输入文件参数
  3. 输入文件
  4. 输出文件参数
  5. 输出文件

参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行。

ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]

例如:

ffmpeg \
-referer "https://www.daguanren.cc" \
-c:v libx264 -c:a libfdk_aac \
-i  "https://www.daguanren.cc/video/record.m3u8" \
-c:v libvorbis -c:a libvorbis \
output.webm

编码格式

上面命令中的,libx264和libvorbis是视频文件的编码格式,libfdk_aac和libvorbis是音频文件的编码格式,这个命令的含义是:将输入视频编码格式为H.264、音频编码格式为aac的文件下载下来,保存成视频编码格式为VP9、音频格式为Vorbis的webm文件。

具体编码格式和编码器,请参考阮一峰的FFmpeg 视频处理入门教程

FFmpeg常用指令

#改变视频分辨率(transsizing)的例子,从 1080p 转为 480p 
ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4
#从视频里面提取音频(demuxing)
ffmpeg \
-i input.mp4 \
-vn -c:a copy \
output.aac
# 格式转码,转成H.264编码
ffmpeg -i [input.file] -c:v libx264 output.mp4

# 格式转码,转成H.265编码
ffmpeg -i [input.file] -c:v libx265 output.mp4
# 调整码率,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
ffmpeg \
-i input.mp4 \
-minrate 964K -maxrate 3856K -bufsize 2000K \
output.mp4
# 设置请求头的referer
ffmpeg \
-referer "https://www.daguanren.cc" \
-c:v libx264 -c:a libfdk_aac \
-i  "https://www.daguanren.cc/video/record.m3u8" \
-c:v libvorbis -c:a libvorbis \
output.webm
# 设置请求头的user_agent
ffmpeg \
-referer "https://www.daguanren.cc" \
-user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" \
-c:v libx264 -c:a libfdk_aac \
-i  "https://www.daguanren.cc/video/record.m3u8" \
-c:v libvorbis -c:a libvorbis \
output.webm
# 设置请求头的cookie
ffmpeg \
-referer "https://www.daguanren.cc" \
-headers "Cookie: wwwdaguanren=3286187daguanren12" \
-protocol_whitelist "file,http,https,crypto,tcp,tls" \
-allowed_extensions ALL \
-user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" \
-cookie
-c:v libx264 -c:a libfdk_aac \
-i  "https://www.daguanren.cc/video/record.m3u8" \
-c:v libvorbis -c:a copy \
output.webm

#-c:a copy表示不改变音频编码,直接拷贝。

其他请求头设置请参考:https://ffmpeg.org/ffmpeg-protocols.html#http

参考:

视频格式介绍

FFmpeg 视频处理入门教程

视频码率介绍

https://www.zhihu.com/question/20997688/answer/435296409

https://www.apple.com.cn/iphone/compare/?device1=iphone11&device2=iphone11promax&device3=iphoneSE2ndgen

https://zhuanlan.zhihu.com/p/31748672

https://www.jianshu.com/p/7ed3be01228b

https://www.bilibili.com/video/av40146374/

本文链接:https://www.daguanren.cc/post/FFmpeg.html

-- EOF --

Comments