主頁 >  其他 > 直播推流SDK綜述(一)

直播推流SDK綜述(一)

2020-12-27 11:05:19 其他

目錄

1 直播流程概述

2.資料采集

2.1 視頻資料的采集

2.1.1 SurfaceHolder

2.1.2 SurfaceView類

2.1.3 Camera

2.2 獲取相機資料

2.3 音頻采集

3 編碼

3.1 常見編碼格式

3.2 h264原理概述

3.2.1 劃分宏塊

3.2.2 劃分子塊

3.2.3 幀分組

3.2.4 運動估計與補償

3.2.5 幀內預測

3.2.6 對殘差資料做DCT

3.2.7 CABAC


直播涉及到音視頻技術,想要深入研究,需要對音頻和視頻有一定的了解,這里我們會討論直播中的技術實作,涉及到必要的底層實作或者必要的音視頻知識會有一些相關鏈接或者概念上的闡述,

1 直播流程概述

先來看下開啟一場直播,中間的流程是怎樣的,如圖:

Fig.1

從上圖可以看到,一場直播的流程為:

(1)移動端視頻設備、音頻設備采集到音視頻資料

(2)將采集到的音頻資料和視頻資料進行編碼和封裝

(3)將封裝后的資料通過網路傳輸到后端

再經過轉碼、分發、寫入分布式系統等,以及經過CDN(content delivery net,內容分發網)傳輸給觀眾端,轉碼,分發,切片等程序是將資料傳給后端,后端進行的一系列操作,而CDN是將處理的音視頻資料內容進行分發的網路,這里不討論,我們只討論屬于移動端的音視頻資料處理及傳輸的1),2),3)程序,

2.資料采集

直播流程中,主播端的資料處理包括:資料采集、編碼和封裝,資料的采集和處理包括視頻和音頻的采集處理,

2.1 視頻資料的采集

相機的采集及預覽可以通過兩個方式實作:

(1)SurfaceView+Camera

(2)TextureView+Camera

這里我們詳細討論第一種實作方案,

在Android層,實作從打開相機到得到影像資料以及預覽的程序大致可以分為兩部分:從硬體得到Camera預覽資料、SurfaceView(也可以是TextureView)顯示畫面,如下圖所示,

Fig.2

SurfaceView是Camera資料的顯示界面,想要將SurfaceView和Camera聯系起來,需要用到Surface和SurfaceHolder,它們之間的關系是:

Fig.3

這里,Surface是用來處理螢屏顯示內容合成器所管理的原始快取區的工具,它通常由影像緩沖區的消費者來創建(如:SurfaceTexture,MediaRecorder,編解碼時的MediaCodec),然后被移交給生產者(如:MediaPlayer)或者是顯示到其上(如:CameraDevice),正如Fig.3所示,Google提供了一個SurfaceHolder類來對Surface的屬性進行控制,

接下來,分別對這三個部分進行介紹,

2.1.1 SurfaceHolder

一個抽象介面,給持有surface的物件使用,它可以控制surface的大小和格式,編輯surface中的像素格式,以及監聽surface的變化,這個介面通常通過SurfaceView類獲得,它有3個回呼方法:

//surface第一次創建時回呼
surfaceCreated(SurfaceHolder holder)

//surface變化的時候回呼(格式/大小),如設定橫豎屏
surfaceChanged(SurfaceHolder holder, int format, int width, int height)

//surface銷毀的時候回呼
surfaceDestroyed(SurfaceHolder holder)

2.1.2 SurfaceView類

SurfaceView繼承自View,其中有兩個成員變數,一個是Surface物件,一個是SuraceHolder物件,surfaceView用這兩個物件實作什么目的呢?

· SurfaceView把Surface顯示在螢屏上,Surface是處理原始緩沖區的工具,可以理解為一塊“還未看見”的畫布,即在SurfaceView顯示前一幀的畫面時,Surface在準備即將要展示的下一幀的畫面,等到下一幀準備好,就可以進行重繪,

