视频技术基础02:视频编码基础(代码片段)

麦兜的学习笔记 麦兜的学习笔记     2023-04-03     744

关键词:

目录

1 概述

1.1 视频为什么要编码?

1.2 常用视频编码标准

1.3 视频编码对象

1.4 视频为什么可以编码压缩?

2 视频编码原理推理过程

2.1 熵编码需求

2.2 减少空间冗余

2.3 减少时间冗余

2.4 减少高频信息

2.5 推理过程小节

3 H264编码结构

3.1 帧类型

3.1.1 帧内编码帧和帧间编码帧

3.1.2 H264帧类型

3.1.3 IDR帧

3.2 GOP的概念

3.3 Slice的概念

4 H264码流结构

4.1 码流格式

4.1.1 Annexb格式(附录B格式)

4.1.2 MP4格式

4.2 码流结构

4.2.1 参数集

4.2.2 NALU的概念

4.2.3 码流观察实例

4.3 常见工程问题

4.3.1 如何判断哪些Slice属于同一帧?

4.3.2 如何从SPS中获取图像分辨率?

4.3.3 如何计算得到QP值?

5 帧内预测

5.1 理论基础

5.2 帧内预测规则

5.3 4*4亮度块帧内预测模式

5.3.1 Vertical模式

5.3.2 Horizontal模式

5.3.3 DC模式

5.3.4 Diagonal Down-Left模式

5.3.5 Diagonal Down-Right模式

5.3.6 Vertical-Right模式

5.3.7 Horizontal-Down模式

5.3.8 Vertical-Left模式

5.3.9 Horizontal-Up模式

5.4 16*16亮度块帧内预测模式

5.5 8*8色度块帧内预测模式

5.6 帧内预测模式的选择

6 帧间预测

6.1 理论基础

6.2 块大小

6.3 参考帧

6.4 运动矢量

6.5 运动搜索

6.5.1 运动搜索目标

6.5.2 全搜索算法

6.5.3 快速运动搜索算法

6.6 亚像素插值

6.6.1 问题引入

6.6.2 亚像素插值方法

6.6.3 亚像素精度运动搜索

6.7 运动矢量预测

6.7.1 运动矢量编码

6.7.2 运动矢量预测步骤

6.8 SKIP模式

6.9 帧间预测模式的选择

7 变换量化简介

7.1 DCT变换概述

7.2 量化概述

7.3 Hadamard变换概述

7.4 H264中的变换与量化


1 概述

1.1 视频为什么要编码?

1. 对视频进行编码的最主要目的为了压缩

2. 假设有一部YUV420格式的电影,分辨率为1080P,帧率为25fps,时长为2小时,如果不进行编码压缩,数据量约为521.4GB。如果不进行编码压缩,对于存储和传输的资源消耗都是不可接受的

1920 * 1080 * 1.5 * 25 * 2 * 3600 ≈ 521.4GB

说明:上述计算过程中的1.5B,是YUV420格式存储一个像素的Y、U、V像素值所需的空间,详情可参考视频技术基础01:图像基础和前处理 chapter 2.2.3.4

1.2 常用视频编码标准

目前市面上常见的编码标准有H264、H265、VP8、VP9和AV1,其中,

1. H264和VP8是最常用的编码标准,且二者的标准非常相似

2. H265和VP9分别是他们的下一代编码标准,这两个标准也非常相似

3. AV1是VP9的下一代编码标准

说明:需要注意的是,使用H264和H265需要专利费,而VP8和VP9则是完全免费的

1.3 视频编码对象

1. 视频是由一帧帧图像序列组成的,视频编码就是对一帧帧图像进行的

2. 进行编码的图像为YUV格式,并且是Y分量和UV分量分开编码

3. 对于每一帧图像,又是划分为一个个块进行编码,在不同编码标准中这种块的命名和大小有所不同

① 在H264中称为宏块,在VP9、AV1中称为超级块,下文使用宏块这个名字进行叙述

② 块的大小一般为16*16(H264、VP8)、32*32(H265、VP9)、64*64(H265、VP9、AV1)、128*128(AV1)

说明:关于为什么YUV格式更适用于视频编码,可参考视频技术基础01:图像基础和前处理 chapter 2.4

1.4 视频为什么可以编码压缩?

可以对视频进行编码压缩,是因为图像一般都有数据冗余,主要包括如下4种,

