SVC入门知识和JSVM基础实验_yuv 编解码 svc-程序员宅基地

技术标签: svc  网络  视频  视频编码  yuv  系统  

基础之一  yuv格式

         其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。


1. SVC基础知识

     

1.Scalable Video Coding – 可分级视频编码

 

-为什么需要可分级视频编码技术(SVC)

 

  实际应用中,存在不同的网络和不同的用户终端,各种情况下对视频质量的需求不一样。例如,在利用网络传输视频信息时,由于网络带宽限制了数据传输,因此要求当网络带宽较小的时候,只传输基本的视频信号,并根据实际网络的状况决定是否传输增强的视频信息,使视频的质量得到加强。

 

  在这样的背景下,利用可分级视频编码技术实现一次性编码产生具有不同帧率、分辨率的视频压缩码流,然后根据不同网络带宽、不同的显示屏幕和终端解码能力选择需要传输的视频信息量,以此实现视频质量的自适应调整。



-可分级视频编码(SVC)是什么

 

  为了能够实现从单一码流中解码得到不同帧率(时间可分级)、分辨率(空间可分级)和图像质量(SNR可分级)的视频数据的编码技术。

  H.264 SVCH.264 AVC视频编解码器标准为基础,利用了AVC编解码器的各种高效算法工具,在编码产生的编码视频时间上(帧率)、空间上(分辨率)可扩展,并且是在视频质量方面可扩展的,可产生不同帧速率、分辨率或质量等级的解码视频。

 

2.H264 Scalable Video Coding Extension

 

H.264 SVCH.264可分级编码)作为H.264标准的一个扩展最初由JVT2004年开始制定,并于20077月获得ITU批准。

 H264可分级视频编码是H264/AVC标准的扩展 (Annex G , 2007),它是以H264/AVC标准为基础,通过各种编码工具,形成分层编码(multi-layercoding)方式,以提供时间(Temporal)上,空间(Spatial)上和图像质量(Quality)上的可调整特性,可产生不同帧率、图像分辨率或图像质量等级的解码视频。



-H264 SVC结构

 

H264可分级视频编码采用分层编码方式实现,由一个基本层(Base Layer)和多个增强层(Enhancement Layer)组成,增强层依赖基本层的数据来解码。其中,基本层(base layer)编码了基本的视频信息,实现了最低图像分辨率、帧率,并且基本层的编码是兼容H264/AVC编码标准的,能够采用H264/AVC解码器进行解码。


H264 SVC以不同分辨率的图像为基础形成分层结构(inter-layer prediction),并在此基础上每一层用Hierarchical B-picture来实现TemporalScalablity,用MGS编码来实现Quility Scalability (SNR Scalability)

 

每一层内的编码都使用了H264/AVC中帧内和帧间预测编码工具,而相邻层之间使用了SVC独有的层间预测编码工具。

 

EL(Enhancement Layer)的参考,可以是来源于同一层的其他帧,也可以是低层上采样的帧。但是不可以是更高层的帧,那样的话丢弃高层的nalu会导致低层无法解码。





     SVC(scalable video coding)的可分级 视频编码概念,简而言之,就是把视频序列分成不同的部分并赋予不同的等级,这样的思想已经渊源流传,并非H.264/SVC所独创。2007年由ITU推出的H.264/SVC标准,继承了H.264的高效压缩性,随着网络应用的普及,SVC的灵活码流适应性和对不同终端产品的匹配性,显得尤为重要。

 
SVC对分级的策略是从时间,空间和质量上,对视频序列进行分级编码(如下图)


下面,将详细描述一下SVC怎么在这些方向进行分级的:

(1)时间分级(TemporalScalability)

       时间分级就是给序列的视频帧分配不同的重要等级,以便于在实际应用中按重要程度显示帧(或在恶劣网络条件下主动放弃低等级的帧)。其实现方式是采用如下图所示的hierarchicalB结构。可以按照具体应用来设计分等级的B帧结构,然后组织起一个个GOP,再架构成整个编码序列。由于H.264/AVC中允许进行参考帧管理,使得时间分级可以直接利用这一特性得以实现。


