转发自白狼栈:查看原文
对于音视频,置信大家都看过电影(视频),听过音乐(音频),至多应该都晓得 mp4 是视频文件,mp3 是音频文件。
对于一个音视频文件,都有哪些属性呢?以视频为例,咱们能够通过 ffmpeg -i 命令查看媒体文件的信息。
» ffmpeg -i r1ori.mp4
ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 10.0.0 (clang-1000.10.44.4)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.1 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin' --host-ldflags= --enable-ffplay --enable-gpl --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-chromaprint --enable-frei0r --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libgme --enable-libgsm --enable-libmodplug --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-librsvg --enable-librtmp --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtwolame --enable-libvidstab --enable-libwavpack --enable-libwebp --enable-libzmq --enable-opencl --enable-openssl --enable-videotoolbox --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/2.3.0/include/openjpeg-2.3 --enable-nonfree
libavutil 56\. 22.100 / 56\. 22.100
libavcodec 58\. 35.100 / 58\. 35.100
libavformat 58\. 20.100 / 58\. 20.100
libavdevice 58\. 5.100 / 58\. 5.100
libavfilter 7\. 40.101 / 7\. 40.101
libavresample 4\. 0\. 0 / 4\. 0\. 0
libswscale 5\. 3.100 / 5\. 3.100
libswresample 3\. 3.100 / 3\. 3.100
libpostproc 55\. 3.100 / 55\. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:58.53, start: 0.000000, bitrate: 1870 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
Metadata:
handler_name : SoundHandler
除了视频的元信息,还包含了更多咱们当初编译的配置,你能够抉择 -hide_banner 参数来暗藏这些信息,残缺的命令如下
»ffmpeg -i r1ori.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:58.53, start: 0.000000, bitrate: 1870 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
咱们次要看几个数据
- Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘r1ori.mp4’: # Input #0 示意咱们通过 ffmpeg -i 参数输出的第一个文件,下标从 0 开始,也就是说咱们能够输出多个文件,实际上 ffmpeg 还反对输入多个文件
- Metadata 示意视频元信息
- Duration 这行蕴含了视频的播放时长是 58.53 秒,开始播放工夫是 0,整个文件的比特率是 1870kbit/s
- Stream #0:0(und): Video: h264,这行示意该文件的第一个流是视频流,编码格局是 H264 格局(封装格局为 AVC1),每一帧的数据表示为 yuv420p,分辨率为 544×960,视频流的比特率是 1732kbit/s,帧率为每秒钟 29.83 帧。
- Stream #0:1(und): Audio: aac,这行示意该文件的第二个流是音频流,编码格局为 ACC(封装格局为 MP4A),并且采纳的 Profile 是 LC 规格,采样率是 44.1KHz,声道是立体声(stereo),码率是 129kbit/s
开始呈现了一些生疏的名词,咱们顺次介绍下。
容器
像下面这个视频文件一样,把不同的数据流(视频流、音频流,有的还有字幕流等)封装在一个文件中,咱们称之为容器。像咱们相熟的 mp4、avi、rmvb 等等都是多媒体容器格局,个别状况下,多媒体文件的后缀就是它的容器格局。
咱们能够把容器了解为一个瓶子、罐子之类的货色。
编码和解码(codec)
编码:将视频、音频用某种格局或标准记录下来并存储,称为编码(codec)。编码能够了解成是对容器内的货色的加工解决。
常见的视频编码格局有 h264、h265 等,常见的音频编码格局有 mp3、aac 等。
解码:就是将视频、音频压缩的编码数据,解码成为非压缩的视频、音频原始数据。比方咱们要对一段音频减少回声,就须要先对音频文件先解码再编码。
软解:即软件解码,通过软件让 CPU 对视频文件进行解码操作。
硬解:即硬件解码,为了加重 CPU 的压力,采纳 GPU 来解决原来全副让 CPU 解决的局部视频数据。
软解须要对大量的视频信息进行解决,所以软解十分吃 CPU,一条 FFmpeg 的命令都有可能把 CPU 干趴下了。
相比而言,硬解的效率十分高,然而硬解的毛病也不言而喻,它不能像软解那样,对字幕、画质等的解决成果都不是很好。如果我没记错的话,七牛云平台(一个绝对业余的音视频平台)当初还不反对硬解。
ffmpeg 是最常见的软解码开源库,它理论是通过比方 H264、H265、MPEG- 4 等编解码算法进行软解。
在现如今的音视频畛域,ffmpeg 简直反对所有音视频的编解码,十分弱小。
转码:即编码转换,是将视频从一种格局转换为另一种格局。比方将一个 flv 文件转换为 mp4 文件。
ffmpeg -i input.flv output.mp4
比特率
比特率又称码率,示意编码器每秒输入的字节数,单位是 Kbps,b 为 比特(bit)这个就是电脑文件大小的计量单位,1KB=8Kb,辨别大小写,s 为 秒(second)p 为 每(per)。
比方
在雷同的压缩算法下(前面咱们会介绍若干不同的压缩算法),码率越高,视频的品质也就越高。
对于压缩文件,依照下面的了解,码率的粗略计算形式 = 文件大小 / 时长。
比方 r1ori.mp4 的大小是 13.7 兆,时长约 59 秒,那么它的码率大概等于 (13.7 x 1024 x 8) / 59 = 1900 kb/s
公式:1MB=8Mb=1024KB=8192Kb
因为还有一些参数的影响,所以这个码率咱们也只能失去一个大概的数值。
固定码率和可变码率
早些年的时候,音频编码的时候抉择的都是固定码率(Constant Bitrate, CBR),前面呈现了可变码率 (Variable Bitrate, VBR),固定码率指的是编码器输入的码率固定,这样就很难平衡“平静的画面”和“激烈的画面”,相对而言,可变码率就能够很好的管制编码器,在细节比拟多,画面绝对激烈的时候应用更多的比特位,对于绝对平静的画面,应用更低的比特位。如此一来,在输入品质肯定的状况下,VBR 更具劣势,存储的话咱们也会优先选择可变码率。
帧和帧率
帧指的是一个画面。
帧率(frames per second, fps),即每秒输入多少帧,你也能够了解画面每秒输入多少次。
大家在玩游戏的时候肯定深有体验,游戏卡顿的时候,画面都是帧与帧之间跳动的,十分的不顺畅。
帧率影响画面的晦涩度,帧率越高,画面也就越晦涩。
因为视觉暂留景象(即当物体在疾速静止时, 人眼所看到的影像隐没后,人眼仍能持续保留其影像 1 /24 秒左右的图像)的存在,所以对于个别的电影视频,要求最低帧率是 24,也就是每帧曝光 1 /24 = 0.042 秒。
分辨率
分辨率大家应该都不生疏,比方某视频网站常见的蓝光 1080P,超清 720P,高清 540P。
分辨率能够了解为视频画面的大小,即视频的宽度和高度。720P 指的就是高度是 720 像素。
理解过码率和帧率咱们发现,不能相对的说分辨率越高视频越清晰,更重要的是如何均衡好码率、帧率以及分辨率三者的关系。
总的来说,咱们更违心承受视频体积越小,清晰度越高的视频,一来是存储不便,二来是看起来爽。
有损和无损
首先咱们说一下什么是音视频的原始数据?原始数据指的是通过音视频设施采集的、没有通过任何加工的数据。音频的原始数据是 pcm 格局,视频的原始数据是 yuv 格局。
有损和无损,即有没有损失,这里针对的是多媒体数据压缩的一种说法。有损压缩又称之为破坏性压缩,当然并不是说压缩之后无奈解压的那种毁坏。比方咱们常见的 mp3、mp4 文件都是有损压缩。
以音频编码为例,音频外面的声音来源于自然界,咱们通过技术计划捕捉到声音,而后依据肯定的算法进行存储。
在现阶段,咱们存储下来的声音不能齐全还原为自然界的声音,任何音频编码都是有损的。
有同学可能要提出疑难了,我看有文章介绍,音频的原始数据不是 pcm 格局的吗?
其实 pcm 编码也只是有限靠近于无损,它可能达到信号的最高保真,因而,pcm 编码才被约定为无损压缩。
好好的音频,我想听最实在的从自然界采集的声音,为什么要压缩呢?
原始数据太大,不不便存储
即便存储下来了,也不不便传输,须要极大的带宽
当初视频的压缩比很高,比方现如今大家耳熟能详的 4k 8k,看起来齐全能满足需要
复用器和解复用器
对于容器而言,留神这里针对的是容器,咱们常常会有两种频繁的操作。
取出容器内的音视频数据,咱们称之为解封装,由 demuxer 解封装器(又称之为解复用器)实现。
把解决好的音视频数据装进容器内称之为封装,由 muxer 封装器(又称之为复用器)实现。
咱们会在这边文章上面继续更新音视频相干的概念,如果你感觉有什么概念不好了解,能够给我留言,我会再收集并作补充。