主頁 >  其他 > 音視頻學習 AudioTrack、OpenSL ES 音頻渲染

音視頻學習 AudioTrack、OpenSL ES 音頻渲染

2021-02-05 10:30:30 其他

前言

在講解音頻渲染之前,需要對音頻的基礎知識有所了解,所以該篇分為基礎概念和AudioTrack 以及 OpenSL ES Demo 實體講解,這樣有助于更好的理解 Android 中音頻渲染,

音頻的基礎概念涉及的知識點比較多,該篇文章的上半部分會詳細的介紹,后續文章基本上都會涉及音頻的開發,有了基礎對于后面的內容就更容易上手了,

音頻的基礎知識

播放器入門到提高
快速掌握音視頻開發基礎知識

聲音的物理性質

聲音是波

說到聲音我相信只要聽力正常的人都聽見過聲音,那么聲音是如何產生的呢?記得初中物理課本上的描述 - 聲音是由物體的振動而產生的,其實聲音是一種壓力波,當敲打某個物體或演奏某個樂器時,它們的振動都會引起空氣有節奏的振動,使周圍的空氣產生疏密變化,形成疏密相間的縱波,由此就產生了聲波,這種現象會一直延續到振動消失為止,

聲波的三要素

聲波的三要素是頻率、振幅、和波形,頻率代表音階的高低,振幅代表響度,波形代表音色,

聲音的傳播介質

聲音的傳播介質很廣,它可以通過空氣、液體和固體進行傳播;而且介質不同,傳播的速度也不同,比如聲音在空氣中的傳播速度為 340m/s , 在蒸餾水中的傳播速度為 1497 m/s , 而在鐵棒中的傳播速度則可以高達 5200 m/s ;不過,聲音在真空中時無法傳播的,

回聲

當我們在高山或者空曠地帶高聲大喊的時候,經常會聽到回聲,之所以會有回聲是因為聲音在傳播程序中遇到障礙物會反彈回來,再次被我們聽到,

但是,若兩種聲音傳到我們的耳朵里的時差小于 80 毫秒,我們就無法區分開這兩種聲音了,其實在日常生活中,人耳也在收集回聲,只不過由于嘈雜的外接環境以及回聲的分貝比較低,所以我們的耳朵分辨不出這樣的聲音,或者說是大腦能接收到但分辨不出,

共鳴

自然界中有光能,水能,生活中有機械能,電能,其實聲音也可以產生能量,例如兩個頻率相同的物體,敲打其中一個物體時另一個物體也會振動發生,這種現象稱為共鳴,共鳴證明了聲音傳播可以帶動另一個物體振動,也就是說,聲音的傳播程序也是一種能量的傳播程序,

數字音頻

上一小節我們主要介紹了聲音的物理現象以及聲音中常見的概念,也會后續的講解統一了術語,本節主要介紹數字音頻概念,

為了將模擬信號數字化,本節將分為 3 個概念對數字音頻進行講解,分別是采樣、量化和編碼,首先要對模擬信號進行采樣,所謂采樣就是在時間軸上對信號進行數字化,根據奈奎斯特定理(也稱采樣定理),按比聲音最高頻率高 2 倍以上的頻率對聲音進行采樣,對于高質量的音頻信號,其頻率范圍在 20Hz ~ 20kHz ,所以采樣頻率一般為 44.1kHz ,這樣就保證采樣聲音達到 20kHz 也能被數字化,從而使得經過數字化處理之后,人耳聽到的聲音質量不會被降低,而所謂的 44.1 kHz 就是代表 1 s 會采樣 44100 次,

那么,具體的每個采樣又該如何表示呢?這就涉及到將要講解的第二個概念: 量化,量化是指在幅度軸上對信號進行數字化,比如用 16 bit 的二進制信號來表示聲音的一個采樣,而 16 bit 所表示的范圍是 [-32768 , 32767] , 共有 65536 個可能取值,因此最終模擬的音頻信號在幅度上也分為了 65536 層,

既然每一個分量都是一個采樣,那么這么多的采樣該如何進行存盤呢?這就涉及將要講解的第三個概念: 編碼,所謂編碼,就是按照一定的格式記錄采樣和量化后的數字資料,比如順序存盤或壓縮存盤等等,