1. 空间冗余

将图像划分为一个个宏块之后,相邻的块很多时候都有比较明显的相似性,这就是空间冗余

2. 时间冗余

假设帧率为25fps,由于前后两帧图像相差只有40ms,因此前后两帧图像的变化是比较小的,相似性很高,这就是时间冗余

3. 视觉冗余

人眼对于图像中高频信息的敏感度小于低频信息,有时去除图像中的一些高频信息,人眼看不出差别,这就是视觉冗余

注意:去除图像中高频信息的操作属于有损编码

4. 信息熵冗余

人们用于表达某一信息所使用的比特数总比理论上表示该信息所需要的最少比特数大,他们之间的差距就是信息熵冗余(或称作编码冗余)

2 视频编码原理推理过程

2.1 熵编码需求

1. 熵编码(entropy encoding)是指利用数据的统计信息进行压缩的无损编码,常用的熵编码方法有香农-范诺编码(Shannon-Fano)、哈夫曼编码(Huffman)、算术编码(arithmetic)和行程编码(Run Length Encoding)

2. 行程编码示例

以行程编码为例,将字符串"aaaabbbccccc"编码压缩为字符串"4a3b5a",就可以将字符串由13B压缩到7B

3. 如何将行程编码方法应用在图像编码中?

① 以对YUV420格式的图像进行H264编码为例,首先将一帧图像划分成一个个16*16的宏块,则对应的Y、U、V分量分别是16*16、8*8、8*8。由于是对三个分量分别编码,以对Y分量的编码为例,可以从图像的左上角开始以之字形扫描每个像素值,就可以得到一个像素值串

② 将行程编码方法应用在图像编码中,就是对得到的像素值串进行行程编码

4. 如何提高行程编码的压缩率?

① 假设使用行程编码方法对字符串"abcdabcdabcd"进行编码,得到的字符串为"1a1b1c1d1a1b1c1d1a1b1c1d",字符串的长度反而从13B增加到25B

可见如果要达到压缩的目的,必须要使得编码前的字符串中出现比较多连续相同的字符

② 类推到图像编码上也是一样的,必须要使得编码前的像素值串也尽量出现连续相同的像素值,最好是一连串数字很小(最好是0)的像素值串

之所以像素值最好为0,是因为在有些编码算法中(e.g. 指数哥伦布算法、算数编码)可以做到只用一个bit或者0.几个bit就可以存储0值

因此在对图像进行熵编码之前的自然需求,就是先对要编码的像素值进行处理,尽可能去除其中的冗余信息,从而将要编码的像素值串变成有很多0的像素值串

说明:本文以行程编码为例进行说明只是为了便于理解,在实际的H264编码标准中,使用的熵编码方式为CAVLC和CABAC

2.2 减少空间冗余

1. 为了提高熵编码的压缩率,使用帧内预测的方法减少空间冗余

2. 帧内预测处理流程如下,

① 在当前编码图像内部已经完成编码的块中找到与当前编码块相邻的块,并通过帧内预测算法得到帧内预测块

② 将当前编码块减去帧内预测块得到残差块,从而减少空间冗余

说明1:相邻块的选择

一般选择即将编码块的左边块、上边块、左上角块和右上角块作为相邻块

说明2:预测块生成

使用不同的算法可以得到多个不同的预测块(上图示例中只是其中一种),因此将当前编码块与不同的预测块相减就会得到多个不同的残差块

② 最终选择这些残差块中像素值的绝对值之和最小的块作为最终的残差块,这个残差块的像素经过扫描生成的像素值串就比直接扫描当前编码块生成的像素值串更接近0

2.3 减少时间冗余

1. 同样是为了提高熵编码的压缩率,使用帧间预测的方法减少时间冗余

2. 帧间预测处理流程如下,

① 在已经编码完成的帧中,通过运动搜索算法得到帧间预测块

② 将当前编码块减去帧间预测块得到残差块,从而减少时间冗余

说明1:通过运动搜索算法得到的预测块也会有多个,因此也会得到多个不同的残差块,此时仍然选择像素值的绝对值之和最小的残差块

说明2:最终选择的预测块所在的已经编码的图像称为参考帧

2.4 减少高频信息

1. 通过帧内预测和帧间预测得到的残差块已经去除了大部分空间冗余和时间冗余,对该残差块进行熵编码可以得到更大的压缩率

