前端多媒体(6)—— 视音频编解码技术基础-程序员宅基地

参考资料

以下是学习总结

播放器的原理

先说播放器处理视频的流程

1037630-20170630155833430-68364191.jpg
图片来源[总结]视音频编解码技术零基础学习方法

  • 解协议:针对视频源不在本地的情况,HTTP,RTMP
  • 解封装:
    • 输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据
    • 封装的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起
  • 解码视音频
    • 就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据
    • 音频:AAC,MP3,AC-3:导出为:PCM数据
    • 视频:H.264,MPEG2,VC-1 导出为:导出为:YUV420P,RGB
  • 视音频同步

封装格式

我们常常看到的 AVI,MP4, TS, FLV, MKV, RMVB 都是封装格式,文件的后缀名通常就代表这个文件的封装格式。

如下是主要封装格式,和容器里面的内容

1037630-20170630160353399-406360192.png
图片来源[总结]视音频编解码技术零基础学习方法

对于网络流媒体来说:除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。

重点:

  • 一个文件的里面的媒体流所采用的编码格式跟这个文件的后缀名并没有完全的必然联系。
  • 不同的封装格式不一定能够装下同样的东西。

视频编码

视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。

1037630-20170630160418149-765229783.png
图片来源[总结]视音频编解码技术零基础学习方法

音频编码

1037630-20170630160438524-710688235.png
图片来源[总结]视音频编解码技术零基础学习方法

近年来并未推出全新的音频编码方案,可见音频编码技术已经基本可以满足人们的需要。

视频应用场景分类

直播

现有网络视音频平台参数对比

1037630-20170630160502180-1401283812.png
图片来源[总结]视音频编解码技术零基础学习方法

直播服务普遍采用了RTMP作为流媒体协议

  • FLV作为封装格式
  • H.264作为视频编码格式
  • AAC作为音频编码格式。

点播

1037630-20170630160522211-322035620.png
图片来源[总结]视音频编解码技术零基础学习方法

点播服务普遍采用了HTTP作为流媒体协议

  • H.264作为视频编码格式
  • AAC作为音频编码格式。

H.264编码

帧类型

  • 完整编码的帧叫I (intra picture) 帧

  • 参考之前的I帧生成的只包含差异部分编码的帧叫 P(predictive-frame) 帧
  • 参考前后的帧编码的帧叫 B(bi-directional interpolated prediction frame) 帧。

I 帧

帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。

I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。

特点
  • 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输
  • 解码时仅用I帧的数据就可重构完整图像
  • I帧描述了图像背景和运动主体的详情
  • I帧不需要参考其他画面而生成
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧
  • I帧不需要考虑运动矢量
  • I帧所占数据的信息量比较大

P帧

前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,

解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

特点
  • P帧是I帧后面相隔1~2帧的编码帧
  • P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)
  • 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像
  • P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧
  • P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧
  • 由于P帧是参考帧,它可能造成解码错误的扩散
  • 由于是差值传送,P帧的压缩比较高

B帧

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些)换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。

B帧压缩率高,但是解码时CPU会比较累。

特点
  • B帧是由前面的I或P帧和后面的P帧来进行预测的
  • B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量
  • B帧是双向预测编码帧
  • B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确
  • B帧不是参考帧,不会造成解码错误的扩散

核心算法

  • 帧内压缩: 帧内压缩是生成I帧的算法
  • 帧间压缩: 生成B帧和P帧的算法
序列的说明

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。

压缩方法
  • 分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。
  • 定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
  • 预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
  • 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
DTS和PTS
  • DTS: Decode Time Stamp
    • DTS主要用于视频的解码,在解码阶段使用
  • PTS:Decode Time Stamp
    • PTS主要用于视频的同步和输出.

解码的参照frame及其解码的顺序

1037630-20170630160547180-365327189.png

规律
  • I frame 的解码不依赖于任何的其它的帧.
  • p frame的解码则依赖于其前面的I frame或者P frame.
  • B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

前端中的视频编解码

检测浏览器对视频 & 音频 的解码支持情况

video 对象有一个 canPlayType 方法,用来判断浏览器是否支持对于视频的编解码,如下有一个页面用来检测

如下是一个典型 封装格式 ,视频编码,音频编码 mime 数据

video/mp4; codecs="avc1.42E01E, mp4a.40.2"

可以用video的canPlayType方法测试浏览器是否支持,或者使用 MediaSource.isTypeSupported() 方法来探测是否支持

document.createElement('video').canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"') // probably

MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); // true

更全的封装编码探测可以看这里 :http://www.leanbackplayer.com/test/h5mt.html

如果挂了可以查看我的备份页面:https://young-cowboy.github.io/gallery/canPlayType/index.html

如下的截图是我在chrome userAgent 测试的结果

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

1037630-20170630155738586-862783955.png

1037630-20170630155751274-970698008.png

1037630-20170630155802852-436958630.png

转载于:https://www.cnblogs.com/xiaoniuzai/p/7099373.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34200628/article/details/94489332

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf