音视频学习
基础概念
帧率
视频的本质是连续播放的图片,帧率表示着一秒钟刷新的图片的帧数,帧率为24FPS以上时人脑就会觉得比较流畅了,因此一般的动画或者电影的帧率为24FPS或30FPS。
分辨率
即每帧图片的分辨率,如1080P的视频指的是1920*1080像素,每一个像素都由RGB三个通道构成,即使用3 * 8位来表达。
码率
码率指的是单位时间内传输的比特数,对于一个给定24帧率、1080P的视频来说,它的码率为24 * 1920 * 1080 * 3 * 8比特每秒,约等于142MB每秒,可见未压缩的视频容量是很大的,所以我们需要采用视频编码来对视频进行压缩。
视频编码
视频编码即去除数据中冗余信息的压缩技术。
- 软编码:使用CPU能力进行编码/解码,如使用JS或者WASM进行编码/解码
- 硬编码:使用GPU能力进行编码/解码,如使用Video标签,或者Web Codecs进行编码/解码,性能更好。
常见视频编码方式:
- H264(AVC1)
- H265(HEVC)
- VP8
- VP9
- AV1
音频编码
常见音频编码方式:
- AAC
- MP3
- WAV
- AC-3
封装格式
将编码后的视频、音频、以及如标题、时长、分辨率等信息打包再一起的文件,被称作封装格式(容器格式)。
常见音频编码方式:
- MP4
- MKV
- WebM(基于MKV,主要视频编码格式为VP8、VP9)
- MOV(Apple的QuickTime)
- FLV
- TS
- AVI
编解码流程
完整流程如 下:音频和视频采集完成后分别进行音频编码和视频编码、对编码后的产物进行封装,传输后在客户端进行解封装从而分离出音频和视频,再分别进行解码得到原始的音频和视频,再进行音视频同步,最后进行播放。
图片编码
常见图片编码方式:
- PNG(无损压缩)
- JPG(有损压缩)
- JPEG
- GIF
FFMPEG
ffprobe
查看文件信息
ffprobe input.mkv
ffplay
播放文件
ffplay input.mkv
常用命令
ffmpeg [全局选项] [输入选项] [-i 输入文件] [输出选项] [输出文件]
封装格式转换
ffmpeg -i input.mkv output.mp4