精华内容
下载资源
问答
  • H3C官方模拟器HCL(H3C Cloud Lab)

    千人学习 2018-10-12 09:30:12
    HCL是H3C目前官方唯一出品的模拟器,整个产品的界面设计和性能比行业的其他H3C模拟器都要强大。华三云实验室(H3C Cloud Lab,简称HCL)是一款界面图形化的全真网络模拟软件,用户可以通过该软件实现H3C公司多个型号...
  • 本课程主要描述利用QT+FFMPEG,实现H264解码、编码,推流RTSP,解码RTSP的实现过程。 源码开源,学员可以直接利用源码进行二次开发设计
  • H.264/AVC视频编解码技术详解

    万人学习 2016-07-29 11:19:04
    本课程将从原理、标准和实现等多个角度,详细讲述了H.264/AVC视频编码标准的整体架构与技术细节,不但讲解了H.264/AVC标准协议文档中的内容,还通过实际的H.264码流分析/解码程序的开发来帮助观众更深入地理解H.264...
  • <stdafx.h>头文件免费下载

    千次下载 热门讨论 2013-03-13 14:45:56
    // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__C4B5DA9B_21...
  • 在VS2017中运行解决方案是有错误:“E1696 无法打开 源 文件 “stdio.h” ”… 原因: 这种问题一般发生在该项目代码是在网上下载而来的情况,或者电脑重装新的系统等情况,导致电脑系统与该项目生成时所采用...

    问题描述:

    在VS2017中运行解决方案是有错误:“E1696 无法打开 源 文件 “stdio.h”
    ”…
    在这里插入图片描述

    原因:

    这种问题一般发生在该项目代码是在网上下载而来的情况,或者电脑重装新的系统等情况,导致电脑系统与该项目生成时所采用的windows SDK 不同,从而在默认的位置(已发生变化)找不到许多源文件。

    解决方案:

    1. 在C++项目处(示例为“Fibonacci”),鼠标右击,弹出的菜单中左击选择“属性”。
    在这里插入图片描述
    2. 单击 “属性” 后,弹出以下对话框,找到并单击 “常规” ,找到“windows SDK 版本 ”在下拉选项中选择该电脑的windows SDK 版本(示例项目中默认的为8.1,应选择10.0.17134.0(我的电脑为Win10))即可。
    在这里插入图片描述

    展开全文
  • H.264 (H264)文件800_600.264,分辨率800*600,亲测可用
  • 全面介绍H3C路由器中路由策略和策略路由器基础知识和工作原理,并以实战方式介绍H3C路由器各种路由策略和策略路由的配置与管理方法
  • H264高清测试文件

    千次下载 热门讨论 2015-04-28 12:01:34
    H264高清测试文件,高清的1080p,共享给有需要的朋友使用,谢谢!
  • android MediaCodec 实现h264硬编解码全过程

    千次下载 热门讨论 2015-05-27 15:51:51
    MediaCodec 实现h264硬编解码全过程,视频数据从摄像头读出 yv12格式,转换为I420,投递给encoder,再从encoder取出编码后的h264数据投递给decoder后显示到surfaceView; 实现了udp将h264数据发送到指定主机,可通过...
  • C语言windows.h库的常用函数(三)

    千次阅读 多人点赞 2019-09-07 21:57:00
    SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置 参数 SetCursorPos函数拥有x和y两个整型参数,作为鼠标指针的坐标位置(其中0,0坐标对应屏幕左上角) 示例 #...

    SetCursorPos函数

    用途

    SetCursorPos函数是windows.h库中用来设置指针位置的函数,使用该函数鼠标指针将会直接跳至指定坐标位置

    参数

    SetCursorPos函数拥有x和y两个整型参数,作为鼠标指针的坐标位置(其中0,0坐标对应屏幕左上角)

    示例

    #include<windows.h>
    int main(){
    int a=0;
    while(a<1000){
    	SetCursorPos(1,1);    //设置鼠标坐标,其中x最大值不超过屏幕宽度(单位像素,下同),y值不超过屏幕高度
    	Sleep(100);
    	a++;
    	}
    	return 0;
    }
    
    

    GetClientRect函数

    用途

    GetClientRect函数可以用来获取窗口的尺寸,尺寸信息储存在RECT的right和bottom两个元素中,自我认为其实本质上这个函数是记录了窗口右下角顶点相对于窗口左上角顶点的水平/垂直距离。

    参数

    GetClientRect函数含有两个参数值,分别是目标窗口的句柄值 (见 C语言windows.h库的常用函数(一)) 和用来储存坐标信息的RECT型数据的内存地址

    示例

    #include<windows.h>
    #include<stdio.h>
    int main(){
      	HWND windows;    //句柄变量,第一节中有介绍
      	while(true){
      		windows=FindWindow(NULL,"新建文本文档.txt - 记事本");
     		RECT rectangle;      //矩形变量,用于记录矩形四个角的数据
      		GetClientRect(windows,&rectangle);
                    printf("%d,%d,%d,%d\n",rectangle.left,rectangle.top,rectangle.right,rectangle.bottom);
      		Sleep(1000);
      	}
    }
    
    

    GetCWindowRect函数

    用途

    此函数功能类似于GetClientRect函数,同样是可以用来获取窗口的尺寸,但是与GetClientRect函数不同的是它的返回值为窗口左上角和窗口右下角顶点相对于屏幕左上角的水平/垂直距离。

    参数

    与GetClientRect函数相同,GetCWindowRect函数含有的两个参数值,同样是目标窗口的句柄值和用来储存坐标信息的RECT型数据的内存地址

    示例

    #include<windows.h>
    #include<stdio.h>
    int main(){
      	HWND windows;
      	while(true){
      		windows=FindWindow(NULL,"新建文本文档.txt - 记事本");
      		RECT rectangle;
      		GetWindowRect(windows,&rect);
      		printf("%d,%d,%d,%d\n",rectangle.left,rectangle.top,rectangle.right,rectangle.bottom);
      		Sleep(300);
      	}
    }
    
    展开全文
  • H+后台主题UI框架 V4.1.0 最新版

    千次下载 热门讨论 2016-01-21 09:09:45
    最新版 H+ 后台主题UI框架 V4.1.0 最新版
  • 此前做过一个YUV420P像素数据编码为H.264码流的例子。对这个例子进行了升级。升级后编码器实现了YUV420P像素数据编码为H.265码流。 尽管该视频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个视频所有必备...
  • aac+h264封装MP4

    热门讨论 2014-10-23 11:13:36
    aac+h264封装MP4,适用于我们项目的平台,需要使用的朋友可以修改相关参数,有问题可以反馈给我skdkjxy@163.com,谢谢
  • android硬编码h264

    千次下载 热门讨论 2013-12-26 15:20:25
    android 用新api mediacodec硬编码h264, 发送到vlc播放。
  • bios .h(添加bios.h的头文件).rar

    千次下载 热门讨论 2014-12-10 16:17:22
    bios .h(添加bios.h的头文件).rar
  • android h264 编码 解码 encode decode模块(演示)

    千次下载 热门讨论 2014-07-27 17:36:48
    -C、C++方式实现,能和android界面完美融合。 -直接对原始的h264解码,对yuv编码。 -兼容上绝大多数android手机,2.3.3以上。 -稳定可靠,己在XX局视频会议等系统中使用了。
  • h264和h265的区别

    万次阅读 2018-11-30 13:08:36
    相关索引:... 目录 1. H.264与H.265的主要差异 2,压缩性能比较 3. 各模块技术差异汇总 4. 块划分结构 5. 帧内预测模式 6. 帧间预测 7. 去块滤波 8. 采样点自适应偏移(Sample Adaptiv...

    相关索引:https://blog.csdn.net/knowledgebao/article/details/84776869


    目录

    1.    H.264与H.265的主要差异

    2,压缩性能比较

    3.    各模块技术差异汇总

    4.    块划分结构

    5.    帧内预测模式

    6.    帧间预测

    7.    去块滤波

    8.   采样点自适应偏移(Sample AdaptiveOffset)滤波

    9.   Tile

    10.  WPP

    11.  Dependentslice

    12.  其他相关技术

    H.265 High Efficiency Video Coding

    技术特点

    预测块大小

    内部色深的增加

    并行处理工具(Parallel processing tools)

    熵编码(Entropy coding)

    帧内预测(intra prediction)

    运动补偿(Motion compensation)

    运动矢量预测Motion vector prediction

    反量化(Inverse transforms)

    环路滤波器

    解块滤波器

    样本自适应偏移量

    编码效率 coding efficiency


    1,同样的画质和同样的码率,H.265比H2.64 占用的存储空间要少理论50%。
    2,如果存储空间一样大,那么意味着,在一样的码率下H.265会比H2.64 画质要高一些理论值是30%~40%

    比起H.264/AVC,H.265/HEVC提供了更多不同的工具来降低码率,以编码单位来说, 最小的8x8到最大的64x64。信息量不多的区域(颜色变化不明显,比如车体的红色部分和地面的灰色部分)划分的宏块较大,编码后的码字较少,而细节多的地方(轮胎)划分的宏块就相应的小和多一些,编码后的码字较多,这样就相当于对图像进行了有重点的编码,从而降低了整体的码率,编码效率就相应提高了。同时,H.265的帧内预测模式支持33种方向(H.264只支持8种),并且提供了更好的运动补偿处理和矢量预测方法。

    反复的质量比较测试已经表明,在相同的图象质量下,相比于H.264,通过H.265编码的视频码流大小比H.264减少大约39-44%。由于质量控制的测定方法不同,这个数据也会有相应的变化。通过主观视觉测试得出的数据显示,在码率减少51-74%的情况下,H.265编码视频的质量还能与H.264编码视频近似甚至更好,其本质上说是比预期的信噪比(PSNR)要好。这些主观视觉测试的评判标准覆盖了许多学科,包括心理学和人眼视觉特性等,视频样本非常广泛,虽然它们不能作为最终结论,但这也是非常鼓舞人心的结果。

    目前的HEVC标准共有三种模式:Main、Main10和Main Still Picture。Main模式支持8bit色深(即红绿蓝三色各有256个色度,共1670万色),Main10模式支持10bit色深,将会用于超高清电视(UHDTV)上。前两者都将色度采样格式限制为4:2:0。预期将在2014年对标准有所扩展,将会支持4:2:2和4:4:4采样格式(即提供了更高的色彩还原度)和多视图编码(例如3D立体视频编码)。

    事实上,H.265和H.264标准在各种功能上有一些重叠。例如,H.264标准中的Hi10P部分就支持10bit色深的视频。另一个,H.264的部分(Hi444PP)还可以支持4:4:4色度抽样和14比特色深。在这种情况下,H.265和H.264的区别就体现在前者可以使用更少的带宽来提供同样的功能,其代价就是设备计算能力:H.265编码的视频需要更多的计算能力来解码。目前已经有支持H.265解码的芯片发布了——美国博通公司(Broadcom)在今年1月初的CES大展上发布了一款Brahma BCM 7445芯片,它是一个采用28纳米工艺的四核处理器,可以同时转码四个1080P视频数据流或解析分辨率为4096×2160的H.265编码超高清视频

    H.265标准的诞生是在有限带宽下传输更高质量的网络视频。对于大多数专业人士来说,H.265编码标准并不陌生,其是ITU-TVCEG继H.264之后所制定的视频编码标准。H.265标准主要是围绕着现有的视频编码标准H.264,在保留了原有的某些技术外,增加了能够改善码流、编码质量、延时及算法复杂度之间的关系等相关的技术。H.265研究的主要内容包括,提高压缩效率、提高鲁棒性和错误恢复能力、减少实时的时延、减少信道获取时间和随机接入时延、降低复杂度。

    1.    H.264与H.265的主要差异

    CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit

    2,压缩性能比较

     

    3.    各模块技术差异汇总

     

    4.    块划分结构


    在H.265中,将宏块的大小从H.264的16×16扩展到了64×64,以便于高分辨率视频的压缩。同时,采用了更加灵活的编码结构来提高编码效率,包括编码单元(CodingUnit)、预测单元(PredictUnit)和变换单元(TransformUnit)。

    其中:

    编码单元CU类似于H.264/AVC中的宏块的概念,用于编码的过程。

    预测单元PU是进行预测的基本单元,

    变换单元TU是进行变换和量化的基本单元。

    这三个单元的分离,使得变换、预测和编码各个处理环节更加灵活,也有利于各环节的划分更加符合视频图像的纹理特征,有利于各个单元更优化的完成各自的功能。

    RQT是一种自适应的变换技术,这种思想是对H.264/AVC中ABT(AdaptiveBlock-size Transform)技术的延伸和扩展。

    对于帧间编码来说,它允许变换块的大小根据运动补偿块的大小进行自适应的调整;

    对于帧内编码来说,它允许变换块的大小根据帧内预测残差的特性进行自适应的调整。

    大块的变换相对于小块的变换,一方面能够提供更好的能量集中效果,并能在量化后保存更多的图像细节,但是另一方面在量化后却会带来更多的振铃效应。

    因此,根据当前块信号的特性,自适应的选择变换块大小,如下图所示,可以得到能量集中、细节保留程度以及图像的振铃效应三者最优的折中。

    Fig. 灵活的块结构示意图

    5.    帧内预测模式

     

    6.    帧间预测

    7.    去块滤波

    本质上H.265的去块滤波与H.264的去块滤波及流程是一致的,做了如下最显著的改变:

    Ø  滤波边界: H.264最小到4x4边界滤波;而H.265适应最新的CU、PU和TU划分结构的滤波边缘,最小滤波边界为8x8,

    Ø  滤波顺序:H264先宏块内采用垂直边界,再当前宏块内水平边界;而H.265先整帧的垂直边界,再整帧的水平边界

    ALF在编解码环路内,位于Deblock和SAO之后,用于恢复重建图像以达到重建图像与原始图像之间的均方差(MSE)最小。

    ALF的系数是在帧级计算和传输的,可以整帧应用ALF,也可以对于基于块或基于量化树(quadtree)的部分区域进行ALF,如果是基于部分区域的ALF,还必须传递指示区域信息的附加信息。

    8.   采样点自适应偏移(Sample AdaptiveOffset)滤波

    SAO在编解码环路内,位于Deblock之后,通过对重建图像的分类,对每一类图像像素值加减一个偏移,达到减少失真的目的,从而提高压缩率,减少码流。

    采用SAO后,平均可以减少2%~6%的码流,而编码器和解码器的性能消耗仅仅增加了约2%。

    9.   Tile

    10.  WPP

     

    11.  Dependentslice

    12.  其他相关技术

    Ø  Transform_skip模式:transform_skip_flag,该模式不进行变换,但是要进行量化,该模式对文本桌面视频有较好效果

    Ø  内部比特深度增加:为了保证中间预测、变换以及量化过程中的内部比特精度,以达到更好的压缩性能

    H.265 High Efficiency Video Coding

    H.265是ITU-T VCEG继H.264之后所制定的高压缩率的视频压缩格式。H.265视频格式标准在2013年1月25日由国际电信联盟(ITU)正式宣布,最高分辨率可达 8192×4320。 NGVC想要将比特率减少了50%,同时主要图像质量和计算复杂性与H.264相比,计算复杂度从提升到3倍。HEVC面向下一代HDTV设计,特性如帧扫描(progressive scanned)、支持采样率到 4320p (8192×4320),增强的动态范围调整和噪声抑制等。

    图2. H.265编码流程图

    技术特点

    • 二维不可分离的自适应插补滤波器

    • 可分离的 AIF

    • 定向的AIF

    • 不再使用运动补偿与1/8-pel运动矢量

    • Supermacroblock结构到64x64转换(H.264仅到32x32)

    • 自适应预测误差编码组织(APEC)

    • 自适应量化矩阵选择(AQMS)

    • 运动矢量选择与编码的竞争方式

    • 针对内部编码的模块相依的KLT

    预测块大小

    HEVC将之前标准中定义的宏块(macroblocks)用一种最大到64x64像素的并且可以进一步细分成可变大小的块。HEVC把编码树单元(coding tree units (CTUs))变成亮度和色度的编码块(coding tree blocks (CTBs))。一个CTB可以大小为64x64、32x32或者16x16.这样帧内(intra-picture)和帧间(inter-picture)的预测块(prediction units,PU)大小从64x64到4x4大小,只是对于双向预测,只能到8x4到4x8大小。预测残差编码的变换块大小可以是32x32、16x16、8x8、4x4.

    内部色深的增加

    内部色深增加(Internal bit depth increase (IBDI))可以让编码器运行在色宽更高的内部状态。IBDI最多可以作用于14-bit位宽。

    并行处理工具(Parallel processing tools)

    可以把图像分成独立编解码的矩形块和条带,即条带slice和tile瓷片的概念。条带大部分可以单独解码,只是最终需要同步成一个视频流。条带可以编码成条带间没有预测,互相独立。当然条带间可能还是需要环路滤波的。

    熵编码(Entropy coding)

    HEVC采用基于上下文自适应的熵编码算法(context-adaptive binary arithmetic coding (CABAC)),和H.264类似。只不过HEVC只支持CABAC编码。

    帧内预测(intra prediction)

    HEVC的帧内预测有33个方向模式,而h.264中只有8个,HEVC还指定了planar和DC帧内预测模式。

    运动补偿(Motion compensation)

    HEVC采用半像素或者1/4像素的精度运动补偿,以及7抽头或者8抽头的滤波器。H.264使用半像素精度和6抽头的滤波器。对于4:2:0视频的色度分量有1/8像素精度和4抽头的滤波器。HEVC中的加权预测可以是单向也可以是双向的预测。

    运动矢量预测Motion vector prediction

    HEVC定义了16-bit的水平和垂直运动矢量,支持范围到[-32768, 32767],即最多-8192到8191.75个亮度像素点,H.264只支持到-512到511.75个像素点。HEVC的MV模式有高级运动矢量预测(Advanced Motion Vector Prediction (AMVP))和合并模式。合并模式运行从邻近块继承mv向量值,从而有skip和direct模式。

    反量化(Inverse transforms)

    HEVC中预测残差编码的变换块大小可以是32x32、16x16、8x8、4x4.一个CTB可以递归的分成4个或者更多个TU。TU会使用基本的变换DCT(discrete cosine transform),另外4x4的帧内预测亮度块的残差采用从DST( discrete sine transform)中推导的整数变换。这相对于原来的4x4亮度变换有1%的码率降低。色度块采用和亮度块相同的TU大小。

    环路滤波器

    HEVC有两个环路滤波器,解块滤波器(DBF, deblocking filter)与样本自适应偏移量(SAO,sample adaptive offset)滤波器 (DBF)。Deblocking滤波器和H.264/MPEG-4 AVC中的类似,HEVC中的DBF只能用于8x8的块(提高并行处理性能),而H.264适用于4x4的块。HEVC中DBF的强度从0到2.对垂直边界做水平滤波,对水平边界做垂直滤波。SAO滤波器在DBF滤波器之后,为了更好的重建原始图像。每个CTB的SAO滤波器可以使能或者禁止边界偏移模式或者子段偏移模式。

    解块滤波器

    DBF使用H.264/MPEG-4 AVC类似的设计,更好的支持并发处理是类似的。在HEVC的DBF只适??用于一个8×8个采样网格,而与H.264 / MPEG-4 AVC的DBF适用的一个4×4个采样网格。的DBF使用一个8×8个采样网格,因为它会导致没有明显的降解,并显著提高了并发处理,因为的DBF不再导致级联与其他操作的相互作用。另一个变化是HEVC只允许为0?2的三个DBF长处。HEVC也需要的DBF首先应用到画面的垂直边缘的水平滤波和只有在那之后它应用对于水平边缘的垂直滤波的图片,这允许为多个并发线程的DBF。

    样本自适应偏移量

    在DBF之后的使用SAO过滤器,并使用偏移以产生更好地重建原始信号。每C个TB的SAO滤波器可有两个模式:边缘偏移模式??或带偏移模式。边缘偏移量模式中通过比较的取样的值,根据比较两个邻居,将样品分为五类之一:最小,两种边缘,最大值,或两者都不是,对于每个第一四类施加一个偏移量。能带偏移的模式可分类成32个频带,并选择四个连续频带传送偏移量。SAO滤波器设计来以提高图像质量,并减少振荡效应.

    编码效率 coding efficiency

    图1各种视频标准相同PSNR下的对比

    视频编码标准

    平均码率下降

    H.264/MPEG-4 AVC HP

    MPEG-4 ASP

    H.263 HLP

    H.262/MPEG-2 MP

    HEVC MP

    35.4%

    63.7%

    65.1%

    70.8%

    H.264/MPEG-4 AVC HP

    -

    44.5%

    46.6%

    55.4%

    MPEG-4 ASP

    -

    -

    3.9%

    19.7%

    H.263 HLP

    -

    -

    -

    16.2%

    视频编码效率通常用peak signal-to-noise ratio (PSNR)客观评价指标来度量。HEVC受益于更大的Coding Tree Block (CTB)大小。HM-8.0 HEVC视频分辨率为2560×1600,和使用64×64 CTB大小相比,如果采用 32×32 CTB大小,码率增加5.7%,如果使用16×16 CTB大小,码率增加28.2%。而且分辨率越大,CTB大小越大的码率减少越多同时解码时间也减少。上表是HEVC Main Profile (MP)和H.264/MPEG-4 AVC High Profile (HP), MPEG-4 Advanced Simple Profile (ASP), H.263 High Latency Profile (HLP),以及 H.262/MPEG-2 Main Profile (MP)的编码效率比较。测试序列包括了5个HD分辨率和4个WVGA (800×480)分辨率。主观测试的结果表明相同的主观质量下,HEVC MP比H.264/MPEG-4 AVC HP码率平均下降49.3%.


    参考资料:

    1,https://blog.csdn.net/fireroll/article/details/77827156

    2,https://blog.csdn.net/owen7500/article/details/47334929

    3,https://wenku.baidu.com/view/93f15abebb4cf7ec4bfed038.html


    有任何问题可以联系:knowlegebao@163.com

    展开全文
  • 使用FFmpeg调用NVIDIA GPU实现H265转码H264背景H265和H264一些基本知识H265码流nalu头H264码流nalu头补充:IDR帧和I帧的关系转码的一些基本知识软编码和硬编码如何区分软编码和硬编码比较目前的主流GPU加速平台目前...

    背景

    最近项目遇到难题,就是web前端需要播放视频设备出来的H265码流,但目前只支持播放H264的码流,所以想快速解决这个问题的话,我想出了两种解决方案。

    方案1:直接对H265进行RTMP封装成自定义FLV发布给前端播放,web前端得支持解析H265播放的控件,如果使用这种方案目前基本很难找到适用的开源方案,而且后端和前端的改动可以说基本是推倒重来,所以这种方案在短时间内是很难实现的。
    方案2:做一个转码服务对H265进行解码再编码成H264,web前端播放方案就无需做任何改动,转码的话有软件转码和硬件转码两种方案,由于软件转码非常耗CPU资源,基本可以排除这种想法,那就只能考虑硬件转码的方案了,本文下面要介绍的就是硬件转码的方案。

    对比这两种方案,第二种方案相对会合理一些,能比较快速解决H265的播放问题。

    H265和H264一些基本知识

    1、H265码流nalu头

    00 00 00 01 40 01 的nuh_unit_type的值为 32, 语义为视频参数集 VPS
    00 00 00 01 42 01 的nuh_unit_type的值为 33, 语义为序列参数集 SPS
    00 00 00 01 44 01 的nuh_unit_type的值为 34, 语义为图像参数集 PPS
    00 00 00 01 4E 01 的nuh_unit_type的值为 39, 语义为补充增强信息 SEI
    00 00 00 01 26 01 的nuh_unit_type的值为 19, 语义为可能有RADL图像的IDR图像的SS编码数据 IDR
    00 00 00 01 02 01 的nuh_unit_type的值为 1, 语义为被参考的后置图像,且非TSA、非STSA的SS编码数据

    2、H264码流nalu头

    00 00 00 01 06 type的值为 06, NALU_TYPE_SEI 语义为补充增强信息 SEI
    00 00 00 01 67 type的值为 67, NALU_TYPE_SPS 语义为序列参数集 SPS
    00 00 00 01 68 type的值为 68, NALU_TYPE_PPS 语义为图像参数集 PPS
    00 00 00 01 65 type的值为 65, NALU_TYPE_IDR 语义为IDR图像中的片 IDR

    3、补充:IDR帧和I帧的关系

    IDR帧就是I帧,但是I帧不一定是IDR帧,在一个完整的视频流单元中第一个图像帧是IDR帧,IDR帧是强制刷新帧,在解码过程中,当出现了IDR帧时,要更新sps、pps,原因是防止前面I帧错误,导致sps,pps参考I帧导致无法纠正。
    再普及一个概念是GOP,GOP的全称是Group of picture图像组,也就是两个I帧之间的距离,GOP值越大,那么I帧率之间P帧和B帧数量越多,图像画质越精细,如果GOP是120,如果分辨率是720P,帧率是60,那么两I帧的时间就是120/60=2s.

    转码的一些基本知识

    1、软编码和硬编码如何区分

    软编码:使用CPU进行编码
    硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA芯片等

    2、软编码和硬编码比较

    软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。
    硬编码:性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。

    3、目前的主流GPU加速平台

    NVIDIA、INTEL、AMD等
    

    4、目前主流的GPU平台开发框架

    CUDA:NVIDIA的封闭编程框架,通过框架可以调用GPU计算资源
    AMD APP:AMD为自己的GPU提出的一套通用并行编程框架,标准开放,通过在CPU、GPU同时支持OpenCL框架,进行计算力融合。
    OpenCL:开放计算语言,为异构平台编写程序的该框架,异构平台可包含CPU、GPU以及其他计算处理器,目标是使相同的运算能支持不同平台硬件加速。
    Inel QuickSync:集成于Intel显卡中的专用视频编解码模块。

    5、流程区别

    硬解软编:read(ffmpeg)->decoder(NVIDIA cuvid)->encoder(ffmpeg)
    软解软编:read(ffmpeg)->decoder(ffmpeg)->encoder(ffmpeg)
    软解硬编:read(ffmpeg)->decoder(ffmpeg)->encoder(NVIDIA nvenc)

    NVIDIA+ffmpeg硬件加速部署

    1、环境安装部署:Windows10 + ffmpeg4.1.3 + NVIDIA GeForce GTX 1660Ti

    注意:需要你的电脑上有如下https://developer.nvidia.com/video-encode-decode-gpu-support-matrix#Encoder之一的NVIDIA显卡,我自己使用的是GeForce GTX 1660Ti这个型号的显卡(在NVIDIA tesla T4这块显卡上面也验证过,可以同时转码八路以上)

    1.1 ffmpeg Windows版本的下载

    下载地址:https://ffmpeg.zeranoe.com/builds/
    在这里插入图片描述

    支持下载static/dev/shared
    我用的ffmpeg版本是4.1.3

    1.2 下载NVIDIA驱动(GTX 1660Ti)

    下载地址:https://www.nvidia.com/download/index.aspx?lang=en-us
    在这里插入图片描述
    版本451.77 (11.0)地址:https://www.nvidia.cn/Download/driverResults.aspx/162530/cn
    在这里插入图片描述

    1.3 下载cuda toolkit(GTX 1660Ti)

    下载地址:https://developer.nvidia.com/cuda-toolkit
    版本451.48(11.0)地址:https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal
    在这里插入图片描述

    安装就不做介绍了。

    1.4 用ffmpeg.exe -hwaccels显示所有可用的硬件加速器

    我下载的FFmpeg就已经包含了英伟达的硬件加速器了
    在这里插入图片描述

    1.5 用ffmpeg.exe -codecs查看编解码器支持

    DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid ) (encoders: libx264 libx264rgb h264_amf h264_nvenc h264_qsv nvenc nvenc_h264 )
    DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv )
    h264_cuvid:h264硬件解码器
    h264_nvenc:h264硬件编码器
    hevc_cuvid:h265硬件解码器
    hevc_nvenc:h265硬件编码器
    在这里插入图片描述

    NVENC介绍

    NVENC是由NVIDIA开发的一个API允许使用NVIDIA GPU显卡执行h.264和HEVC(就是H.265)编码。FFmpeg通过h264_nvenc和hevc_nvenc编码器支持NVENC。

    为了在FFmpeg中启用它,你需要:
    一个支持硬件编解码的英伟达GPU
    英伟达GPU驱动程序
    没有配置——disable-nvenc的ffmpeg

    使用的例子:

    ffmpeg -i input -c:v h264_nvenc -profile high444p -pixel_format yuv444p -preset default output.mp4
    

    你可以通过ffmpeg -h encoder=h264_nvenc或ffmpeg -h encoder=hevc_nvenc看到可用的预设值、其他选项和编码器信息。
    注意:如果你发现没有NVENC功能的设备的错误,请确保你的编码是支持的像素格式。见编码器信息如上所示。

    CUDA / CUVID / NvDecode
    CUVID现在也被Nvidia称为nvdec,可以在Windows和Linux上进行解码。结合nvenc,它提供了完整的硬件转码。
    CUVID提供H264, HEVC, MJPEG, mpeg1/2/4, vp8/9, vc1解码器。编解码器支持因硬件而异。

    1、使用CUVID解码器,本例中CUVID解码器将帧复制到系统内存中:

    ffmpeg -c:v h264_cuvid -i input output.mkv
    

    2、使用CUVID和NVENC实现全硬件转码:

    ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -c:v h264_nvenc -preset slow output.mkv
    

    3、部分硬件转码,帧通过系统内存(这是必要的转码10位内容):

    ffmpeg -c:v h264_cuvid -i input -c:v h264_nvenc -preset slow output.mkv
    

    4、如果编译ffmpeg时支持libnpp,可以使用它在链中插入一个基于GPU的scaler:

    ffmpeg -hwaccel_device 0 -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow output.mkv
    

    hwaccel_device选项可以用来指定ffmpeg中的cuvid hwaccel要使用的GPU:。

    FFmpeg命令行硬件转码H265裸流文件

    使用NVIDIA GTX1660ti显卡 + ffmpeg4.1.3

    1、H265软件解码,H264硬件编码

    ffmpeg.exe -i h265toh264.h265 -vcodec h264_nvenc -r 30 -y h265toh264.h264
    

    2、全硬件转码(H265硬件解码,H264硬件编码)

    ffmpeg.exe -hwaccel cuvid -c:v hevc_cuvid -i h265toh264.h265 -c:v h264_nvenc -r 30 -y h265toh264.h264
    

    FFmpeg API进行H265裸流文件进行转码H264

    在VS2017工程下面使用ffmpeg API的方式实现H265的软件解码成YUV并使用h264_nvenc(NVIDIA硬件编码器)或libx264(h264软件编码器)实现YUV编码成H264.
    直接上源码:

    1、主体代码

    #include "H265Decoder.h"
    #include "H264Encoder.h"
    
    #define ISSTORAGEYUV 0
    
    int main()
    {
    	int fpts = 0;
    	char frame_buf[1024] = { 0 };
    	int H265Lenth = 0;
    	char H265Buf[1024 * 512];
    
    	H265Decoder h265Decoder;
    	H264Encoder h264Encoder;
    	//初始化编解码器时需要把正确的分辨率送进去
    	/*h265Decoder.Init(1920, 1080);
    	h264Encoder.Init(1920, 1080);*/
    	h265Decoder.Init(480, 272);
    	h264Encoder.Init(480, 272);
    	
    	//读取文件
    	FILE * InFile = fopen("h265toh264.h265", "rb");
    	//输出文件
    #if ISSTORAGEYUV
    	FILE * OutFile = fopen("h265toYUV.YUV", "wb");
    #else
    	FILE * OutFile = fopen("h265toh264.h264", "wb");
    #endif
    	//打印ffmpeg输出日志等级
    	printf("log level %d \n", av_log_get_level());
    	//设置ffmpeg输出日志等级
    	av_log_set_level(AV_LOG_INFO);
    	
    	while (true)
    	{
    		int iReadSize = fread(frame_buf, 1, 512, InFile);
    		if (iReadSize <= 0)
    		{
    			break;
    		}
    		memcpy(H265Buf + H265Lenth, frame_buf, iReadSize);
    		H265Lenth = H265Lenth + iReadSize;
    		//获取一帧数据
    		while (true)
    		{
    			bool OneFrame = false;
    			if (H265Lenth <= 8)
    			{
    				break;
    			}
    			for (int i = 4; i < H265Lenth - 4; i++)
    			{
    				//解析H265的nalu头
    				if (H265Buf[i] == 0x00 && H265Buf[i + 1] == 0x00 && H265Buf[i + 2] == 0x00 && H265Buf[i + 3] == 0x01)
    				{
    					h265Decoder.AddData(H265Buf, i);
    					while (true)
    					{
    						char * pOutData = NULL;
    						int OutSize = 0;
    #if ISSTORAGEYUV
    						//获取H265解码后的YUV并存文件
    						if (!h265Decoder.GetYUVData(pOutData, OutSize))
    						{
    							break;
    						}
    						fwrite(pOutData, 1, OutSize, OutFile);
    #else
    						//获取H265解码frame并编码H264存文件
    						AVFrame *frame = NULL;
    						frame = h265Decoder.GetData();
    						if (!frame) {
    							break;
    						}
    						frame->pts = fpts++;
    						h264Encoder.encode(frame, pOutData, OutSize);
    						fwrite(pOutData, 1, OutSize, OutFile);
    #endif
    
    					}
    					H265Lenth = H265Lenth - i;
    					memcpy(H265Buf, H265Buf + i, H265Lenth);
    					OneFrame = true;
    					break;
    				}
    			}
    			if (OneFrame)
    			{
    				continue;
    			}
    			else
    			{
    				break;
    			}
    		}
    	}
    	if (OutFile) {
    		fclose(OutFile);
    		OutFile = NULL;
    	}
    	if (InFile) {
    		fclose(InFile);
    		InFile = NULL;
    	}
    	printf("pasing end\r\n");
    	return 0;
    }
    

    2、流程解析

    1、初始化编解码器,需要把H265正确的分辨率格式送进去初始化

    	h265Decoder.Init(480, 272);
    	h264Encoder.Init(480, 272);
    

    2、循环读取H265文件,组成一帧完整的H265(根据H265的nalu头00 00 00 01进行判断)

    	if (H265Buf[i] == 0x00 && H265Buf[i + 1] == 0x00 && H265Buf[i + 2] == 0x00 && H265Buf[i + 3] == 0x01)
    

    3、把一帧H265送进去H265解码器进行软件解码

    	h265Decoder.AddData(H265Buf, i);
    

    4、获取H265解码后的YUV可以选择存YUV文件或送进去H264编码器进行编码后存成H264文件

    #if ISSTORAGEYUV
    			//获取H265解码后的YUV并存文件
    			if (!h265Decoder.GetYUVData(pOutData, OutSize))
    			{
    				break;
    			}
    			fwrite(pOutData, 1, OutSize, OutFile);
    #else
    			//获取H265解码frame并编码H264存文件
    			AVFrame *frame = NULL;
    			frame = h265Decoder.GetData();
    			if (!frame) {
    				break;
    			}
    			frame->pts = fpts++;
    			h264Encoder.encode(frame, pOutData, OutSize);
    			fwrite(pOutData, 1, OutSize, OutFile);
    #endif
    

    3、遇到的问题

    调试期间,有遇到调用h264_nvenc硬件编码器的时候出错,排查后发现,H265解码后的原始视频格式是YUVJ420P,原因是有的视频设备出来的H265视频流,编码前的数据是YUVJ420P,不全部都是YUV420P,如果直接把这个原始的YUVJ420P送进去NVIDIA硬件编码器的时候会直接导致程序奔溃,后来经过一番排查,才发现原来NVIDIA是不支持对YUVJ420P直接进行编码的,如下图所示,只对YUV420P或者YUV444P支持H264编码。
    在这里插入图片描述针对这个问题,只能用ffmpeg的sws_scale把YUVJ420P转换成YUV420P后再送给h264_nvenc硬件编码器进行编码。

    #if ISCHANGEFRAME
    	if (frame->format == AV_PIX_FMT_YUVJ420P) {
    		sws_scale(convert_ctx,frame->data, frame->linesize, 0, Height, frameYUV->data, frameYUV->linesize);
    		frameYUV->format = AV_PIX_FMT_YUV420P;
    		frameYUV->width = Width;
    		frameYUV->height = Height;
    		return frameYUV;
    	}
    #endif
    

    4、补充

    1、libx264是可以对YUVJ420P直接进行264编码的,不需要做格式转换。
    2、YUVJ420P和YUV420P简单介绍
    YUVJ420P的字面含义是“使用了JPEG颜色范围的YUV420P,像素使用表示颜色的数值范围发生了变化。
    YUV420p的像素颜色范围是[16,235],16表示黑色,235表示白色
    YUVJ420P的像素颜色范围是[0,255]。0表示黑色,255表示白色
    FFmpeg的定义和解释:

    AV_PIX_FMT_YUV420P,   ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
    AV_PIX_FMT_YUVJ420P,  ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
    

    Download

    1、测试视频
    2、FFmpeg API H265转码H264源码

    参考

    1、https://developer.nvidia.com/ffmpeg

    2、ffmpeg nvidia硬件加速方案(参考的博客)
    https://blog.csdn.net/zhengbin6072/article/details/88202268

    3、ffmpeg关于硬解码和软解码一些参考
    https://www.cnblogs.com/chenpingzhao/p/12359725.html

    4、YUV420P和YUVJ420P介绍
    https://blog.csdn.net/samsung12345678/article/details/102383708

    展开全文
  • stdint.h头文件

    千次下载 热门讨论 2013-07-13 16:47:50
    很多项目经常使用的两个头文件inttypes.h stdint.h,否则会报错。网上很多资料,但基本上不可用。这两个文件,我在自己的项目中运行良好。
  • 视频分析工具H264Visa

    热门讨论 2013-08-14 15:12:51
    给大家介绍一款专业的H.264/AVC实时视频分析工具H264Visa.可用于视频开发及学习研究用.(注该版本为免费破解版)
  • stm32f10x_lib.h

    千次下载 热门讨论 2014-01-15 11:24:29
    原来偶是使用keil 3.80的编译器系统,能正常的将#include <stm32f10x_lib.h>头信息正常编译,后来升级到了keil 4.60之后就出现在can not open source input file 'stm32f10x_lib.h' 导致编译不能通过了,为了解决这个...
  • H.264和H.265(HEVC)深度解析及对比

    万次阅读 多人点赞 2018-11-29 20:53:45
    一、什么是H.265 H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准。H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进。 新技术使用先进的技术用以改善码流、编码...
  • 库函数conio.h

    千次下载 热门讨论 2013-01-12 23:20:03
    vc的库函数conio.h,放到...\Microsoft Visual Studio\VC98\Include 文件夹中
  • H.264码流分析器 1.1

    千次下载 热门讨论 2014-08-16 17:56:57
    自己做的H.264码流分析工具。可以分析每个NAL的信息,支持中英双语。 支持H.264裸流作为输入。 可以详细的列出H.264码流中NAL的信息。
  • H+后台主题UI框架 (v4.1.0)免费使用

    热门讨论 2016-07-18 11:34:04
    988元官方购买的,以下是H+的介绍 H+是一个完全响应式,基于Bootstrap最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了...
  • 本课程是以笔者将于2016年10月份出版的《Cisco/H3C交换机配置与管理完全手册》(第三版)为主线,以H3C新的Comware V7版本操作系统为基础,以实战方式介绍H3C以太网交换机的STP/RSTP/PVST/MSTP生成树协议配置与管理...
  • cjson使用到的c和h文件

    热门讨论 2014-12-10 16:15:54
    解压后,有cjson.h和cjson.c两个文件,在c代码中include "cjson.h",并且在编译的时候连cjson.c一起编译即可使用
  • H264与H265的区别

    千次阅读 2020-05-20 17:43:37
    转载自:... 目录: 1.编解码框架差异 2.压缩性能比较 3.各模块技术差异汇总 4.块划分结构 ...1.H.264与H.265的主要差异 H.265仍然采用混合编解码,编解码结构域H.264基本一致, 主要的不同在于: ...
  • unistd.h 头文件

    千次下载 热门讨论 2012-10-25 08:55:09
    unistd.h 头文件 可直接使用,应急下载
  • IOSTREAM.H

    千次下载 热门讨论 2012-03-01 14:32:43
    IOSTREAM.H文件VS2003后没的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,546,482
精华内容 2,618,592
关键字:

h