但是我们的目标不只是将像素值变小,而是希望能出现连续的0像素,此时就需要通过变换和量化来去除一些高频信息

2. 为了分离图像块的高频和低频部分,需要将残差块变换到频域,通常使用离散余弦变换(DCT变换)。经过DCT变换之后,就可以从残差块得到变换块

变换块中的每个值称为系数,其中左上角的系数值是图像的低频信息,其余的是图像的高频信息

3. 高频信息与低频信息的特性与分布

① 低频信息表示一张图的总体样貌,一般低频系数的值也比较大

② 高频信息主要表示图像中人物或物体的轮廓边缘等变化剧烈的地方,因此高频系数的数量多,但是高频系数的值一般比较小

4. 通过量化减少高频信息

① 由于人眼对高频信息不太敏感,如果通过一种方法去除大部分高频信息,就可以实现在不太影响人眼观感的情况下将变换块中的大部分系数值变为0,也就达到了我们提高熵编码压缩率的目的

② 这种方法就是量化,我们将变换块中的系数都除以一个值(称为量化步长,QStep),得到的结果就是量化后的系数。由于高频系数相比低频系数值更小,量化后就更容易变成0,也就达到了去除高频信息的效果

说明1:量化步长(QStep)和量化参数(QP)

① QStep是编码器内部的概念,用户一般使用QP

② QP和QStep是一一对应的,二者的对应关系如下图所示,

说明2:QStep取值影响

① QStep越大,得到的量化后系数值就会越小,就会去除越多的高频信息,熵编码的压缩率就会更高

② 在解码时,会将QStep乘以量化后的系数得到变换系数,对于之前由于量化变为0的系数此时是无法恢复的,因此量化是一种有损编码

③ QStep值越大,损失就越大,从而解码恢复后的图像清晰度就会越低

说明3:在H264中,如果宏块的大小是16*16,一般会将其划分为16个4*4的块,然后对每个4*4的块做DCT变换

2.5 推理过程小节

1. 为了能够在熵编码时压缩率更高,我们希望进行熵编码的像素值串有尽可能多的连续0像素

2. 为了达到这个目标,先通过帧内预测和帧间预测去除空间冗余和时间冗余,从而得到一个像素值比编码块小很多的残差块

3. 再对残差块进行DCT变换得到变换块,分离出其中的低频信息和高频信息,并利用人眼对高频信息不敏感的特性对变换块的系数进行量化,从而得到有很多连续0像素的像素值串,并对该像素值串进行熵编码

说明1:以上就是视频编码原理的推理过程,视频编码的实际步骤是预测、DCT变换与量化,最后是熵编码

从上图中还可以看出帧内预测和帧间预测是同时进行的,实际上编码器会以宏块为单位遍历所有的预测模式,然后选择最优的预测方式

说明2:在对视频编码过程有了了解之后,下图给出不同编码标准的比较,从中可以看出标准越新,块划分的方式就越多,编码模式也就越多。因此压缩效率也会越大,但是带来的编码耗时也越大

说明3:目前H264和H265的硬件支持已经很好,AV1才刚开始,硬件支持较少

3 H264编码结构

3.1 帧类型

3.1.1 帧内编码帧和帧间编码帧

1. 帧内预测不需要参考已编码帧,可以自行完成编码和解码

2. 帧间预测需要参考已编码帧

① 从类型上,可以参考已编码好的帧内编码帧或帧间编码帧

② 从方向上,可以只参考前面已编码好的帧,也可以同时参考前后已编码好的帧

3.1.2 H264帧类型

1. H264将图像分为I帧(I-frame,Intra-coded picture)、P帧(P-frame,Predicte picture)和B帧(B-frame,Bidirectional predicted picture)

2. 下图是H264中各类帧参考关系的一个示例,其中箭头是从参考帧指向编码帧,其中

① I帧独自编码,不参考其他帧

② 第1个B帧同时参考第1个I帧和第1个P帧

③ 第1个P帧只参考第1个I帧

3.1.3 IDR

1. 如果编码或解码过程中有一个参考帧出现错误,那么参考他的P帧或B帧肯定也会出现错误,而这些出现问题的P帧和B帧又会作为其他帧的参考帧,从而导致错误不断被传递

2. 为了截断这种错误编码的传递,H264引入了一种特殊的I帧,称作IDR帧(Instantaneous Decoder Refresh,立即刷新帧)