這里涉及了很多中格式,通常所說的音頻的裸資料就是 PCM (Pulse Code Modulation) 資料,描述一段 PCM 資料一般需要以下幾個概念:量化格式(sampleFormat)、采樣率(sampleRate)、聲道數 (channel) ,以 CD 的音質為例:量化格式為 16 bit (2 byte),采樣率 44100 ,聲道數為 2 ,這些資訊就描述了 CD 的音質,而對于聲音的格式,還有一個概念用來描述它的大小,稱為資料位元率,即 1s 時間內的位元數目,它用于衡量音頻資料單位時間內的容量大小,而對于 CD 音質的資料,位元率為多少呢? 計算如下:

44100 * 16 * 2 = 1378.125 kbps

那么在一分鐘里,這類 CD 音質的資料需要占據多大的存盤空間呢?計算如下:

1378.125 * 60 / 8 / 1024 = 10.09 MB

當然,如果 sampleFormat 更加精確 (比如用 4 個位元組來描述一個采樣),或者 sampleRate 更加密集 (比如 48kHz 的采樣率), 那么所占的存盤空間就會更大,同時能夠描述的聲音細節就會越精確,存盤的這段二進制資料即表示將模擬信號轉為數字信號了,以后就可以對這段二進制資料進行存盤,播放,復制,或者進行其它操作,

音頻編碼

上面提到了 CD 音質的資料采樣格式,曾計算出每分鐘需要的存盤空間約為 10.1MB ,如果僅僅是將其存盤在光碟或者硬碟中,可能是可以接受的,但是若要在網路中實時在線傳輸的話,那么這個資料量可能就太大了,所以必須對其進行壓縮編碼,壓縮編碼的基本指標之一就是壓縮比,壓縮比通常小于 1 ,壓縮演算法包括有損壓縮和無損壓縮,無所壓縮是指解壓后的資料不能完全復原,會丟失一部分資訊,壓縮比較小,丟失的資訊就比較多,信號還原后的失真就會越大,根據不同的應用場景 (包括存盤設備、傳輸網路環境、播放設備等),可以選用不同的壓縮編碼演算法,如 PCM 、WAV、AAC 、MP3 、Ogg 等,

WAV 編碼

WAV 編碼就是在 PCM 資料格式的前面加了 44 個位元組,分別用來存盤 PCM 的采樣率、聲道數、資料格式等資訊,

特點: 音質好,大量軟體支持,

場景: 多媒體開發的中間檔案、保存音樂和音效素材,

MP3 編碼

MP3 具有不錯的壓縮比,使用 LAME 編碼 (MP3 編碼格式的一種實作)的中高碼率的 MP3 檔案,聽感上非常接近源 WAV 檔案,當然在不同的應用場景下,應該調整合適的引數以達到最好的效果,

特點: 音質在 128 Kbit/s 以上表現還不錯,壓縮比比較高,大量軟體和硬體都支持,兼容性好,

場景: 高位元率下對兼容性有要求的音樂欣賞,

AAC 編碼

AAC 是新一代的音頻有損壓縮技術,它通過一些附加的編碼技術(比如 PS 、SBR) 等,衍生出了 LC-AAC 、HE-AAC 、HE-AAC v2 三種主要的編碼格式,LC-AAC 是比較傳統的 AAC ,相對而言,其主要應用于中高碼率場景的編碼 (>=80Kbit/s) ; HE-AAC 相當于 AAC + SBR 主要應用于中低碼率的編碼 (<= 80Kbit/s); 而新推出的 HE-AAC v2 相當于 AAC + SBR + PS 主要用于低碼率場景的編碼 (<= 48Kbit/s) ,事實上大部分編碼器都設定為 <= 48Kbit/s 自動啟用 PS 技術,而 > 48Kbit/s 則不加 PS ,相當于普通的 HE-AAC,

特點: 在小于 128Kbit/s 的碼率下表現優異,并且多用于視頻中的音頻編碼,

場景: 128 Kbit/s 以下的音頻編碼,多用于視頻中音頻軌的編碼,

Ogg 編碼

Ogg 是一種非常有潛力的編碼,在各種碼率下都有比較優秀的表現,尤其是在中低碼率場景下,Ogg 除了音質好之外,還是完全免費的,這為 Ogg 獲得更多的支持打好了基礎,Ogg 有著非常出色的演算法,可以用更小的碼率達到更好的音質,128 Kbit/s 的 Ogg 比 192kbit/s 甚至更高碼率的 MP3 還要出色,但是目前因為還沒有媒體服務軟體的支持,因此基于 Ogg 的數字廣播還無法實作,Ogg 目前受支持的情況還不夠好,無論是軟體上的還是硬體上的支持,都無法和 MP3 相提并論,