(2)空间分级(SpatialScalability)
        空间分级的用于形成不同的图像(帧)分辨率,在实际应用中可以给不同显示屏幕的终端设备提供适配的画面,以达到提高带宽使用率的目的。具体的变现如上面的图,是在不同的分辨率序列层中进行预测,利用去相关性节省码流。在SVC中,除了提供传统的层间intra预测(Inter-layerintra prediction),还提供层间宏块模式与运动预测(Inter-layer macroblock mode andmotion prediction)和层间残差预测(Inter-layer residualprediction),这三种模式可以充分利用图像的时间和空间相关性进行分级编码,
  i.层间intra预测(Inter-layer intra prediction)
  这种预测方式的宏块信息完全由层间参考帧(一般是低分辨率的重建帧)通过上采样预测得到,在H.262/MPEG-2 Video,H.263,  和MPEG-4等编码模式中也经常被用到,但是这种方式缺乏消除时间相关性所得到的码率削减。
  ii.层间宏块模式与运动预测(Inter-layer macroblock mode and motionprediction)
    宏块使用类似AVC的帧间预测进行编码,其宏块模式采用层间参考帧相应块的模式,其对应的运动矢量也利用层间参考帧相应块的运动信息进行预测编码。这就是所谓的层间运动预测(inter-layermotion prediction)。
  iii.层间残差预测(Inter-layer residual prediction)
  利用残差的层间相关性,可以对于帧间预测的图像继续进行层间预测,以进一步削减码流。
    三种层间预测的概要图示如下:
   
在【1】中提到一个SVC设计的重要特性,每个空间增强层可以在单一的运动补偿环中解码。在对一个目标帧的解码中,其空间参考帧需要重建自己层间预测相关的intra-coded宏块和残差块,并对自己的运动矢量进行解码,运动补偿和对帧间预测的去方块滤波仅在目标帧中进行。


(3)质量分级(QualityScalability)

        质量分级往往可以被认为是一种特殊(解析度相同)的空间分级编码,因此传统的coarse-grain quality scalablecoding (CGS,粗粒度质量分级编码)很容易被想到,而在实际应用中,还发展了medium-grain qualityscalability (MGS,中等粒度质量分级编码),下面将分别描述他们:
i. CGS
CGS有类似空间分级中层间预测,但是无需有上采样的过程,为了更好的视频质量需要呈现更多的图像纹理,因此,在质量分层的层间预测中,对纹理的提纯通常通过采用更小量化步长的重新量化。为了减少计算复杂性,用于层间intra预测的参考帧deblocking被忽略,而且层间intra预测和层间残差预测将在DCT系数阶段被直接处理。
ii. MGS
由于CGS对码率控制不能灵活处理,一种叫MGS的衍生方式被提出采用,MGS可以灵活的权衡漂移(draft,运动补偿预测循环中的编解码不同步)和层次预测的编码效率。下面的图,蓝色的表示用于基础质量序列,红色表示较好质量的序列,可以根据策略灵活组合他们之间的参考关系。
其中上图(c)(d)就是MGS的灵活方式。以(d)来说,就是对 有黑色标注的Keypicture,用基础质量图像做参考,而对非Key picture使用较好质量的图像做参考, 一旦增强层丢包,则可能造成drift,drift被控制在两个Keypicture之间
对于质量分级, SVC还支持两个特性,Partitioningof transform coefficients和SVC-to-AVCrewriting,前者提供用slice来分散增强层变换系数的方法,以便于同一增强层数据被分散到几个包中,后者提供了SVC-》AVC的转码便利。
 
至此,SVC的基础入门概念就描述完了,下面将要开始看看怎么使用JSVM来做分层编解码实验。
 
2.JSVM基础实验 
 
