【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法

2023-10-26

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!

“纸上得来终觉浅,绝知此事要躬行”,只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会!

链接地址:H.264/AVC视频编解码技术详解

GitHub代码地址:点击这里

一、帧内预测模式在码流中的表示

在前面的博文:【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构中,我们解析了H.264码流中的宏块结构,并且分析了其中的语法元素mb_pred()。mb_pred()包含了帧内预测宏块的预测数据,其定义为:
在这里插入图片描述

其中,表示帧内预测模式的语法元素有:

  • prev_intra4x4_pred_mode_flag和prev_intra8x8_pred_mode_flag:表示帧内预测模式预测标识。如果该标识位为1,表示帧内预测模式的预测值就是实际的模式,否则就需要另外传递实际的帧内预测模式。
  • rem_intra4x4_pred_mode和rem_intra8x8_pred_modeg:表示额外传递的实际帧内预测模式。
  • intra_chroma_pred_mode:表示色度分量的预测模式,取值范围为[0,3],分别代表DC、水平、垂直和平面模式。

二、计算实际的帧内预测模式

以4×4模式的亮度信号为例,该部分的解析方式定义在标准文档的8.3.1.1节。

1. 计算相邻块的位置等参数

帧内预测模式的计算也利用了相邻块的模式相关性计算,计算所需的相邻块需要的是子块上方和左方的块的信息。

计算相邻块的预测模式首先要得到相邻块的位置参数。

1.1 计算相邻块的位置

计算亮度4×4相邻块的方式在标准文档的6.4.10.4节指定:

该过程的输入数据为当前亮度4×4块在宏块内的索引序号luma4x4BlkIdx;

输出数据为:

  • 相邻块A所属宏块地址mbAddrA:当前宏块或者左方宏块,根据luma4x4BlkIdx的不同选择;
  • 相邻块A的子块索引luma4x4BlkIdxA:左邻域子块在mbAddrA宏块内的索引;
  • 相邻块B所属宏块地址mbAddrB:当前宏块或者上方宏块,根据luma4x4BlkIdx的不同选择;
  • 相邻块B的子块索引luma4x4BlkIdxB:上邻域子块在mbAddrB宏块内的索引;

左方相邻块信息mbAddrA、luma4x4BlkIdxA和右侧相信块信息mbAddrB、luma4x4BlkIdxB的计算方法:通过子块位置的
坐标差值(xD,yD)。
在这里插入图片描述

多数情况下,H.264中的一个block都以4×4像素为大小,宽高相等,因此上图中ABCD四个邻块的坐标差值分别为:

  • 邻块A:(-1, 0)
  • 邻块B:(0, -1)
  • 邻块C:(4, -1)
  • 邻块D:(-1,-1)

1.2 获取相邻块参考像素的位置

当前块的位置可以认为是当前块左上角像素对于整个宏块的相对位置(x,y),该部分在6.4.3中指定。计算中使用了InverseRasterScan函数,该函数是个分段函数,在标准文档中定义为公式(5-7)。

由此,可以得到参考像素对于当前宏块的相对位置:

(xN,yN) = (x + xD, y + yD);

1.3 通过参考像素的位置的相对位置获取相邻块的参数

我们已经可以获取相邻块相对于当前宏块的位置(xN,yN),通过(xN,yN)获取相邻块参数的方法定义与6.4.11.1节(只考虑帧编码情况)。通过(xN,yN)的取值情况,可以判断参考像素所在宏块的位置以及其他信息:

  • xN < 0, yN < 0:参考像素位于当前宏块的左上角,宏块位置为mbAddrD。
  • xN < 0, 0 <= yN < 16:参考像素位于当前宏块左侧,宏块位置为AmbAddrA。
  • 0 <= xN < 16, yN < 0:参考像素位于当前宏块上方,宏块位置为mbAddrB。
  • 0 <= xN < 16, 0 <= yN < 16:参考像素位于当前宏块内部,宏块位置即为当前宏块。
  • xN >= 16, yN < 0:参考像素位于当前宏块右上方,宏块位置为mbAddrC。
  • xN >= 16, 0 <= yN < 16:参考像素位于当前宏块右方,实际上不可获得。
  • yN >=16:参考像素位于当前宏块的下一行,实际上不可获得。