H264编码标准中规定,IDR帧之后的帧不能参考IDR帧之前的帧。这样IDR帧之前有错误的帧,也不会被IDR帧之后的帧继续参考

说明1:相较于IDR帧,普通的I帧只是使用帧内预测编码,但是在他后面的P帧和B帧还是可以参考普通I帧之前的帧。但是在大多数情况下,会直接使用IDR帧,而不再使用普通的I帧(虽然标准上可以使用)

说明2:B帧虽然也可以作为参考帧,但实际上很少如此使用

3.2 GOP的概念

1. 在引入IDR帧之后,我们将从一个IDR帧开始到下一个IDR帧的前一帧为止的范围称作GOP(Group of Pictures,图像组)

2. GOP的大小由IDR帧之间的间隔决定,这个间隔被称作关键帧间隔

① GOP越大,编码的I帧就会越少。由于P帧和B帧的压缩率更高,因此整个视频的压缩率就越高

② 但是GOP太大,也会导致IDR帧距离太大,如果中间有参考帧错误,则会引起长时间的花屏和卡顿

③ 因此GOP不是越大越好,也不是越小越好,而是需要根据实际的场景来选择

3.3 Slice的概念

1. Slice(也称作"片")是为了并行编码而设计的

① 首先将一帧图像划分为多个相互独立、互不依赖的Slice

② 在机器性能比较高的情况下,可以多线程并行对多个Slice进行编码,从而提升编码速度

③ 但是也因为一帧图像内的Slice是相互独立的,所以如果进行帧内预测,就不能跨Slice进行,因此编码性能会差一些

2. 引入Slice的概念后,一帧图像内的层次结构如下图所示

① 一帧图像可以划分成一个或多个Slice

② 一个Slice包含多个宏块(Macro Block,MB)

③ 一个宏块又可以划分成多个不同尺寸的子块

4 H264码流结构

视频编码的码流结构是指视频经过编码之后得到的二进制数据是如何组织的

4.1 码流格式

H264码流有两种格式:Annexb格式和MP4格式

4.1.1 Annexb格式(附录B格式)

1. Annexb格式使用起始码来表示一个编码数据的开始

① 起始码本身不是图像编码的内容,只是用于分隔

② 起始码有两种,一种是4B的"00 00 00 01",一种是3B的"00 00 01"

2. 通过字节填充解决编码冲突

① 在图像编码数据中也可能出现"00 00 00 01"和"00 00 01"的模式,这样就会导致起始码和图像编码数据的混淆

② H264通过字节填充的方式解决这种冲突,H264会对图像编码数据中的如下模式进行修改,

  • 将"00 00 00"修改为"00 00 03 00"
  • 将"00 00 01"修改为"00 00 03 01"
  • 将"00 00 02"修改为"00 00 03 02"
  • 将"00 00 03"修改为"00 00 03 03"

 ③ 解码端在去掉起始码之后,需要将对应的模式转换回来

4.1.2 MP4格式

MP4格式没有起始码,而是在图像编码数据的开始使用4B作为长度标识,用来表示编码数据的长度

4.2 码流结构

4.2.1 参数集

1. 在H264码流中,除了图像数据,还有一些视频编码时的参数数据。为了能够将一些通用的编码参数提取出来,不在图像编码数据中重复,H264设计了两个重要的参数集

① SPS(Sequence Parameter Set,序列参数集),主要包括图像的高、宽、YUV格式和位深等基本信息

② PPS(Picture Paramter Set,图像参数集),主要包括熵编码类型、基础量化参数QP和最大参考帧数量等基本编码信息

2. H264码流中的SPS和PPS是至关重要的,如果没有SPS和PPS中的基础信息,之后的I帧、P帧和B帧都无法进行解码

3. 在引入了SPS和PPS之后,H264的码流结构如下,

由于图像帧可以划分为Slice,因此图像帧在码流中实际上是以Slice的形式呈现的

4.2.2 NALU的概念

1. 为了在码流中区分上述数据,H264设计了NALU(Network Abstraction Layer Units,网络抽象层单元)。具体结构如下图所示,其中,

① SPS是一个NALU、PPS是一个NALU、每个Slice也是一个NALU

② 每个NALU由1B的NALU Header和若干字节的NALU Data组成