(1)编码实验
  jsvm的实验可以从编码开始,编译完JSVM代码后,可以运行H264AVCEncoderLibTestSta ticd.exe来进行SVC编码,在这里的基础实现中首先关注spatialscalability的编码,通常可以结合temporary scalability一起进行。用以下命令运行编码:
  H264AVCEncoderLibTestSta ticd -pfencoder.cfg
  这里仅仅使用最简单的参数:
  文件encoder.cfg
******************************************************************
# Scalable H.264/AVC Extension Configuration File
OutputFile                          D:\workspace\264\svctest.264            # Bitstream file
FrameRate                            25                            # Maximum frame rate [Hz]
FramesToBeEncoded            32                              # Number of frames (at input frame rate)
GOPSize                                                                # GOP Size (at maximum frame rate)
BaseLayerMode                                                    # Base layer mode (0: AVC w larger DPB,
                                                                                      1:AVC compatible, 2:AVC wsubseq SEI)
SearchMode                                                          # Search mode (0:BlockSearch, 4:FastSearch)
SearchRange                        32                                # Search range (Full Pel)
#=================== LAYERDEFINITION ==================
NumLayers                                                                    # Number of layers
LayerCfg                              layer0.cfg                        # Layer configuration file
LayerCfg                              layer1.cfg                        # Layer configuration file
******************************************************************
 
文件  layer0.cfg
******************************************************************
# Layer Configuration File

#================= INPUT / OUTPUT ====================
SourceWidth        176                                        # Input  frame width
SourceHeight      144                                        # Input  frame height
FrameRateIn        25                                          # Input  frame rate [Hz]
FrameRateOut      25                                          # Output frame rate [Hz]
InputFile            D:\workspace\264\mobile_qcif.yuv            # Input  file
ReconFile            rec_layer0.yuv                  # Reconstructed file
SymbolMode                                                    # 0=CAVLC, 1=CABAC
******************************************************************
文件 
layer1.cfg
******************************************************************
# Layer ConfigurationFile
#============================== INPUT / OUTPUT===============
SourceWidth        352                                        # Input  frame width
SourceHeight      288                                        # Input  frame height
FrameRateIn        25                                          # Input  frame rate [Hz]
FrameRateOut      25                                          # Output frame rate [Hz]
InputFile            D:\workspace\264\mobile_cif.yuv            # Input  file
ReconFile            rec_layer1.yuv                  # Reconstructed file
SymbolMode                                                    # 0=CAVLC, 1=CABAC
 
InterLayerPred                                            # Inter-layer Prediction (0: no, 1: yes, 2:adaptive)
UseESS                                # ESS
ESSCropWidth      352            # cropping width
ESSCropHeight    288            # cropping height
ESSOriginX                        # cropping origin X
ESSOriginY                        # cropping origin Y
ESSChromaPhaseX0                # chroma phase x 0 or -1, default = -1
ESSChromaPhaseY0                # chroma phase y -1 to +1, default = 0
ESSBaseChromaPhaseX0        # base chroma phase x 0 or -1, default = -1
ESSBaseChromaPhaseY0        # base chroma phase y -1 to +1, default = 0 0
******************************************************************
本实验将编码双层的SVC文件,分别包含352x288和176x144两个分辨率,需要注意的是这里需要输入的是两个分辨率对应的YUV文件,在开发实际应用中,将是对输入的高分辨率视频按需求进行下采样得到相应低分辨率的输入码流。理解上面的配置文件可以阅读JSVM的“SoftwareManual.doc”。
以下是实验结果
*****************************初始实验结果********************
JSVM 9.15 Encoder
 
profile & levelinfo:
=====================
DQ=  0:  Main @ Level1.1
DQ= 16:  Scalable High @ Level 2.1

AU        0: I      T0 L0Q0    QP28    Y 35.0921  U 36.6779  V36.4204        66768 bit
            0: I      T0 L1Q0    QP28    Y 35.4271  U 37.4696  V37.2485      206872 bit
AU        8: P      T0 L0Q0    QP28    Y 34.7829  U 37.1181  V36.7810        26280 bit
            8: P      T0 L1Q0    QP28    Y 35.4518  U 37.6578  V37.4747      101464 bit