· SurfaceView通過SuraceHolder告訴我們Surface的狀態(創建、變化、銷毀)

· 通過getHolder()方法獲得當前SurfaceView的SuraceHolder物件,然后就可以對SuraceHolder物件添加回呼來監聽Surface的狀態

即SuffaceView.getHolder().addCallBack(SurfaceHolder.Callback);

2.1.3 Camera

從Camera得到資料這部分來看,Camera初始化需要做的:

//1. 打開攝像頭,這里,引數id是指開啟前置還是后置攝像頭,1代表前置,0代表后置

camera=android.hardware.Camera.open(int id);

//2. 設定各個引數,例如:

Camera.Parameters parameters = mCamera.getParameters(); //獲取攝像頭引數

// 可以根據情況設定引數

// 鏡頭縮放

parameters.setZoom(); 

// 設定預覽照片的大小

parameters.setPreviewSize(200, 200);

// 設定預覽照片時每秒顯示多少幀的最小值和最大值

parameters.setPreviewFpsRange(4, 10);

// 設定圖片格式

parameters.setPictureFormat(ImageFormat.JPEG);

// 設定JPG照片的質量  圖片的質量[0-100],100最高

parameters.set("jpeg-quality", 85);

// 設定照片的大小

parameters.setPictureSize(200, 200);

camera.setDisplayOrientation(90);// 預覽方向,一般是通過相機設定方向來實作,

最后,將引數傳給Camera

mCamera.setParameters(parameters);

此外還需要注意一個問題,即相機影像資料來自于相機硬體的影像傳感器,這個傳感器有一個默認的取景方向,前置攝像頭需要設定展示方向為270度(camera.setDisplayOrientation(270)),后置攝像頭需要設定展示方向90度(camera.setDisplayOrientation(90)),

以上就是camera的初始化,想要將camera采集到的資料展示出來,還需要一個必不可少的將Surface和Camera聯系起來的環節:

mCamera.setPreviewDisplay(holder);

然后,將camera開啟預覽:

mCamera.startPreview();

此程序在創建Surface成功后即可添加,一般可以添加在SurfaceHolder.Callback介面的surfaceCreated方法或者surfaceChanged介面中,

最后,記得將Camera釋放:

mCamera.release();

至于相機開啟后,相機初始化,native層變化的程序,可以參考:

blog:

https://blog.csdn.net/qq_38907791/article/details/87987591

2.2 獲取相機資料

上述程序是直接將相機得到的資料展示在螢屏上,然而,在開發程序中,有些需求是獲取相機得到的像素資料,以實作其他需求,那么如何在android中獲取相關影像資料呢?

Google提供了Camera的相關介面:Camera.PreviewCallback

在介面的方法中即可獲得byte[]陣列,這個陣列是將像素(Android 中Google支持的 Camera Preview Callback的YUV常用格式有兩種:一個是NV21,一個是YV12,Android一般默認使用YCbCr_420_SP的格式(NV21))按照一定規則排列得到的一維陣列,如果想要得到某個格式下的像素byte陣列,可以通過相機引數設定來實作:

Camera.Parameters parameters = camera.getParameters();

parameters.setPreviewFormat(ImageFormat.NV21);

camera.setParameters(parameters);

之后,通過Camera.PreviewCallback介面的onPreviewFrame方法中獲取到像素陣列并展示,具體代碼如下:

mCamera.setPreviewCallback(new Camera.PreviewCallback() {

    @Override

    public void onPreviewFrame(byte[] data, Camera camera) {

        // 處理data,這里面的data資料就是NV21格式的資料,將資料顯示在ImageView控制元件上面

        mPreviewSize = camera.getParameters().getPreviewSize();// 獲取尺寸,格式轉換的時候要用到
        // 取發YUVIMAGE

        YuvImage yuvimage = new YuvImage(

                data,

                ImageFormat.NV21,

                mPreviewSize.width,

                mPreviewSize.height,

                null);

        mBaos = new ByteArrayOutputStream();

        // yuvimage轉換成jpg格式

        yuvimage.compressToJpeg(new Rect(0, 0, mPreviewSize.width, mPreviewSize.height), 100, mBaos);// 80--JPG圖片的質量[0-100],100最高

        mImageBytes = mBaos.toByteArray();

        // 將mImageBytes轉換成bitmap

        BitmapFactory.Options options = new BitmapFactory.Options();

        options.inPreferredConfig = Bitmap.Config.RGB_565;

        mBitmap = BitmapFactory.decodeByteArray(mImageBytes, 0, mImageBytes.length, options);

        mImageView.setImageBitmap(rotateBitmap(mBitmap, getDegree()));

以上,就是通過camera實作預覽以及獲取資料后轉換為Bitmap的全程序,

2.3 音頻采集

Android一般有兩種方式進行音頻采集:MediaRecorder和AudioRecord,二者的區別在于,MediaRecorder是經過編碼壓縮的,而AudioRecord得到的是PCM(脈沖編碼調制)資料,也就是原音頻檔案,想要對音頻檔案進行處理,比如變聲、變速等,就需要使用AudioRecord進行音頻采集,再對得到的音頻資料進行變聲變速等處理,

關于音頻的介紹及應用可參考文章:https://www.jianshu.com/p/125b94af7c08

3 編碼

通過以上程序,我們就得到音頻資料,影像紋理,接下來,就需要將得到的音頻和視頻進行編碼,那么為什么要進行編碼呢?

眾所周知,視頻是由一張張的圖片快速連續播放才形成的影片效果,一般來說,每秒鐘最少15張影像,即幀率為15fps,人眼不會感覺到卡頓,每張彩色影像有RGB三通道,每個通道的數值范圍是0-255,用8個二進制來表示,也就是說,每個像素點都包含3*8個二進制數值,如果一張影像的解析度是1280*720,它的像素點個數為1280*720個,那么在沒有經過編碼壓縮的情況下,傳輸或者保存一張影像需要的空間是1280*720*3*8bit.而每秒鐘按照最少的15張來計算,在直播中,每秒鐘就需要傳送1280*720*3*8*15/8=41 472 000byte=41472kB.一秒鐘最少傳輸41MB的資料量,現在的網路帶寬明顯是不能滿足這個需求的,編碼壓縮就是利用影像的時間和空間的相關性,將影像大小壓縮到遠小于原影像的目的,直播中用到的視頻編碼有H264編碼格式,音頻編碼格式為aac,

除了編碼之外,還需要對音視頻進行封裝,常見的有flv,ts,mpeg4,mkv等,我們這里討論的封裝格式是flv,

3.1 常見編碼格式

編碼實質上就是將音視頻資料進行壓縮,以減少音視頻資料在網路上傳輸的壓力,

相應地,在播放端也要進行解碼,以恢復出音視頻資料,

編碼分為軟編碼和硬編碼,二者最主要的區別在于是否使用cpu進行編碼,使用cpu進行編碼的編碼方式是軟編碼,比如FFMPEG,使用GPU,FPGA等硬體進行編碼的稱為硬編碼,軟編碼是可以適配多個平臺,但是記憶體占用率相對較高,硬編碼記憶體占用率相對較低,但是不像軟編碼可以適配多個平臺,有局限性,

無論是軟編碼還是硬編碼,都需要對音頻和視頻編碼,現有多種視頻編碼格式和音頻編碼格式,下圖為常見音頻編碼格式比較:

下圖為常見視頻編碼格式比較:

這里我們重點討論h264視頻編碼格式,

3.2 h264原理概述

H264編碼壓縮技術主要采用了以下幾種方法對視頻資料進行壓縮,包括:

  • 幀內預測壓縮,解決的是空域資料冗余問題,

  • 幀間預測壓縮(運動估計與補償),解決的是時域資料冗余問題,

  • 整數離散余弦變換(DCT),將空間上的相關性變為頻域上無關的資料然后進行量化,

  • CABAC壓縮,

經過壓縮后的幀分為:I幀,P幀和B幀:

  • I幀:關鍵幀,采用幀內壓縮技術,

  • P幀:向前參考幀,在壓縮時,只參考前面已經處理的幀,采用幀音壓縮技術,

  • B幀:雙向參考幀,在壓縮時,它即參考前而的幀,又參考它后面的幀,采用幀間壓縮技術,

除了I/P/B幀外,還有影像序列GOP,

  GOP:兩個I幀之間是一個影像序列,在一個影像序列中只有一個I幀,如下圖所示:

下面我們就來詳細描述一下H264壓縮技術,
H264的基本原理其實非常簡單,下我們就簡單的描述一下H264壓縮資料的程序,通過攝像頭采集到的視頻幀(按每秒 30 幀算),被送到 H264 編碼器的緩沖區中,編碼器先要為每一幀圖片劃分宏塊,

以下面這張圖為例:

3.2.1 劃分宏塊

H264默認是使用 16X16 大小的區域作為一個宏塊,也可以劃分成 8X8 大小,

劃分好宏塊后,計算宏塊的象素值,

以此類推,計算一幅影像中每個宏塊的像素值,所有宏塊都處理完后如下面的樣子,

3.2.2 劃分子塊

H264對比較平坦的影像使用 16X16 大小的宏塊,但為了更高的壓縮率,還可以在 16X16 的宏塊上更劃分出更小的子塊,子塊的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的靈活,

上幅圖中,紅框內的 16X16 宏塊中大部分是藍色背景,而三只鷹的部分影像被劃在了該宏塊內,為了更好的處理三只鷹的部分影像,H264就在 16X16 的宏塊內又劃分出了多個子塊,

這樣再經過幀內壓縮,可以得到更高效的資料,下圖是分別使用mpeg-2和H264對上面宏塊進行壓縮后的結果,其中左半部分為MPEG-2子塊劃分后壓縮的結果,右半部分為H264的子塊劃壓縮后的結果,可以看出H264的劃分方法更具優勢,

宏塊劃分好后,就可以對H264編碼器快取中的所有圖片進行分組了,

3.2.3 幀分組

對于視頻資料主要有兩類資料冗余,一類是時間上的資料冗余,另一類是空間上的資料冗余,其中時間上的資料冗余是最大的,下面我們就先來說說視頻資料時間上的冗余問題,

為什么說時間上的冗余是最大的呢?假設攝像頭每秒抓取30幀,這30幀的資料大部分情況下都是相關聯的,也有可能不止30幀的的資料,可能幾十幀,上百幀的資料都是關聯特別密切的,

對于這些關聯特別密切的幀,其實我們只需要保存一幀的資料,其它幀都可以通過這一幀再按某種規則預測出來,所以說視頻資料在時間上的冗余是最多的,

為了達到相關幀通過預測的方法來壓縮資料,就需要將視頻幀進行分組,那么如何判定某些幀關系密切,可以劃為一組呢?我們來看一下例子,下面是捕獲的一組運動的臺球的視頻幀,臺球從右上角滾到了左下角,

H264編碼器會按順序,每次取出兩幅相鄰的幀進行宏塊比較,計算兩幀的相似度,如下圖:

通過宏塊掃描與宏塊搜索可以發現這兩個幀的關聯度是非常高的,進而發現這一組幀的關聯度都是非常高的,因此,上面這幾幀就可以劃分為一組,其演算法是:在相鄰幾幅影像畫面中,一般有差別的像素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%以內,我們認為這樣的圖可以分到一組,

在這樣一組幀中,經過編碼后,我們只保留第一帖的完整資料,其它幀都通過參考上一幀計算出來,我們稱第一幀為IDR/I幀,其它幀我們稱為P/B幀,這樣編碼后的資料幀組我們稱為GOP

3.2.4 運動估計與補償

在H264編碼器中將幀分組后,就要計算幀組內物體的運動矢量了,還以上面運動的臺球視頻幀為例,我們來看一下它是如何計算運動矢量的,

H264編碼器首先按順序從緩沖區頭部取出兩幀視頻資料,然后進行宏塊掃描,當發現其中一幅圖片中有物體時,就在另一幅圖的鄰近位置(搜索視窗中)進行搜索,如果此時在另一幅圖中找到該物體,那么就可以計算出物體的運動矢量了,下面這幅圖就是搜索后的臺球移動的位置,

通過上圖中臺球位置相差,就可以計算出臺圖運行的方向和距離,H264依次把每一幀中球移動的距離和方向都記錄下來就成了下面的樣子,

運動矢量計算出來后,將相同部分(也就是綠色部分)減去,就得到了補償資料,我們最終只需要將補償資料進行壓縮保存,以后在解碼時就可以恢復原圖了,壓縮補償后的資料只需要記錄很少的一點資料,如下所示:

我們把運動矢量與補償稱為幀間壓縮技術,它解決的是視頻幀在時間上的資料冗余,除了幀間壓縮,幀內也要進行資料壓縮,幀內資料壓縮解決的是空間上的資料冗余,下面我們就來介紹一下幀內壓縮技術,

3.2.5 幀內預測

人眼對圖象都有一個識別度,對低頻的亮度很敏感,對高頻的亮度不太敏感,所以基于一些研究,可以將一幅影像中人眼不敏感的資料去除掉,這樣就提出了幀內預測技術,

H264的幀內壓縮與JPEG很相似,一幅影像被劃分好宏塊后,對每個宏塊可以進行 9 種模式的預測,找出與原圖最接近的一種預測模式,

下面這幅圖是對整幅圖中的每個宏塊進行預測的程序,

幀內預測后的影像與原始影像的對比如下:

然后,將原始影像與幀內預測后的影像相減得殘差值,

再將我們之前得到的預測模式資訊一起保存起來,這樣我們就可以在解碼時恢復原圖了,效果如下:

經過幀內與幀間的壓縮后,雖然資料有大幅減少,但還有優化的空間,

3.2.6 對殘差資料做DCT

可以將殘差資料做整數離散余弦變換,去掉資料的相關性,進一步壓縮資料,如下圖所示,左側為原資料的宏塊,右側為計算出的殘差資料的宏塊,

將殘差資料宏塊數字化后如下圖所示:

將殘差資料宏塊進行 DCT 轉換,

去掉相關聯的資料后,我們可以看出資料被進一步壓縮了,

做完 DCT 后,還不夠,還要進行 CABAC 進行無損壓縮,

3.2.7 CABAC

上面的幀內壓縮是屬于有損壓縮技術,也就是說影像被壓縮后,無法完全復原,而CABAC屬于無損壓縮技術,

無損壓縮技術大家最熟悉的可能就是哈夫曼編碼了,給高頻的詞一個短碼,給低頻詞一個長碼從而達到資料壓縮的目的,MPEG-2中使用的VLC就是這種演算法,我們以 A-Z 作為例子,A屬于高頻資料,Z屬于低頻資料,看看它是如何做的,

CABAC也是給高頻資料短碼,給低頻資料長碼,同時還會根據背景關系相關性進行壓縮,這種方式又比VLC高效很多,其效果如下:

現在將 A-Z 換成視頻幀,它就成了下面的樣子,

從上面這張圖中明顯可以看出采用 CACBA 的無損壓縮方案要比 VLC 高效的多,

以上是h264編碼原理,接下來查看具體的編碼實作方式:https://blog.csdn.net/murongxian_1/article/details/111224953

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240911.html

標籤:其他

上一篇:Android音視頻【三】硬解碼播放H264

下一篇:什么是面向物件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more