特點: 可以用比 MP3 更小的碼率實作比 MP3 更好的音質,高中低碼率下均有良好的表現,兼容性不夠好,流媒體特性不支持,

場景: 語言聊天的音頻訊息場景,

音視頻開發學習資料添加小編的C/C++交流群:960994558
學習資料已經共享在群里了,期待你的加入
在這里插入圖片描述
在這里插入圖片描述

Android 平臺下的音頻渲染

AudioTrack 的使用

由于 AudioTrack 是 Android SDK 層提供的最底層的 音頻播放 API,因此只允許輸入裸資料 PCM ,和 MediaPlayer 相比,對于一個壓縮的音頻檔案(比如 MP3 、AAC 等檔案),它只需要自行實作解碼操作和緩沖區控制,因為這里只涉及 AudioTrack 的音頻渲染端,編解碼我們后面在講解,所以本小節只介紹如何使用 AudioTrack 渲染音頻 PCM 裸資料,

配置 AudioTrack

public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
            int bufferSizeInBytes, int mode)

streamType:Android 手機提供了多重音頻管理策略,當系統又多個行程需要播放音頻的時候,管理策略會決定最終的呈現效果,該引數的可選值將以常量的形式定義在類 AudioManager 中,主要包括以下內容:

/**電話鈴聲 */
    public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL;
    /** 系統鈴聲 */
    public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;
    /** 鈴聲*/
    public static final int STREAM_RING = AudioSystem.STREAM_RING;
    /** 音樂聲 */
    public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;
    /** 警告聲 */
    public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;
    /** 通知聲 */
    public static final int STREAM_NOTIFICATION = AudioSystem.STREAM_NOTIFICATION;

sampleRateInHz:采樣率,即播放的音頻每秒鐘會有沒少次采樣,可選用的采樣頻率串列為: 8000 , 16000 , 22050 , 24000 ,32000 , 44100 , 48000 等,大家可以根據自己的應用場景進行合理的選擇,

channelConfig: 聲道數的配置,可選值以常量的形式配置在類 AudioFormat 中,常用的是 CHANNEL_IN_MONO (單聲道)、CHANNEL_IN_STEREO (雙聲道) ,因為現在大多數手機的麥克風都是偽立體聲采集,為了性能考慮,建議使用單聲道進行采集,

audioFormat: 該引數是用來配置 “資料位寬” 的,即采樣格式,可選值以常量的形式定義在類 AudioFormat 中,分別為 ENCODING_PCM_16BIT (兼容所有手機)、ENCODING_PCM_8BIT ,

bufferSizeInBytes: 配置內部的音頻緩沖區的大小, AudioTrack 類提供了一個幫助開發者確定的 bufferSizeInBytes 的函式,其原型具體如下:

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)

在實際開發中,強烈建議由該函式計算出需要傳入的緩沖區大小,而不是手動計算,

mode: AudioTrack 提供了兩種播放模式,可選的值以常量的形式定義在類 AudioTrack 中,一個是 MODE_STATIC , 需要一次性將所有的資料都寫入播放緩沖區中,簡單高效,通常用于播放鈴聲、系統提醒的音頻片段;另一個是 MODE_STREAM ,需要按照一定的時間間隔不斷地寫入音頻資料,理論上它可以應用于任何音頻播放的場景,

Play

//當前播放實體是否初始化成功,如果處于初始化成功的狀態并且未播放的狀態,那么就呼叫 play
if (null != mAudioTrack && mAudioTrack.getState() != AudioTrack.STATE_UNINITIALIZED && mAudioTrack.getPlayState() != PLAYSTATE_PLAYING)
   mAudioTrack.play();

銷毀資源

public void release() {
        Log.d(TAG, "==release===");
        mStatus = Status.STATUS_NO_READY;
        if (mAudioTrack != null) {
            mAudioTrack.release();
            mAudioTrack = null;
        }
    }

具體實體請移步 AudioPlay 專案的 AudioTracker 部分,需要把專案中 raw 目錄下的 pcm 檔案放入 sdcard 跟目錄中,

OpenSL ES 的使用

OpenSL ES 官方檔案