AU        4: B      T1 L0Q0    QP31    Y 32.5973  U 36.1283  V35.5269          4264 bit
            4: B      T1 L1Q0    QP31    Y 32.8378  U 36.9262  V36.4150        21624 bit
AU        2: B      T2 L0Q0    QP33    Y 31.7760  U 35.9120  V35.3318          2272 bit
            2: B      T2 L1Q0    QP33    Y 32.1271  U 36.4808  V35.9225        11352 bit
AU        1: B      T3 L0Q0    QP34    Y 31.9559  U 36.2816  V35.7872          1136 bit
            1: B      T3 L1Q0    QP34    Y 31.4860  U 36.5493  V36.0923          5672 bit
AU        3: B      T3 L0Q0    QP34    Y 31.1236  U 35.5697  V34.9500          1136 bit
            3: B      T3 L1Q0    QP34    Y 31.2954  U 36.0335  V35.5473          6056 bit
AU        6: B      T2 L0Q0    QP33    Y 31.6214  U 35.7877  V35.3442          2368 bit
            6: B      T2 L1Q0    QP33    Y 32.0268  U 36.4989  V36.0755        11080 bit
AU        5: B      T3 L0Q0    QP34    Y 31.2529  U 35.3809  V34.8735          1296 bit
            5: B      T3 L1Q0    QP34    Y 31.4222  U 36.0127  V35.4764          6200 bit
AU        7: B      T3 L0Q0    QP34    Y 31.8522  U 35.9385  V35.6081          1064 bit
            7: B      T3 L1Q0    QP34    Y 31.7233  U 36.4942  V36.0999          6768 bit
.
.
.
SUMMARY:
                                              bitrate      Min-bitr    Y-PSNR    U-PSNR    V-PSNR
                                            --------- ---------- -------- -------- --------
    176x144 @  3.1250    115.5750    115.5750  34.9069  37.0066  36.5668
    176x144 @  6.2500    132.4000    132.4000  33.6463  36.5663  35.8824
    176x144 @12.5000    149.7562    149.7562  32.6071  36.1343  35.3446
    176x144 @25.0000    164.7937    164.7937  31.9890  35.8764  35.0516
    352x288 @  3.1250    514.3438    514.3438  35.4914  37.5844  37.4000
    352x288 @  6.2500    606.0562    606.0562  34.0656  37.1580  36.8032
    352x288 @12.5000    706.5750    706.5750  33.0123  36.7826  36.3039
    352x288 @25.0000    809.1812    809.1812  32.2313  36.4422  35.9078
******************************************************************
从实验结果可以看到,以8帧为一个GOP,实验就像上面hierarchicalB结构图(a)那样分了4个时间层次,并且分别列出两种分辨率。从最后的统计结果可以看到,作为GOP的关键帧,无论是空间基础层还是增强层都占可主要的码流量。
(2)解码实验
解码实验将采用H264AVCDecoderLibTestSta tic,解码输出自能得到最好的流,也就是基础层结合增强层得到的最高层次的流,本实验中是352x288的25帧序列。解码过程显示如下:
D:\workspace\project\jsvm\bin>H264AVCDecoderLibTestSta ticdD:\workspace\264\svct
est.264 D:\workspace\264\rec_svc
JSVM 9.15 Decoder