③ 对于Slice NALU,其中的NALU Data又是由Slice Header和Slice Data组成,而Slice Data又是由一个个MB Data组成

2. NALU Header结构如下图所示,其中,

① F位:forbidden_zero_bit,禁止位,H264码流必须位0

② NRI字段:nal_ref_idc,表示当前NALU的重要性,取值范围为00 ~ 11。参考帧、SPS和PPS对应的NALU该字段必须大于0

③ Type字段:nal_unit_type,表示NALU的类型,其取值如下表所示,

可见对于图像Slice,NALU类型中只区分了IDR Slice(类型为5)和非IDR Slice(类型为1),至于非IDR Slice是普通I Slice、P Slice还是B Slice,需要继续解析Slice Header中的Slice Type字段得到

4.2.3 码流观察实例

1. 可以使用Elecard StreamEye工具分析H264码流

2. 查看H264码流的二进制数据,可以从中解析出各NALU,可见与预期是一致的

说明:分析H265码流可以使用Elecard HEVC工具

4.3 常见工程问题

4.3.1 如何判断哪些Slice属于同一帧?

1. 如上文所述,在H264码流中,图像帧在码流中是以Slice的形式呈现的,因此需要能够区分哪些Slice属于同一个帧

2. 这需要通过Slice的Slice Header进行判断,Slice Header中,有一个first_mb_in_slice字段,该字段表示当前Slice的第一个宏块在当前编码图像中的序号

① 如果first_mb_in_slice字段的值为0,表示当前Slice的第一个宏块是当前编码图像的第一个宏块,也就是说当前Slice是一帧图像的第一个Slice

② 如果first_mb_in_slice字段的值不为0,表示当前Slice不是一帧图像的第一个Slice

只要使用这种方法继续检查后续的Slice,直到找到下一个first_mb_in_slice字段值为0的Slice,就代表新的一帧开始,那么其前一个Slice就是前一帧图像的最后一个Slice

说明:first_mb_in_slice以无符号指数哥伦布编码方式存储

4.3.2 如何从SPS中获取图像分辨率?

1. 在编码端编码视频时,需要设置图像分辨率,但是在解码端不需要设置。这是因为解码端可以从H264码流的SPS中获取分辨率信息

2. 在SPS中使用如下几个字段来表示分辨率的大小,解码端在解码出这几个字段后,通过一定规则的计算就可以得到分辨率的大小

说明1:使用Elecard StreamEye工具查看H264码流的SPS信息

说明2:上述字段也是以无符号指数哥伦布编码方式存储

4.3.3 如何计算得到QP值?

H264码流提供了一种(全局 --> Slice --> 宏块)的QP值设置与调节方式

1. 在PPS中有一个全局基础QP值,字段是pic_init_qp_minus26。当前序列中所有依赖该PPS的Slice共用这个基础QP

2. 每个Slice可以在这个基础QP的基础上做调整,在Slice Header的slice_qp_delta字段中记录了调整偏移值

3. 更进一步地,H264允许在宏块级别对QP值做进一步的精细化调节,这个字段在宏块数据中,叫做mb_qp_delta

说明:设置QP值的字段汇总

① 如果需要计算Slice级别的QP值,则只需要考虑前2个字段

② 如果需要计算宏块级别的QP值,则需要考虑这3个字段

具体计算公式如下,

5 帧内预测

5.1 理论基础

1. 图像具有空间相关性

一帧图像中相邻像素的亮度和色度信息是比较接近的,并且亮度和色度信息也是逐渐变化的,不太会出现突变

2. 帧内编码利用空间相关性进行编码

帧内预测通过利用已经编码的相邻像素的值来预测待编码的像素值,最后达到减少空间冗余的目的

说明:如何利用已编码的像素值预测待编码像素值

① 已编码的像素值已经变成码流,不再是一个个像素

② 在进行编码时,已经编码的块会通过解码重建像素用来做参考像素

5.2 帧内预测规则

说明:以H264标准编码YUV420图像为例

1. 宏块大小为16*16,其中亮度块为16*16,色度块为8*8

2. 16*16的亮度块可以继续划分为16个4*4的子块

因为图像中有的地方细节很多,划分为更小的块来做预测会更精细

3. 帧内预测中亮度块和色度块是分开独立进行预测

亮度块参考已编码亮度块的像素,色度块参考已编码色度块的像素