从参考像素相对当前块位置(xN,yN)计算宏块位置,可以计算参考像素在参考宏块中的相对位置(xW,yW)。计算方法为:

xW = (xN + 16) % 16;
yW = (yN + 16) % 16;

1.4 获取指定的相邻块在所在宏块中的索引

如果参考像素所在的宏块实际上不可获得,则整个宏块索引皆定义为不可得,否则计算方式定义在6.4.12.1节中,即对于像素(x,y):

luma4x4BlkIdx = 8 * (y/8) + 4 * (x/8) + 2 * ((y%8)/4) + ((x%8)/4)

2. 推导flag数据dcPredModePredictedFlag

当满足以下条件的任意一种时,dcPredModePredictedFlag的值被设为1。

  • 宏块AmbAddrA不可获得;
  • 宏块AmbAddrB不可获得;
  • 宏块AmbAddrA可获得,但在标识位constrained_intra_pred_flag限定为1的情况下以帧间模式进行编码;
  • 宏块AmbAddrA可获得,但在标识位constrained_intra_pred_flag限定为1的情况下以帧间模式进行编码;

在其他情况下,dcPredModePredictedFlag的值被设为0。

3. 推导出相邻块的帧内预测模式intra4x4PredMode

这一步骤的目的是推导出相邻块A和B的帧内预测模式。而实际上有时候,如某个相邻块不可获得那么其预测模式也会有相应的替代方法。具体来说:

  • 如果dcPredModePredictedFlag被设为1,或者相邻块A或B所在的宏块不是Intra 4×4或8×8模式,那么A或者B的预测模式intra4x4(8x8)PredModeA/B的值设为2;
  • 若不满足前款条件,则继续判断:
    • 若相邻块A或B所在的宏块按照Intra4x4模式编码,那么其预测模式intra4x4(8x8)PredModeA/B设为Intra4x4PredMode[ luma4x4BlkIdxN ];
    • 如果按照Intra8x8模式进行编码,其预测模式设为Intra8x8PredMode[ luma4x4BlkIdxN >> 2 ]。

4. 从相邻块的帧内预测模式得出当前块的预测模式

现在我们已经获得的信息有:

  • 左方相邻块A的预测模式;
  • 上方相邻块B的预测模式;
  • 码流中读取的语法元素prev_intra4x4_pred_mode_flag;

从上述数据中获取当前块的预测模式的方式在文档8.3.1.1中如下表示:

predIntra4x4PredMode = Min( intraMxMPredModeA, intraMxMPredModeB )
if( prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] )
    Intra4x4PredMode[ luma4x4BlkIdx ] = predIntra4x4PredMode
else
    if( rem_intra4x4_pred_mode[ luma4x4BlkIdx ] < predIntra4x4PredMode )
        Intra4x4PredMode[ luma4x4BlkIdx ] = rem_intra4x4_pred_mode[ luma4x4BlkIdx ]
else
    Intra4x4PredMode[ luma4x4BlkIdx ] = rem_intra4x4_pred_mode[ luma4x4BlkIdx ] + 1
  1. 从左侧和上方相邻块的预测模式中选取较小的一个作为预先定义模式。
  2. 判断码流中读取的标志位prev_intra4x4_pred_mode_flag,如果该标志位为1,则预先定义模式就是当前块的预测模式;
  3. 如果标志位prev_intra4x4_pred_mode_flag为0,则根据码流中解析出的语法元素 rem_intra4x4_pred_mode判断。如果rem_intra4x4_pred_mode的值小于预定义模式的值则选用rem_intra4x4_pred_mode;如果大于等于预定义模式,则当前块的预测模式设为rem_intra4x4_pred_mode + 1。

5. 总结