OpenSL ES 全稱(Open Sound Library for Embedded System) ,即嵌入式音頻加速標準,OpenSL ES 是無授權費、跨平臺、針對嵌入式系統精心優化的硬體音頻加速 API ,它能為嵌入式移動多媒體設備上的本地應用程式開發者提供了標準化、高性能、低回應時間的音頻功能實作方法,同時還實作了軟/硬音頻性能的直接跨平臺部署,不僅降低了執行難度,而且還促進了高級音頻市場的發展,在這里插入圖片描述
上圖描述了 OpenSL ES 的架構,在 Android 中,High Level Audio Libs 是音頻 Java 層 API 輸入輸出,屬于高級 API , 相對來說,OpenSL ES 則是比價低層級的 API, 屬于 C 語言 API ,在開發中,一般會直接使用高級 API , 除非遇到性能瓶頸,如語音實時聊天、3D Audio 、某些 Effects 等,開發者可以直接通過 C/C++ 開發基于 OpenSL ES 音頻的應用,

在使用 OpenSL ES 的 API 之前,需要引入 OpenSL ES 的頭檔案,代碼如下:

// 這是標準的OpenSL ES庫
#include <SLES/OpenSLES.h>
// 這里是針對安卓的擴展,如果要垮平臺則需要注意
#include <SLES/OpenSLES_Android.h>

創建引擎并獲取引擎介面

void createEngine() {
        // 音頻的播放,就涉及到了,OpenLSES
        // TODO 第一大步:創建引擎并獲取引擎介面
        // 1.1創建引擎物件:SLObjectItf engineObject
        SLresult result = slCreateEngine(&engineObj, 0, NULL, 0, NULL, NULL);
        if (SL_RESULT_SUCCESS != result) {
            return;
        }
 
        // 1.2 初始化引擎
        result = (*engineObj) ->Realize(engineObj, SL_BOOLEAN_FALSE);
        if (SL_BOOLEAN_FALSE != result) {
            return;
        }
 
        // 1.3 獲取引擎介面 SLEngineItf engineInterface
        result = (*engineObj) ->GetInterface(engineObj, SL_IID_ENGINE, &engine);
        if (SL_RESULT_SUCCESS != result) {
            return;
        }
 
         
    }

設定混音器

// TODO 第二大步 設定混音器
        // 2.1 創建混音器:SLObjectItf outputMixObject
        result = (*engine)->CreateOutputMix(engine, &outputMixObj, 0, 0, 0);
 
        if (SL_RESULT_SUCCESS != result) {
            return;
        }
 
        // 2.2 初始化 混音器
        result = (*outputMixObj)->Realize(outputMixObj, SL_BOOLEAN_FALSE);
        if (SL_BOOLEAN_FALSE != result) {
            return;
        }

創建播放器

// TODO 第三大步 創建播放器
    // 3.1 配置輸入聲音資訊
    // 創建buffer緩沖型別的佇列 2個佇列
    SLDataLocator_AndroidSimpleBufferQueue locBufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
    // pcm資料格式
    // SL_DATAFORMAT_PCM:資料格式為pcm格式
    // 2:雙聲道
    // SL_SAMPLINGRATE_44_1:采樣率為44100(44.1赫茲 應用最廣的,兼容性最好的)
    // SL_PCMSAMPLEFORMAT_FIXED_16:采樣格式為16bit (16位)(2個位元組)
    // SL_PCMSAMPLEFORMAT_FIXED_16:資料大小為16bit (16位)(2個位元組)
    // SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT:左右聲道(雙聲道)  (雙聲道 立體聲的效果)
    // SL_BYTEORDER_LITTLEENDIAN:小端模式
    SLDataFormat_PCM formatPcm = {SL_DATAFORMAT_PCM, (SLuint32) mChannels, mSampleRate,
                                  (SLuint32) mSampleFormat, (SLuint32) mSampleFormat,
                                  mChannels == 2 ? 0 : SL_SPEAKER_FRONT_CENTER,
                                  SL_BYTEORDER_LITTLEENDIAN};
    /*
     * Enable Fast Audio when possible:  once we set the same rate to be the native, fast audio path
     * will be triggered
     */
    if (mSampleRate) {
        formatPcm.samplesPerSec = mSampleRate;
    }
 
    // 資料源 將上述配置資訊放到這個資料源中
    SLDataSource audioSrc = {&locBufq, &formatPcm};
 
    // 3.2 配置音軌(輸出)
    // 設定混音器
    SLDataLocator_OutputMix locOutpuMix = {SL_DATALOCATOR_OUTPUTMIX, mAudioEngine->outputMixObj};
    SLDataSink audioSink = {&locOutpuMix, nullptr};
 
    /*
     * create audio player:
     *     fast audio does not support when SL_IID_EFFECTSEND is required, skip it
     *     for fast audio case
     */
    //  需要的介面 操作佇列的介面
    const SLInterfaceID ids[3] = {SL_IID_BUFFERQUEUE, SL_IID_VOLUME, SL_IID_EFFECTSEND};
    const SLboolean req[3] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
 
    //  3.3 創建播放器
    result = (*mAudioEngine->engine)->CreateAudioPlayer(mAudioEngine->engine, &mPlayerObj,
                                                        &audioSrc, &audioSink,
                                                        mSampleRate ? 2 : 3, ids, req);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("CreateAudioPlayer failed: %d", result);
        return false;
    }
 
    //  3.4 初始化播放器:mPlayerObj
    result = (*mPlayerObj)->Realize(mPlayerObj, SL_BOOLEAN_FALSE);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj Realize failed: %d", result);
        return false;
    }