说明:在实际帧内预测时会分为:4*4亮度块的预测、16*16亮度块的预测、8*8色度块的预测

其中4*4亮度块的预测模式最多,且基本包含了16*16亮度块和8*8色度块的预测模式,因此先对其进行说明

5.3 4*4亮度块帧内预测模式

4*4亮度块帧内预测模式共有9种,包含8种方向模式和一种DC模式,其中方向模式是指预测是有方向角度的

5.3.1 Vertical模式

1. Vertical模式中,当前编码亮度块的每一列的像素值,都是复制上边已经编码块的最下面一行的对应位置的像素值

2. Veritcal模式预测块像素值计算方法如下

3. Vertical模式只有在上边块存在时才可使用,如果不存在则该模式不可用

例如图像最上边的块就没有可参考的块存在

5.3.2 Horizontal模式

1. Horizontal模式中,当前编码亮度块的每一行的像素值,都是复制左边已经编码块的最右边一列的对应位置的像素值

2. Horizontal模式预测块像素值计算方法如下

3. Horizontal模式只有在左边块存在时才可使用,如果不存在则该模式不可用

5.3.3 DC模式

1. DC模式中,当前编码亮度块的每一个像素值,是上边已经编码块最下边一行和左边已编码块最右边一列的所有像素值的平均值

2. 根据上边块和左边块的存在情况,DC模式预测块像素值计算方法如下,可见DC模式预测块中的每个像素值是一样的

3. DC模式在上边块和左边块都不存在时仍可使用,此时会将预测块的像素值设置为1 << (位深 - 1),如果位深为8bit,则该值为128

5.3.4 Diagonal Down-Left模式

1. Diagonal Down-Left模式中,当前编码亮度块的每一个像素值,是上边块和右上块的像素通过插值得到

注意:上边块和右上块可能是同一个块,因为可能是一个16*16的亮度块

2. Diagonal Down-Left模式预测块像素值计算方法如下

3. Diagonal Down-Left模式只有在上边块和右上块都存在时才可使用,如果有一个不存在则该模式不可用

5.3.5 Diagonal Down-Right模式

1. Diagonal Down-Right模式中,当前编码亮度块的每一个像素值,是上边块、左边块和左上角对角的像素通过插值得到

2. Diagonal Down-Right模式预测块像素值计算方法如下

3. Diagonal Down-Right模式只有在上边块、左边块和左上角对角像素都存在时才可使用,如果有一个不存在则该模式不可用

5.3.6 Vertical-Right模式

1. Vertical-Right模式中,当前编码亮度块的每一个像素值,是上边块、左边块和左上角对角的像素通过插值得到

2. Vertical-Right模式预测块像素值计算方法如下

3. Vertical-Right模式只有在上边块、左边块和左上角对角像素都存在时才可使用,如果有一个不存在则该模式不可用

5.3.7 Horizontal-Down模式

1. Horizontal-Down模式中,当前编码亮度块的每一个像素值,是上边块、左

[android基础]videoview(代码片段)

Demo项目下载自己封装了一个播放器VideoView资源Android三种播放视频的方式Android播放器框架分析之AwesomePlayer音频与视频播放讲的player类,比较全视频播放原理:系统会首先确定视频的格式,然后得到视频的编码..然后对编码进行... 查看详情

qt与ffmpeg联合开发指南——编码:完善功能和基础封装(代码片段)

...理几个遗留问题,再对代码进行完善,最后把编码功能做基础封装。一、遗留问题和解决方法(1)如何让音视频的录制保持同步?在我们的演示代码中之所以发现音视频录制不同步的主要原因是音频帧和视频帧不应该简单的按... 查看详情

ffmpeg基础:获取音视频的各种编码参数(代码片段)

文章目录获取视频编码参数获取音频编码参数上一篇文章中介绍了音视频的各种编码参数的概念,这里介绍一下如何通过ffmpeg库获取一个视频文件的各种音视频编码参数。在对视频文件进行处理和转码的时候这些参数很重要... 查看详情

使用 C# 的媒体基础

】使用C#的媒体基础【英文标题】:MediaFoundationwithC#【发布时间】:2015-02-0109:02:47【问题描述】:媒体基础是微软推荐的技术,确实有很多示例和解释支持,但都是原生代码我在sourceforge中找到了一个包装器,使我能够将MediaFounda... 查看详情

音视频基础知识(代码片段)