其实标准文档中定义的繁杂无比的解析方式,简而言之可以分为两步:

  • 获取左侧和上方子块的预测模式,并选择较小的那个作为当前的模式预测值;
  • 码流中指定了要不要用这个预测值。如果用,那么这个预测值就是当前块的帧内预测模式;否则就从后续读取的预测模式中计算。

三、获取预测数据

该部分主要实现的功能是通过参考数据和帧内预测模式,获取当前子块的预测块。此部分定义在标准文档的8.3.1.2节。该步骤通过当前块的预测模式以及相邻块的参考像素值,输出当前块的一个预测块数据。

对于某一个4×4像素块,其参考像素包括13个像素点。如果(x,y)表示参考像素点相对于像素块左上像素的相对位置,则x和y的取值分别为:x=-1, y=(-1, 3);x=(0, 7), y=-1。以图表示如下所示:
在这里插入图片描述

根据当前块在图像中的位置(xO,yO)与参考像素的相对位置,可获取参考像素的绝对位置(xN,yN),计算方式为(xN,yN)=(xO+x, yO+y)。并参考上一章的方法可以获取参考像素所属的宏块地址mbAddrN号及宏块内相对位置(xW,yW)。

获取13个参考像素的像素值,首先判断某个像素值是否有效/可以获得。当下列4个条件满足任意一个,那么该像素便被判定为无效/不可获得:

  • 宏块mbAddrN不可获得;
  • 宏块mbAddrN为帧间预测模式,且标识位constrained_intra_pred_flag为1;
  • 宏块mbAddrN为SI类型,,且标识位constrained_intra_pred_flag为1,且当前宏块不是SI类型;
  • x大于3,且块索引luma4x4BlkIdx为3或11;(这一条说明了什么意思?视频教程中有详细解释)

如果上述条件皆不满足,那么参考像素p(x,y)被判定为有效,即可以用作4x4帧内预测。在宏块编号mbAddrN及块内相对位置(xW,yW)均已获取之后,再由mbAddrN获取宏块在图像中的位置即可获取p(x,y)的像素值。需要注意的一个特殊情况是:若像素p(3,-1)可获得,而p(4,-1)、p(5,-1)、p(6,-1)、p(7,-1)都不可获得,那么p(4,-1)、p(5,-1)、p(6,-1)、p(7,-1)这4个无效点都将替换为p(3,-1)的值参与预测运算。

四、九种帧内预测模式

在获取了13个预测像素点之后,再根据第2节计算出的预测模式,便可以获取相应的预测块数据。该部分在标准文档的8.3.1.2.1到8.3.1.2.9节定义。

模式0:垂直模式

当前块的帧内预测模式为0时,使用垂直模式生成预测块。该模式只有预测像素p(0,-1)~p(3,-1)有效的条件下可用。预测块的计算方法为:

pred4x4L[ x, y ] = p[ x, −1 ], with x, y = 0..3

模式1:水平模式

当前块的帧内预测模式为1时,使用水平模式生成预测块。该模式只有预测像素p(-1,0)~p(-1,3)的条件下可用。预测块的计算方法为:

pred4x4L[ x, y ] = p[ −1, y ], with x,y = 0..3

模式2:DC模式

当前块的帧内预测模式为2时,使用DC模式生成预测块。DC模式下预测块的所有16个像素点取值一致,计算需要根据预测像素有效性分为一下不同情况:

  • 如果上方相邻像素p(0,-1)~p(3,-1)和左方相邻像素p(-1,0)~p(-1,3)这8个点都有效,预测块的计算方法为
pred4x4L[x,y] = (p[0,−1] + p[1,−1] + p[2,−1] + p[3,−1] + p[−1,0] + p[−1,1] + p[−1,2] + p[−1,3] + 4) >> 3
  • 如果上方相邻像素p(0,-1)~p(3,-1)无效,而左方相邻像素p(-1,0)~p(-1,3)有效,预测块的计算方法为