---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  NON-VCL: SEQUENCE PARAMETER SET (ID=0)
  NON-VCL: SUBSET SEQUENCE PARAMETER SET(ID=0)
  NON-VCL: PICTURE PARAMETER SET (ID=0)
  NON-VCL: PICTURE PARAMETER SET (ID=1)
  NON-VCL: PICTURE PARAMETER SET (ID=2)
  NON-VCL: SEI NAL UNIT
  Frame      0 ( LId0, TL 0, QL 0, AVC-I, BId-1, AP 0, QP 28 )
  Frame      0 ( LId1, TL 0, QL 0, SVC-I, BId 0, AP 1, QP 28 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      8 ( LId0, TL 0, QL 0, AVC-P, BId-1, AP 0, QP 28 )
  Frame      8 ( LId1, TL 0, QL 0, SVC-P, BId 0, AP 1, QP 28 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      4 ( LId0, TL 1, QL 0, AVC-B, BId-1, AP 0, QP 31 )
  Frame      4 ( LId1, TL 1, QL 0, SVC-B, BId 0, AP 1, QP 31 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      2 ( LId0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )
  Frame      2 ( LId1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      1 ( LId0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
  Frame      1 ( LId1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      3 ( LId0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
  Frame      3 ( LId1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      6 ( LId0, TL 2, QL 0, AVC-B, BId-1, AP 0, QP 33 )
  Frame      6 ( LId1, TL 2, QL 0, SVC-B, BId 0, AP 1, QP 33 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      5 ( LId0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
  Frame      5 ( LId1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
---------- new ACCESS UNIT ----------
  NON-VCL: SEI NAL UNIT
  Frame      7 ( LId0, TL 3, QL 0, AVC-B, BId-1, AP 0, QP 34 )
  Frame      7 ( LId1, TL 3, QL 0, SVC-B, BId 0, AP 1, QP 34 )
 
从上面的过程中可以看到所有的基础层和增强层原始都被使用到了,那么要想仅仅解码基础层的序列该如何操作呢?就要用到下面介绍的流提取工具BitStreamExtractorStatic
(3)流提取实验
用BitStreamExtractorStatic 提取svc文件里的相应子流,在输入的参数不足时,会列出svc文件中可以提取的各层:
D:\workspace\project\jsvm\bin>BitStreamExtractorStatic dD:\workspace\264\svctest
.264
JSVM 9.15 BitStream Extractor
Contained Layers:
====================
            Layer    Resolution    Framerate    BitrateMinBitrate          DTQ
                      176x144            3.1250        115.60          115.60    (0,0,0)
                      176x144            6.2500        132.40          132.40    (0,1,0)
                      176x144          12.5000        149.80          149.80    (0,2,0)
                      176x144          25.0000        164.80          164.80    (0,3,0)
                      352x288            3.1250        514.30          514.30    (1,0,0)
                      352x288            6.2500        606.10          606.10    (1,1,0)
                      352x288          12.5000        706.60          706.60    (1,2,0)
                      352x288          25.0000        809.20          809.20    (1,3,0)
             
下面是一个成取176x144的25帧率序列的实验:
D:\workspace\project\jsvm\bin>BitStreamExtractorStatic dD:\workspace\264\svctest
.264 D:\workspace\264\ext_svc.264 -e 176x144@25:164.8
JSVM 9.15 BitStream Extractor

Contained Layers:
====================
            Layer    Resolution    Framerate    BitrateMinBitrate          DTQ
                      176x144            3.1250        115.60          115.60    (0,0,0)
                      176x144            6.2500        132.40          132.40    (0,1,0)
                      176x144          12.5000        149.80          149.80    (0,2,0)
                      176x144          25.0000        164.80          164.80    (0,3,0)
                      352x288            3.1250        514.30          514.30    (1,0,0)
                      352x288            6.2500        606.10          606.10    (1,1,0)
                      352x288          12.5000        706.60          706.60    (1,2,0)
                      352x288          25.0000        809.20          809.20    (1,3,0)
WARNING: Bit-rate underflowfor extraction/inclusion point

============Extraction Information======
Extracted spatail layer  : 176x144
Extracted temporal rate  : 25f/s
quality_id statistics fordependency_id 0
===========================================
quality_id 0 -total:      16retained:      16
Number of inputpackets:        134
Number of outputpackets:      99
可以对输出的ext_svc.264文件用H264AVCDecoderLibTestSta tic解码,得到176x144的yuv。
 
至此,本文作为入门介绍已经完成,JSVM还有许多辅助工具可以参照 JSVM SoftwareManual,本章的实验结果可以体会到,使用JSVM编码的好速度很慢,还没具体统计,大约每分钟两三帧,而解码在当前一般配置的双核PC系统基本可以达到实时。下一篇文章将进入JSVM的代码分析。
 
【参考文献】
1. HHI,“ The ScalableVideo Coding Amendment of the H.264/AVCStandard
2. Heiko Schwarz, Detlev Marpe,, and Thomas Wiegand, "Overview ofthe Scalable Video Coding Extension of the H.264/AVCStandard"
3. 不屈号的航海长,“ video infuture
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_15437629/article/details/47091197

智能推荐

C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC_c#opc通信-程序员宅基地

文章浏览阅读565次。本文主要介绍如何使用C#通过OPC方式连接PLC,并提供了相应的程序和学习资料,以便读者学习和使用。OPC服务器是一种软件,可以将PLC的数据转换为标准的OPC格式,允许其他软件通过标准接口读取或控制PLC的数据。此外,本文还提供了一些学习资料,包括OPC和PLC的基础知识,C#编程语言的教程和实例代码。这些资料可以帮助读者更好地理解和应用本文介绍的程序。1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。_c#opc通信

Hyper-V内的虚拟机复制粘贴_win10 hyper-v ubuntu18.04 文件拷贝-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏10次。实践环境物理机:Windows10教育版,操作系统版本 17763.914虚拟机:Ubuntu18.04.3桌面版在Hyper-V中的刚安装好Ubuntu虚拟机之后,会发现鼠标滑动很不顺畅,也不能向虚拟机中拖拽文件或者复制内容。在VMware中,可以通过安装VMware tools来使物理机和虚拟机之间达到更好的交互。在Hyper-V中,也有这样的工具。这款工具可以完成更好的鼠标交互,我的..._win10 hyper-v ubuntu18.04 文件拷贝

java静态变量初始化多线程,持续更新中_类初始化一个静态属性 为线程池-程序员宅基地

文章浏览阅读156次。前言互联网时代,瞬息万变。一个小小的走错,就有可能落后于别人。我们没办法去预测任何行业、任何职业未来十年会怎么样,因为未来谁都不能确定。只能说只要有互联网存在,程序员依然是个高薪热门行业。只要跟随着时代的脚步,学习新的知识。程序员是不可能会消失的,或者说不可能会没钱赚的。我们经常可以听到很多人说,程序员是一个吃青春饭的行当。因为大多数人认为这是一个需要高强度脑力劳动的工种,而30岁、40岁,甚至50岁的程序员身体机能逐渐弱化,家庭琐事缠身,已经不能再进行这样高强度的工作了。那么,这样的说法是对的么?_类初始化一个静态属性 为线程池

idea 配置maven,其实不用单独下载Maven的。以及设置新项目配置,省略每次创建新项目都要配置一次Maven_安装idea后是不是不需要安装maven了?-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏43次。说来也是惭愧,一直以来,在装环境的时候都会从官网下载Maven。然后再在idea里配置Maven。以为从官网下载的Maven是必须的步骤,直到今天才得知,idea有捆绑的 Maven 我们只需要搞一个配置文件就行了无需再官网下载Maven包以后再在新电脑装环境的时候,只需要下载idea ,网上找一个Maven的配置文件 放到 默认的 包下面就可以了!也省得每次创建项目都要重新配一次Maven了。如果不想每次新建项目都要重新配置Maven,一种方法就是使用默认的配置,另一种方法就是配置 .._安装idea后是不是不需要安装maven了?

奶爸奶妈必看给宝宝摄影大全-程序员宅基地

文章浏览阅读45次。家是我们一生中最重要的地方,小时候,我们在这里哭、在这里笑、在这里学习走路,在这里有我们最真实的时光,用相机把它记下吧。  很多家庭在拍摄孩子时有一个看法,认为儿童摄影团购必须是在风景秀丽的户外,即便是室内那也是像大酒店一样...

构建Docker镜像指南,含实战案例_rocker/r-base镜像-程序员宅基地

文章浏览阅读429次。Dockerfile介绍Dockerfile是构建镜像的指令文件,由一组指令组成,文件中每条指令对应linux中一条命令,在执行构建Docker镜像时,将读取Dockerfile中的指令,根据指令来操作生成指定Docker镜像。Dockerfile结构:主要由基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参数。注释可以使用#开头。指令说明FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 : 说明新镜像的维护(制作)人,留下_rocker/r-base镜像

随便推点

毕设基于微信小程序的小区管理系统的设计ssm毕业设计_ssm基于微信小程序的公寓生活管理系统-程序员宅基地

文章浏览阅读223次。该系统将提供便捷的信息发布、物业报修、社区互动等功能,为小区居民提供更加便利、高效的服务。引言: 随着城市化进程的加速,小区管理成为一个日益重要的任务。因此,设计一个基于微信小程序的小区管理系统成为了一项具有挑战性和重要性的毕设课题。本文将介绍该小区管理系统的设计思路和功能,以期为小区提供更便捷、高效的管理手段。四、总结与展望: 通过本次毕设项目,我们实现了一个基于微信小程序的小区管理系统,为小区居民提供了更加便捷、高效的服务。通过该系统的设计与实现,能够提高小区管理水平,提供更好的居住环境和服务。_ssm基于微信小程序的公寓生活管理系统

如何正确的使用Ubuntu以及安装常用的渗透工具集.-程序员宅基地

文章浏览阅读635次。文章来源i春秋入坑Ubuntu半年多了记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习. 这里主要来说一下使用Ubuntu的正确姿势Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支..._ubuntu安装攻击工具包

JNI参数传递引用_jni引用byte[]-程序员宅基地

文章浏览阅读335次。需求:C++中将BYTE型数组传递给Java中,考虑到内存释放问题,未采用通过返回值进行数据传递。public class demoClass{public native boolean getData(byte[] tempData);}JNIEXPORT jboolean JNICALL Java_com_core_getData(JNIEnv *env, jobject thisObj, jbyteArray tempData){ //resultsize为s..._jni引用byte[]

三维重建工具——pclpy教程之点云分割_pclpy.pcl.pointcloud.pointxyzi转为numpy-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏30次。本教程代码开源:GitHub 欢迎star文章目录一、平面模型分割1. 代码2. 说明3. 运行二、圆柱模型分割1. 代码2. 说明3. 运行三、欧几里得聚类提取1. 代码2. 说明3. 运行四、区域生长分割1. 代码2. 说明3. 运行五、基于最小切割的分割1. 代码2. 说明3. 运行六、使用 ProgressiveMorphologicalFilter 分割地面1. 代码2. 说明3. 运行一、平面模型分割在本教程中,我们将学习如何对一组点进行简单的平面分割,即找到支持平面模型的点云中的所有._pclpy.pcl.pointcloud.pointxyzi转为numpy

以NFS启动方式构建arm-linux仿真运行环境-程序员宅基地

文章浏览阅读141次。一 其实在 skyeye 上移植 arm-linux 并非难事,网上也有不少资料, 只是大都遗漏细节, 以致细微之处卡壳,所以本文力求详实清析, 希望能对大家有点用处。本文旨在将 arm-linux 在 skyeye 上搭建起来,并在 arm-linux 上能成功 mount NFS 为目标, 最终我们能在 arm-linux 里运行我们自己的应用程序. 二 安装 Sky..._nfs启动 arm

攻防世界 Pwn 进阶 第二页_pwn snprintf-程序员宅基地

文章浏览阅读598次,点赞2次,收藏5次。00为了形成一个体系,想将前面学过的一些东西都拉来放在一起总结总结,方便学习,方便记忆。攻防世界 Pwn 新手攻防世界 Pwn 进阶 第一页01 4-ReeHY-main-100超详细的wp1超详细的wp203 format2栈迁移的两种作用之一:栈溢出太小,进行栈迁移从而能够写入更多shellcode,进行更多操作。栈迁移一篇搞定有个陌生的函数。C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 _pwn snprintf

推荐文章

热门文章

相关标签