音视频术语是了解音视频开发的基础内容,如一些专有名词,常见的口语化名词等,它们表述了音视频中客观存在的属性或特征。1.1视频编码所谓视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成... 查看详情

音视频基础知识(代码片段)

音视频术语是了解音视频开发的基础内容,如一些专有名词,常见的口语化名词等,它们表述了音视频中客观存在的属性或特征。1.1视频编码所谓视频编码就是指通过特定的压缩技术,将某个视频格式文件转换成... 查看详情

音视频开发入门基础知识(视频入门篇)(代码片段)

...课程:<RTSP实时音视频开发实战>音视频开发入门基础知识(音频入门篇)目录一、前言二、视频采集和显示三、视频常见的格式四、RGB转YUV和YUV转RGB五、视频的压缩编码一、前言    当前随着科技的进步和人们... 查看详情

python图像处理图像与视频处理基础(代码片段)

图像与视频处理基础0.前言1.在3D空间中显示RGB图像颜色通道1.1图像表示1.2在3D空间中绘制颜色通道2.使用scikit-video读/写视频文件2.1scikit-video库2.2读/写视频文件2.3提取视频文件属性2.4读取并保存视频3.使用OpenCV从相机捕获实时视频4... 查看详情

媒体基础视频重新编码产生音频流同步偏移

】媒体基础视频重新编码产生音频流同步偏移【英文标题】:MediaFoundationvideore-encodingproducingaudiostreamsyncoffset【发布时间】:2019-03-0723:35:18【问题描述】:我正在尝试编写一个简单的WindowsMediaFoundation命令行工具来使用IMFSourceReader... 查看详情

大数据技术之_24_电影推荐系统项目_02_python基础语法(代码片段)

第六章Python基础语法6.1Python综述6.1.1Python是什么6.1.2Python的发展6.1.3Python的特点6.2Python3安装6.2.1Python3和Python2的区别6.2.2Python3环境的安装(以windows为例)6.2.3Anaconda(巨蟒)安装教程(可选)6.3Python基本语法6.3.1编码6.3.2标识符6.3.3注释... 查看详情

opencv视频操作基础---videocapture类(代码片段)

  opencv中通过VideoCaptrue类对视频进行读取操作以及调用摄像头,下面是该类的API。1.VideoCapture类的构造函数:C++:VideoCapture::VideoCapture();C++:VideoCapture::VideoCapture(conststring&filename);C+&# 查看详情

视频基础封装格式和编码格式

参考文章:视频基础知识-封装格式和编码格式封装格式:avi、flv、MP4、rmvb、mkv之类编码格式:h.264、h.265、DivX之类码率:(kbps)=文件大小(KB)*8/时间(秒) 查看详情

视频基础知识扫盲

...,请看音视频系统学习的浪漫马车之总目录视频理论基础:视频基础知识扫盲音视频开发基础知识之YUV颜色编码解析视频编码原理——从孙艺珍的电影说起(一)解析视频编码原理——从孙艺珍的电影说起(... 查看详情

opencv学习笔记2基础:读取播放保存视频(代码片段)

文章目录1.读取摄像头2.读取视频3.保存视频References使用OpenCV也可以非常方便地读取、播放、保存视频,下面分别介绍。1.读取摄像头VideoCapture类用于从视频、图像序列、摄像头获取输入。先看如何读取摄像头输入:importcv... 查看详情

视频基础知识(代码片段)

码率单位时间传输的数据量,一般单位是kbps。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件。码率×时间(秒)÷8=视频的大小帧率测量显示帧数... 查看详情

音视频编解码之路:jpeg编码(代码片段)

...格式的“编解码器”,形成对真正编解码器的原理的基础认识,从而后续可以进一步研究真正意义上 查看详情

音视频编解码之路:jpeg编码(代码片段)

...格式的“编解码器”,形成对真正编解码器的原理的基础认识,从而后续可以进一步研究真正意义上 查看详情

研究android音视频-3-在android设备上采集音视频并使用mediacodec编码为h.264(代码片段)

...diaCodec硬编码器对Android设备采集的音视频编码封装音视频基础编码器封装音频编码器封装视频编码器使用新封装的视频编码器改造示例2使用Camera进行视频录制(YUV420SP)并保存为视频流(H.264)使用AudioRecord进行音频录制(PCM)并保存为... 查看详情