pred4x4L[ x, y ] = ( p[ −1, 0 ] + p[ −1, 1 ] + p[ −1, 2 ] + p[ −1, 3 ] + 2 ) >> 2
  • 如果左方相邻像素p(-1,0)~p(-1,3)无效,而上方相邻像素p(0,-1)~p(3,-1)有效,预测块的计算方法为
pred4x4L[ x, y ] = ( p[ 0, −1 ] + p[ 1, −1 ] + p[ 2, −1 ] + p[ 3, −1 ] + 2 ) >> 2
  • 如果上述8个相邻像素均无效,预测块的计算方法为:
pred4x4L[ x, y ] = ( 1 << ( BitDepthY − 1 ) )

模式3:左下对角线模式

当前块的帧内预测模式为3时,使用左下对角线模式生成预测块。该模式只有预测像素p(0,-1)~p(7,-1)有效的条件下可用。预测块的计算方法为:

  • 当(x,y)=(3,3),即计算一个4×4像素块最右下方的一个点时:
pred4x4L[3,3] = ( p[ 6, −1 ] + 3 * p[ 7, −1 ] + 2 ) >> 2
  • 其他情况:
pred4x4L[ x, y ] = ( p[ x + y, −1 ] + 2 * p[ x + y + 1, −1 ] + p[ x + y + 2, −1 ] + 2 ) >> 2

模式4:右下对角线模式

当前块的帧内预测模式为4时,使用左下对角线模式生成预测块。该模式只有上方预测像素p(0,-1)~p(3,-1)、左方预测像素p(-1,0)~p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:

  • x > y :

pred4x4L[ x, y ] = ( p[ x − y − 2, −1] + 2 * p[ x − y − 1, −1 ] + p[ x − y, −1 ] + 2 ) >> 2

  • x < y :

pred4x4L[ x, y ] = ( p[ −1, y − x − 2 ] + 2 * p[ −1, y − x − 1 ] + p[ −1, y − x ] + 2 ) >> 2

  • x == y:

pred4x4L[ x, y ] = ( p[ 0, −1 ] + 2 * p[ −1, −1 ] + p[ −1, 0 ] + 2 ) >> 2

模式5:右垂直模式

当前块的帧内预测模式为5时,使用右垂直模式生成预测块。该模式只有上方预测像素p(0,-1)~p(3,-1)、左方预测像素p(-1,0)~p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:

首先计算中间变量:zVR = 2 * x - y,根据zVR取值

  • 若zVR等于0/2/4/6:
pred4x4L[ x, y ] = ( p[ x − ( y >> 1 ) − 1, −1 ] + p[ x − ( y >> 1 ), −1 ] + 1 ) >> 1
  • 若zVR等于1/3/5:
pred4x4L[ x, y ] = ( p[ x − ( y >> 1 ) − 2, −1] + 2 * p[ x − ( y >> 1 ) − 1, −1 ] + p[ x − ( y >> 1 ), −1 ] + 2 ) >> 2
  • 若zVR等于-1:
pred4x4L[ x, y ] = ( p[ −1, 0 ] + 2 * p[ −1, −1 ] + p[ 0, −1 ] + 2 ) >> 2
  • 其他情况,即zVR等于-2或-3:
pred4x4L[ x, y ] = ( p[ −1, y − 1 ] + 2 * p[ −1, y − 2 ] + p[ −1, y − 3 ] + 2 ) >> 2

模式6:下水平模式

当前块的帧内预测模式为6时,使用下水平模式生成预测块。该模式只有上方预测像素p(0,-1)~p(3,-1)、左方预测像素p(-1,0)~p(-1,3)和左上角对角像素点p(-1,-1)有效的条件下可用。预测块的计算方法为:

首先计算中间变量:zHD = 2 * y - x,根据zHD的取值

  • 若zHD等于0/2/4/6:
pred4x4L[ x, y ] = ( p[ −1, y − ( x >> 1 ) − 1 ] + p[ −1, y − ( x >> 1 ) ] + 1 ) >> 1
  • 若zHD等于1/3/5:
pred4x4L[ x, y ] = ( p[ −1, y − ( x >> 1 ) − 2 ] + 2 * p[ −1, y − ( x >> 1 ) − 1 ] + p[ −1, y − ( x >> 1 ) ] + 2 ) >> 2
  • 若zHD等于-1:
pred4x4L[ x, y ] = ( p[ −1, 0 ] + 2 * p[ −1, −1 ] + p[ 0, −1 ] + 2 ) >> 2
  • 其他情况,即zHD等于-2或-3:
pred4x4L[ x, y ] = ( p[ x − 1, −1 ] + 2 * p[ x − 2, −1 ] + p[ x − 3, −1 ] + 2 ) >> 2

模式7:左垂直模式

当前块的帧内预测模式为7时,使用左垂直模式生成预测块。该模式只有预测像素p(0,-1)~p(7,-1)有效的条件下可用。预测块的计算方法为:

  • 若y等于0或2;
pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), −1 ] + p[ x + ( y >> 1 ) + 1, −1 ] + 1) >> 1
  • 若y等于1或3:
pred4x4L[ x, y ] = ( p[ x + ( y >> 1 ), −1 ] + 2 * p[ x + ( y >> 1 ) + 1, −1 ] + p[ x + ( y >> 1 ) + 2, −1 ] + 2 ) >> 2

模式8:上水平模式

当前块的帧内预测模式为8时,使用上水平模式生成预测块。该模式只有预测像素p(-1,0)~p(-1,3)的条件下可用。预测块的计算方法为:

首先计算中间变量zHU:zHU = x + 2 * y;

  • 若zHU等于0/2/4:
pred4x4L[ x, y ] = ( p[ −1, y + ( x >> 1 ) ] + p[ −1, y + ( x >> 1 ) + 1 ] + 1 ) >> 1
  • 若zHU等于1或3:
pred4x4L[ x, y ] = ( p[ −1, y + ( x >> 1 ) ] + 2 * p[ −1, y + ( x >> 1 ) + 1 ] + p[ −1, y + ( x >> 1 ) + 2 ] + 2 ) >> 2
  • 若zHU等于5:
pred4x4L[ x, y ] = ( p[ −1, 2 ] + 3 * p[ −1, 3 ] + 2 ) >> 2
  • 其他情况,即zHU大于5:
pred4x4L[ x, y ] = p[ −1, 3 ]

五、亮度分量16×16模式的帧内预测方法

针对16×16模式亮度分量的帧内预测方法,定义于标准文档的8.3.3节。对于16×16模式的亮度块,共计需要33个参考像素点,分别为当前宏块的左侧16个点、上方16个点和左上角的一个像素点。类似于4×4模式,这33个参考像素相对于当前块相对位置为:

  • p(-1, -1):左上角对角像素;
  • p(-1,0)~p(-1,15):左侧相邻像素;
  • p(0,-1)~p(15,-1):上方相邻像素;

获取这33个预测像素点的方法也类似于4×4模式预测像素的获取,主要步骤如获取所在宏块的地址、所在宏块左上角像素的地址、参考像素点相对于整个宏块的地址等。

整个16×16块的预测模式不需要专门推导,因为在宏块模式中就已经指定了。共定义4种预测模式:

模式0:垂直模式

只有预测像素p(0,-1)~p(15,-1)有效时才可以使用,计算方法为:

predL[ x, y ] = p[ x, −1 ], with x, y = 0..15

模式1:水平模式

只有预测像素p(-1,0)~p(-1,15)有效时才可以使用,计算方法为:

predL[ x, y ] = p[ −1, y ], with x, y = 0..15

模式2:DC模式

16×16模式的DC预测模式同4×4模式的DC预测方法类似,判断左侧16个像素和上方16个像素的有效性,将其中有效部分的均值作为整个预测块的像素值。

模式3:平面模式

平面模式是相对于其他模式的一种比较独特的预测模式,只有在上述33个预测像素点均有效时才可以使用。计算方法为:

predL[ x, y ] = Clip1Y( ( a + b * ( x − 7 ) + c * ( y − 7 ) + 16 ) >> 5 ), with x, y = 0..15