//  3.5 獲取播放器介面:SLPlayItf mPlayerObj
    result = (*mPlayerObj)->GetInterface(mPlayerObj, SL_IID_PLAY, &mPlayer);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj GetInterface failed: %d", result);
        return false;
    }

設定播放回呼函式

// TODO 第四大步:設定播放回呼函式
    // 4.1 獲取播放器佇列介面:SLAndroidSimpleBufferQueueItf mBufferQueue
    result = (*mPlayerObj)->GetInterface(mPlayerObj, SL_IID_BUFFERQUEUE, &mBufferQueue);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj GetInterface failed: %d", result);
        return false;
    }
// 4.2 設定回呼 void playerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)
    result = (*mBufferQueue)->RegisterCallback(mBufferQueue, playerCallback, this);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj RegisterCallback failed: %d", result);
        return false;
    }
 
    mEffectSend = nullptr;
    if (mSampleRate == 0) {
        result = (*mPlayerObj)->GetInterface(mPlayerObj, SL_IID_EFFECTSEND, &mEffectSend);
        if (result != SL_RESULT_SUCCESS) {
            LOGE("mPlayerObj GetInterface failed: %d", result);
            return false;
        }
    }
 
    result = (*mPlayerObj)->GetInterface(mPlayerObj, SL_IID_VOLUME, &mVolume);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj GetInterface failed: %d", result);
        return false;
    }

設定播放器狀態

  // TODO 第五大步:設定播放器狀態為播放狀態
    result = (*mPlayer)->SetPlayState(mPlayer, SL_PLAYSTATE_PLAYING);
    if (result != SL_RESULT_SUCCESS) {
        LOGE("mPlayerObj SetPlayState failed: %d", result);
        return false;
    }

手動激活回呼函式

void OpenSLAudioPlay::enqueueSample(void *data, size_t length) {
    // 必須等待一幀音頻播放完畢后才可以 Enqueue 第二幀音頻
    pthread_mutex_lock(&mMutex);
    if (mBufSize < length) {
        mBufSize = length;
        if (mBuffers[0]) {
            delete[] mBuffers[0];
        }
        if (mBuffers[1]) {
            delete[] mBuffers[1];
        }
        mBuffers[0] = new uint8_t[mBufSize];
        mBuffers[1] = new uint8_t[mBufSize];
    }
    memcpy(mBuffers[mIndex], data, length);
    // TODO 第六步:手動激活回呼函式
    (*mBufferQueue)->Enqueue(mBufferQueue, mBuffers[mIndex], length);
    mIndex = 1 - mIndex;
}

釋放資源

extern "C"
JNIEXPORT void JNICALL
Java_com_devyk_audioplay_AudioPlayActivity_nativeStopPcm(JNIEnv *env, jclass type) {
    isPlaying = false;
    if (slAudioPlayer) {
        slAudioPlayer->release();
        delete slAudioPlayer;
        slAudioPlayer = nullptr;
    }
    if (pcmFile) {
        fclose(pcmFile);
        pcmFile = nullptr;
    }
}

完整的代碼請參考倉庫中 OpenSL ES 部分,注意:需要把 raw 中的 pcm 檔案放入 sdcard 根目錄下,

總結

該篇文章主要介紹了音頻的一些基礎知識和使用 AudioTrack 以及 OpenSL ES 來渲染裸流音頻資料,大家可以根據我的源代碼中在加深理解,

最后的頁面效果:
在這里插入圖片描述
在這里插入圖片描述

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

標籤:其他

上一篇:【Inpho精品教程】任務二:Inpho創建工程(創建專案、新建相機引數、匯入照片、匯入POS、生成航條、保存專案)

下一篇:做了5年Android開發,混吃等死的日子才是我人生最辛苦的日子!

標籤雲
其他(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