前言
关于音视频,我们需要先了解如下的知识
像素
如上的点阵图,每一幅图片都是由若干个不同颜色的点组成的,这其中的每一个点叫做一个像素。其颜色值一般由RGB表示
RGB
所谓RGB,是表示颜色值的的一种格式。其原理也是基于三原色,R G B 分别代表的是Red、Green、Blue,其数值表示对应颜色的强度。这三者每一个的取值范围为:0-255
我们可以在这个网站体验 RGB 的变化 Color Wheel - Color Calculator | Sessions College
其实我们在开发中多使用到的 HEX 值,这是 RGB 的十六进制表示。在上面的网站中,我们小范围拖动浮标,可以看到会有对应一个色域的值是不变的,这也验证了这是基于三原色来创造了RGB值。
分辨率
分辨率是指纵横方向的像素数量,一般是长*宽。如下图所示
较为高端的手机一般也都不会到达 2k,而是介于1080p-2k
,这是因为分辨率越高就意味着手机耗电越大。
若是视频文件的分辨率为 4k ,但是设备并未达到 4k,此时设备渲染该视频时候会将其降采样,所以观影效果是一样的。
码率
码率(比特率)=bit数目/时间(s) (单位:bps)
其表示单位时间内流媒体的bit数目,所以也可以称之为码流。事实上在网络传输中,我们也可以称之为网速
所以高比特率 => 需要高带宽(带宽不高会卡顿),低比特率 => 视频压缩模糊
FFmpeg
FFmpeg
是一个较为著名的视频处理开源工具,很多情况下,我们都会要使用到这个工具。到官网下载解压后配好环境变量,我们就可以使用cmd命令行来分析处理视频了。
ffmpeg :视频处理工具
ffplay:视频播放工具
ffprobe:视频分析工具
将视频压缩指定大小 ffmpeg -i Desktop/input.mp4 -fs 10MB Desktop/output.mp4 -fs 10 : 表示文件大小最大值为10MB 设置视频的帧率为20fps ffmpeg -i Desktop/input.mp4 -r 20 Desktop/output.mp4 -r 20:表示帧率设置为 20fps 设置视频的码率 ffmpeg -i Desktop/input.mp4 -b:v 1M Desktop/output.mp4 -b:v :指定视频的码率 -b:a : 指定音频的码率s 1M:码率的值 1M 表示 1Mb/s 设置视频的分辨率 ffmpeg -i Desktop/input.mp4 -s 1920x1080 Desktop/output.mp4 -s 1920x1080表示分辨率为1920x1080 可以结合上面的命令一起来使用 ffmpeg -i Desktop/input.mp4 -s 1920x1080 -b:v 1M -r 20 Desktop/output.mp4 复制代码
上面的代码块,里面含有几种压缩视频的命令,大家可以尝试一下。
帧率
帧:指的是视频或者动画中的每一张画面,视频或者动画就是由一张张画面所组成。(例如胶片)
帧率:每秒的帧数。帧数越高,画面越流畅
FPS:刷新率,当刷新率太低,会感到屏幕不连贯。
当然,刷新率要匹配上帧率才能看到对应的流畅效果
视频封装
当下的音视频都不是分离的,视频都会带有音频。事实上这两者在底层文件中是分离的,只是我们将其封装了起来,播放的时候就是同步播放的。
封装:简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。
目前主要的视频容器有如下: MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等
那么他们不同的轨道是如何查看的呢?
下面我们用 ffprobe xxx.mkv
这个命令查看一下视频的信息
Input #0, matroska,webm, from 'D:\系统文件\下载\Video\Tar.mkv': Metadata: LANGUAGE : und COMPATIBLE_BRANDS: isomiso2avc1mp41 MAJOR_BRAND : isom MINOR_VERSION : 512 HANDLER_NAME : AudioHandler ENCODER : Lavf59.27.100 Duration: 00:05:16.26, start: 0.000000, bitrate: 304 kb/s Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 854x480 [SAR 1:1 DAR 427:240], 29.97 fps, 29.97 tbr, 1k tbn (default) Metadata: ENCODER : Lavc59.37.100 libx264 DURATION : 00:05:16.249000000· Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default) Metadata: ENCODER : Lavc59.37.100 libvorbis DURATION : 00:05:16.261000000 复制代码
上面得到的结果可以看到时长,比特率信息。以及两个流,一个是Video,一个是Audio;对应的流也可以看到其参数信息
较为简单的一类视频就是包含了一个视频轨,一个音频轨。但是在大型的电影类视频中,是有着多类型、多语言的音轨以及多种字幕流。
这个是电影原盘的数据,我们可以看到上面包含多种文件
一个视频流
多条音频流
多条字幕流
在网络直播或者网络播放的时候,我们可以选择把不必要的轨道去掉,可以节省流量。同时字幕流也可以全部去掉,字幕可以内嵌在视频上面或者作为外挂字幕同步播放。(其中,7.1或者5.1指的是几个喇叭的杜比音效)
音视频流是分一个个包的,接下来我们用 ffprobe -show_packet xxx.mkv
查看一下媒体的数据包的信息
[PACKET] codec_type=audio stream_index=1 pts=170169 pts_time=170.169000 dts=170169 dts_time=170.169000 duration=21 duration_time=0.021000 size=248 pos=6426569 flags=K_ [/PACKET] [PACKET] codec_type=video stream_index=0 pts=170203 pts_time=170.203000 dts=170170 dts_time=170.170000 duration=33 duration_time=0.033000 size=64 pos=6426823 flags=__ [/PACKET] [PACKET] codec_type=audio stream_index=1 pts=170190 pts_time=170.190000 dts=170190 dts_time=170.190000 duration=21 duration_time=0.021000 size=230 pos=6426894 flags=K_ [/PACKET] [PACKET] codec_type=video stream_index=0 pts=170370 pts_time=170.370000 dts=170203 dts_time=170.203000 duration=33 duration_time=0.033000 size=711 pos=6427131 flags=__ 复制代码
我们可以看到音轨和视频轨是交错排布的,是混流的。
选用混流存储而不是一前一后存储的原因是为了数据的同步。
音视频虽然是两个数据流独立存在的,但两个流封装之后的数据是按顺序下载的,为满足在线观看的效果,就需要数据交错排布。否则就会出现卡顿或者音画不同步。