上式中的a/b/c为中间变量,计算方式为:

a = 16 * ( p[ −1, 15 ] + p[ 15, −1 ] )
b = ( 5 * H + 32 ) >> 6
c = ( 5 * V + 32 ) >> 6

六、色度分量的帧内预测模式

色度信息的帧内预测在标准文档的8.3.4节。其原理与亮度分量的预测模式基本一致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法 的相关文章

  • Android交叉编译OpenCV+FFmpeg+x264的艰难历程

    前言 如果你没有兴趣看完本文 只想获得可编译的代码或编译后的产物 可以直接点击下面的链接 跟随步骤编译代码或直接下载我编译好的产物 注 编译顺序要按照 x264 gt FFmpeg gt OpenCV 这样来 x264 FFmpeg Ope
  • DirectShow中H.264 SourceFilter的Pin配置

    对DirectShow SourceFilter 要在Pin上输出H 264码流 需要注意如下设置 majortype MEDIATYPE Video 73646976 0000 0010 8000 00AA00389B71 subtype
  • H.264视频码流解析

    原理 H 264原始码流 又称为 裸流 是由一个一个的NALU组成的 他们的结构如下图所示 其中每个NALU之间通过startcode 起始码 进行分隔 起始码分成两种 0x000001 3Byte 或者0x00000001 4Byte 如
  • 时间戳问题汇总

    大家好 我刚接触流媒体不久 现在遇到一个非常奇怪的问题 向各位大侠请假 请你们指点 问题是这样的 用一个 VLC 流媒体客户端 去请求流媒体服务器上的数据 但是获得的数据播放速度明显快于1倍速 大概是 timestamp 不对 不知道是服务
  • H.264 编解码器解释[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在制作一个支持视频通话的应用程序 并且正在寻找解释 h 264 编解码器结构的教程 文档 我希望能够打包流 将其包装在数据报中 在接收端发送和解
  • H264 NAL 单元前缀

    我需要对 H264 NAL 单位分隔符前缀进行一些澄清 00 00 00 01 and 00 00 01 我正在使用 Intel Media SDK 生成 H264 并将其打包到 RTP 中 问题是到目前为止我只是在寻找00 00 00 0
  • AVSampleBufferDisplayLayer 如何显示 H.264

    我想分享我几天来学到的知识 没有太多可找到的 我仍然对声音感到困惑 欢迎提出意见和建议 这是我的代码片段 声明一下 property nonatomic retain AVSampleBufferDisplayLayer videoLaye
  • 如何用 SPS 和 PPS 数据填充 AVCodecContext 的“extradata”字段?

    问题是这样的 当解码 H264 流时ffmpeg 我可以获得SPS和PPS的原始数据 但我不知道如何将它们填充到extradata现场AVCodecContext 没有extradata 我无法正确解码帧 每次我打电话avcodec dec
  • FFmpeg 无需解码视频即可获取运动向量

    我想访问 h264 视频流的运动向量而不解码视频 我知道这显示了视频和运动矢量 ffplay i myvideo avi flags2 export mvs vf codecview mv pf bf bb 如何避免解码整个视频以节省 CP
  • 通过 ICodecAPI 为 H.264 IMFSinkWriter 编码器设置属性

    我试图通过检索 ICodecAPI 接口来调整通过 ActivateObject 创建的 H 264 编码器的属性 虽然我没有收到错误 但我的设置没有被考虑在内 代码在 Windows 10 下运行 我复制用于创建 IMFSinkWrite
  • 将 mkv 转换为 h264 FFmpeg

    EDIT 这个问题已经变得非常流行 并且是搜索 convert mkv to h264 ffmpeg 的最佳结果之一 因此我认为对于任何偶然发现这个问题的人来说 添加这一点是适当的 而不是使用 ffmpeg i input mkv c v
  • 无法播放某些视频

    我正在尝试通过我们的服务器在 Android 设备上播放电影 它不是一个媒体服务器 只是一个普通的 Apache 服务器 我们使用相同的 API 来访问 iPhone 上的视频 效果很好 在 Android 设备上 某些视频可以播放 而另一
  • 开发 H264 硬件解码器 Android - Stagefright 还是 OpenMax IL?

    我正在为 Android 开发 H264 H W 加速视频解码器 到目前为止 我已经接触过一些图书馆MediaCodec Stagefright OpenMax IL OpenMax AL and FFmpeg 经过一番研究 我发现 我找到
  • 视频流基础设施

    我们想建立一个实时视频聊天网站 并正在寻找基本的架构建议和 或针对要使用的特定框架的推荐 以下是该网站的基本功能 大多数流媒体将由一个人通过网络摄像头等进行现场直播 通常由 1 10 人观看 但最多可能有 100 多名观众 音频和视频不必是
  • 使用 bufferedimages 将视频编码为 h264?

    我正在尝试使用 java 将大量缓冲图像 由我的应用程序动态创建的预先保存的图像 转换为视频 并希望有一个库可以帮助完成该过程 我探索了许多不同的选项 例如 jcodec 没有关于如何使用它的文档 Xuggler 由于与jdk5及其相关库的
  • 解析 mdat MP4 中的 H264

    我有一个仅包含 MP4 容器中的 mdat 原子的文件 mdat中的数据包含AVC数据 我知道数据的编码参数 该格式似乎不是附件 B 字节流格式 我想知道我将如何解析这个 我尝试过搜索切片标题 但运气不佳 是否可以在没有 NAL 的情况下解
  • 时间戳和合成时间偏移

    H 264 缓冲区是否包含时间戳和解码时间戳信息 当我们获得 H 264 nalu 数据时 其中是否包含计时信息 如果您指的是原始 H 264 NAL 单元 那么它们不包含计时信息 如果指的是 PTS DTS 之类的内容 MKV MP4 T
  • 使用 Android MediaCodec 从摄像头编码 H.264

    我正在尝试让它在 Android 4 1 上运行 使用升级的 Asus Transformer 平板电脑 谢谢亚历克斯对我之前问题的回答 https stackoverflow com a 13420558 726156 我已经能够将一些原
  • 实现 HTML5 视频的最佳方式

    我知道 HTML5 视频比其支持者希望我们相信的要复杂得多 Safari 使用专有的 H 264 编解码器 而 Firefox Chrome 和 Opera 都支持开源 Theora Internet Explorer 两者都不支持 因此需
  • Html5 视频和 Flash 方法

    研究 HTML5 视频标签 并研究哪些浏览器支持哪些视频文件类型 我最初的想法是事情变得比仅仅使用 Flash 更困难 我想知道是否有人已经找到一些骨架代码 与视频的开发方法相结合 来执行以下操作 如果闪光灯可用 请使用它 如果没有 请尝试

随机推荐

  • Easy Code插件使用(附Spring Data JPA生成模板)

    文章目录 一 概述 二 安装 1 安装插件 2 连接数据库 三 生成代码 四 配置EasyCode 五 Spring Data JPA模板 1 controller类 2 service接口 3 serviceImpl实现类 4 dao接口
  • Python之体育竞技分析

    来源 Python语言程序设计 嵩天 一 问题描述 需求 高手过招 胜负只在毫厘 如何科学地分析体育竞技比赛 输入 球员的水平 输出 预测比赛成绩 二 具体分析 三 代码实现 from random import random 生成随机数
  • uniapp picker实现:市区镇村4级懒加载

    使用这种方法的原因 市区镇村4级数据太大 后台接口响应时间太长 方法实现 样式 view
  • 深度学习各方向开源数据集分类汇总

    转载自 深度学习各方向开源数据集分类汇总 持续更新中 哔哩哔哩 目录 1 小目标检测 2 目标检测 3 人体姿态估计 4 图像分割 语义分割 5 工业检测 6 人脸识别 7 自动驾驶 8 目标跟踪 9 动作识别 10 图像分类 11 图像识
  • 基于Matlab的数字图像水印技术

    基于Matlab 的数字图像水印技术 课题介绍 数字水印技术涉及到许多图像处理算法以及数学计算工具等 如果用普通编程工具实现上述算法 需要要花费大量的时间 MathWorks公司推出的一种简单 高效 功能极强的高级语言 MATLAB语言 它
  • 局部最小值问题

    问题 一个数组 相邻不等 返回任意一个局部最小值 重点是 相邻不等 否则无法用此方法 分析 所谓局部最小值 即左右相邻的数都比他大 当此数为第一个时 只需要右边的比他大即可 最右同理 代码 生成随机数组 相邻不等 void Random a
  • B站疯传!堪称最强!java超级面试资料

    我没有知名企业的工作经历 也没有多么耀目的成就 为什么他们会对我有那么深的印象呢 其实 在我看来 面试都是有迹可循的 也就是说 完全可以用很短的时间准备 却给面试官留下很深的印象 一 好的自我介绍决定了面试的80 不管你相不相信 你适不适合
  • DataX理论知识:简介-框架设计-数据抽取策略

    文章目录 一 简介 二 框架设计 三 数据抽取策略 一 简介 DataX 是一个 异构数据源 离线同步工具 可实现 各种 异构数据源 之间 稳定高效的数据同步功能 设计理念 从 蜘蛛网 到 星型链路 DataX充当一个中转站的角色 二 框架
  • 数据分析——数据特征描述、画箱线图、分组直方图

    数据特征描述 import pandas as pd catering sale r H school 数据挖掘 实验 实验二 catering sale xls data pd read excel catering sale index
  • 如何对SQL Server中的tempdb“减肥”

    SQL Server会自动创建一个名为tempdb的数据库作为工作空间使
  • checkstyle:off 使用注释暂时禁用checkstyle检查

    背景 本文介绍在Gradle中 如何跳过checkstyle对指定的文件 或者指定的代码块 的检查 步骤 1 在checkstyle xml的
  • Typescript常见表达式

    Typescript常见表达式 一 析构表达式 destructuring 1 数组析构表达式 用中括号括起来 var array1 1 2 3 4 function doSomething number1 number2 others c
  • Java基础---反射、多线程

    十 反射机制 1 Java反射机制概述 1 1Java Reflection Reflection 反射 是被犯为动态语言的关键 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息 并能直接操作任意对象的内部属性
  • datetime.time类介绍

    一 time是一个时间类 由时 分 秒 微妙组成 其构造函数如下 class datetime time hour minute second microsecond tzinfo 参数tzinfo 它表示时区信息 各参数的取值范围 hou
  • window安装docker Desktop和wsl2

    目录 一 先到微软商店下载terminal 也就是power shell 后续命令都在这个里面执行 二 安装docker Destop 1 打开控制面板 2 勾选Hyper V服务 3 根据提示重启电脑 等待更新即可 二 启动Docker
  • 字符串去重的5种方式

    public class Demo public static void main String args String str albcad12l gt sfg gt String newStr quChong5 str System o
  • 深度负反馈

    负反馈放大电路的方块图 因为负反馈放大电路有四种组态 而且对于同一种组态 具体电路也各不相同 所以为了研究负反馈放大电路的共同规律 可以利用方块图来描述所有电路 一 负反馈放大电路的方块图表示法 任何负反馈放大电路都可以用下图所示的方块图来
  • windows服务器禁用135,137,138,139,445端口方法

    windows服务器禁用135 137 138 139 445端口方法 1 防火墙新建入站和出站规则 注意 此方法只针对防火墙已开启的情况下才能实现禁用端口 打开控制面板 系统和安全 Windows Defender 防火墙 在左侧选择 高
  • 安装Apache Hive-2.3.3

    1 Hive是什么 1 1 Hive是数据仓库 数据仓库英文名DataWarehouse 可简写为DW或DWH 数据仓库 由数据仓库之父比尔 恩门 Bill Inmon 于1990年提出 主要功能仍是将组织透过资讯系统之联机事务处理 OLT
  • 【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档