我们如果从网上加载一个视频,到本地播放器播放具体流程图如下:
一、视频分层研究
协议层:RTMP、HTTP、MMS等主要用于网络传输
封装格式层:其实就是将音频数据和音频数据打包成一个包方便用于传输和播放同步变下变播等
编解码层:将原始数据编码去除冗余数据压缩数据,分为音频编解码和视频编解码
像素层:视频端表现为将yuv/rgb形式的数据显示到屏幕上、音频端讲pcm数据通过音响设备播放出来
二、压缩方案讨论
因为音视频中,音频占的比重较少,大部分体积还是由视频构成,我们是要做视频大小压缩,影响到视频大小最关键部分是,视频的编解码层。
减小体积的方案有以下几种:
1.降低分辨率(有损压缩)
会造成视频模糊,不建议
2.降低帧率 (有损压缩)
会使视频观看卡顿或者丢失关键帧,不建议
3.转换编码格式(压缩率低的转到压缩率高的,例如RealVideo 8 转到 H264 或者采用下一代编码标准例如 HEVC(H265) ,在压缩率上大概能提高一倍)
思路:原视频→解包→编码的视频 → 原格式解码 → 视频流 →其他高压缩的编码 → 编码的视频 → 打包 → 新压缩视频
下面是封装与音视频编码的关系:
三、遇到的问题
1.视频没压缩完成之前,无法知道该编码格式的压缩比为多少。即所谓高压缩比编码和低压缩比编码都是相对的,某些情况下,一些平常高压缩比的编码格式也不会有太高的压缩比。
2.耗时过长,我采用网上一个 ffmpeg 应用例子 转换格式 mp4转成 mkv 20M(1080p)大小的视频,花了17分钟,并且阻塞主线程操作,不友好。转成mp4文件大小8M,但失去声音。其他例子正在测试
3.很多音视频编解码库,需要调试原代码,需要音视频还有C/C++相关知识
网友评论