主頁 > 區塊鏈 > 處理來自視頻解碼器MFT的MF_E_TRANSFORM_STREAM_CHANGE

處理來自視頻解碼器MFT的MF_E_TRANSFORM_STREAM_CHANGE

2022-01-16 15:00:58 區塊鏈

我正在嘗試使用 .甚至僅解碼單個 H264 幀H264 Decoder MFT,但我一直遇到ProcessOutput(). 我已經HRESULT盡可能地減少了 bad ,但我目前堅持處理MF_E_TRANSFORM_STREAM_CHANGE. 這發生在我將 pSample 設定為等于我的 assignedoutput_sample和 callProcessOutput()之后,因為此解碼器需要您分配自己的樣本。我嘗試使用SetOutputType()我的configure_decoder()函式中的輸出型別重置輸出型別,但是我得到了一個錯誤的 HRESULT。不知道下一步該怎么做。

處理來自視頻解碼器 MFT 的 MF_E_TRANSFORM_STREAM_CHANGE

// libs
#pragma comment(lib, "D3D11.lib")
#pragma comment(lib, "mfplat.lib")
#pragma comment(lib, "mf.lib")
#pragma comment(lib, "evr.lib")
#pragma comment(lib, "mfuuid.lib")
#pragma comment(lib, "Winmm.lib")
// std
#include <iostream>
#include <string>
#include <fstream>
// Windows
#include <windows.h>
#include <atlbase.h>
// DirectX
#include <d3d11.h>
// Media Foundation
#include <mfapi.h>
#include <mfplay.h>
#include <mfreadwrite.h>
#include <mferror.h>
// Others
#include <chrono>
#include <thread>
#include <direct.h> // for mkdir()
#include <Codecapi.h> // for CODECAPI_AVDecVideoAcceleration_H264
#include <comdef.h>
// Custom

// Constants
constexpr UINT decode_width = 1920;
constexpr UINT decode_height = 1080;

HRESULT init_mf()
{
    HRESULT hr = S_OK;
    if (FAILED(hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED)))
        return hr;
    if (FAILED(hr = MFStartup(MF_VERSION)))
        return hr;

    std::cout << "- Initialized Media Foundation" << std::endl;

    return hr;
}

HRESULT init_dxgi(CComPtr<ID3D11Device>& out_device, CComPtr<ID3D11DeviceContext>& in_context)
{
    HRESULT hr = S_OK;

    if (FAILED(hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_VIDEO_SUPPORT /*|
        D3D11_CREATE_DEVICE_DEBUG*/, nullptr, 0, D3D11_SDK_VERSION, &out_device, nullptr, &in_context)))
        return hr;

    std::cout << "- Initialized DXGI" << std::endl;

    return hr;
}

HRESULT get_decoder(CComPtr<IMFTransform>& out_transform, CComPtr<IMFActivate>& out_activate,
    CComPtr<IMFAttributes>& out_attributes)
{
    HRESULT hr = S_OK;

    // Find the decoder
    CComHeapPtr<IMFActivate*> activate_raw;
    uint32_t activateCount = 0;

    // Input & output types
    const MFT_REGISTER_TYPE_INFO in_info = { MFMediaType_Video, MFVideoFormat_H264 };
    const MFT_REGISTER_TYPE_INFO out_info = { MFMediaType_Video, MFVideoFormat_NV12 };

    // Get decoders matching the specified attributes
    if (FAILED(hr = MFTEnum2(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_SORTANDFILTER, &in_info, &out_info,
        nullptr, &activate_raw, &activateCount)))
        return hr;

    // Choose the first returned decoder
    out_activate = activate_raw[0];

    // Memory management
    for (int i = 1; i < activateCount; i  )
        activate_raw[i]->Release();

    // Activate
    if (FAILED(hr = out_activate->ActivateObject(IID_PPV_ARGS(&out_transform))))
        return hr;

    // Get attributes
    if (FAILED(hr = out_transform->GetAttributes(&out_attributes)))
        return hr;

    std::cout << "- get_decoder() Found " << activateCount << " decoders" << std::endl;

    return hr;
}

HRESULT configure_decoder(const CComPtr<IMFTransform>& in_transform, CComPtr<IMFDXGIDeviceManager>& in_device_manager,
    const DWORD in_input_stream_id, const DWORD output_stream_id
)
{
    HRESULT hr = S_OK;

    // Sets or clears the Direct3D Device Manager for DirectX Video Acceleration (DXVA).
    /*if (FAILED(hr = in_transform->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, reinterpret_cast<ULONG_PTR>(in_device_manager.p))))
        return hr;*/

        // Input type, I have no idea how to do this
    CComPtr<IMFMediaType> input_type;
    /*if (FAILED(hr = MFCreateMediaType(&inputType)))
        return hr;*/

    if (FAILED(hr = in_transform->GetInputAvailableType(in_input_stream_id, 0, &input_type)))
        return hr;

    // Input type settings
    if (FAILED(hr = input_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)))
        return hr;
    if (FAILED(hr = input_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264)))
        return hr;
    if (FAILED(hr = input_type->SetUINT32(MF_MT_AVG_BITRATE, 30000000)))
        return hr;
    if (FAILED(hr = MFSetAttributeSize(input_type, MF_MT_FRAME_SIZE, decode_width, decode_height)))
        return hr;
    if (FAILED(hr = MFSetAttributeRatio(input_type, MF_MT_FRAME_RATE, 60, 1)))
        return hr;
    if (FAILED(hr = input_type->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlaceMode::MFVideoInterlace_Progressive)))
        return hr;

    // Set input type
    if (FAILED(hr = in_transform->SetInputType(in_input_stream_id, input_type, 0)))
        return hr;

    // Create output type
    CComPtr<IMFMediaType> output_type;
    if (FAILED(hr = MFCreateMediaType(&output_type)))
        return hr;

    // Set output type
    if (FAILED(hr = output_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)))
        return hr;
    if (FAILED(hr = output_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12)))
        return hr;
    if (FAILED(hr = MFSetAttributeSize(output_type, MF_MT_FRAME_SIZE, decode_width, decode_height)))
        return hr;
    if (FAILED(hr = MFSetAttributeRatio(output_type, MF_MT_FRAME_RATE, 60, 1)))
        return hr;
    if (FAILED(hr = MFSetAttributeRatio(output_type, MF_MT_PIXEL_ASPECT_RATIO, 1, 1)))
        return hr;
    /*if (FAILED(hr = output_type->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlaceMode::MFVideoInterlace_Progressive)))
        return hr;*/

        // Set output type
    if (FAILED(hr = in_transform->SetOutputType(output_stream_id, output_type, 0)))
        return hr;



    std::cout << "- Set decoder configuration" << std::endl;

    // AMD decoder crashes on this line
    /*DWORD flags;
    if (FAILED(hr = inTransform->GetInputStatus(0, &flags)))
        return hr;*/

    return hr;
}

HRESULT configure_color_conversion(IMFTransform* in_color_transform)
{
    HRESULT hr = S_OK;

    CComPtr<IMFMediaType> input_type;
    if (FAILED(hr = MFCreateMediaType(&input_type)))
        return hr;
    if (FAILED(hr = input_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)))
        return hr;
    if (FAILED(hr = input_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12)))
        return hr;
    if (FAILED(hr = MFSetAttributeSize(input_type, MF_MT_FRAME_SIZE, decode_width, decode_height)))
        return hr;

    if (FAILED(hr = in_color_transform->SetInputType(0, input_type, 0)))
        return hr;

    CComPtr<IMFMediaType> output_type;
    if (FAILED(hr = MFCreateMediaType(&output_type)))
        return hr;
    if (FAILED(hr = output_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)))
        return hr;
    if (FAILED(hr = output_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_ARGB32)))
        return hr;
    if (FAILED(hr = MFSetAttributeSize(output_type, MF_MT_FRAME_SIZE, decode_width, decode_height)))
        return hr;

    if (FAILED(hr = in_color_transform->SetOutputType(0, output_type, 0)))
        return hr;

    return hr;
}

HRESULT color_convert(IMFTransform* in_transform, ID3D11Texture2D* in_texture, IMFSample** p_sample_out)
{
    HRESULT hr = S_OK;

    // Copy texture, since the one that desktop duplication generates can die at random
    CD3D11_TEXTURE2D_DESC desc;
    in_texture->GetDesc(&desc);
    CComPtr<ID3D11Device> device;
    in_texture->GetDevice(&device);
    const CD3D11_TEXTURE2D_DESC copy_desc(desc.Format, desc.Width, desc.Height, 1, 1, D3D11_BIND_SHADER_RESOURCE |
        D3D11_BIND_RENDER_TARGET);
    CComPtr<ID3D11Texture2D> copy_texture;
    device->CreateTexture2D(&copy_desc, nullptr, &copy_texture);
    CComPtr<ID3D11DeviceContext> device_context;
    device->GetImmediateContext(&device_context);
    device_context->CopyResource(copy_texture, in_texture);
    in_texture = copy_texture;

    // Create buffer
    CComPtr<IMFMediaBuffer> input_buffer;
    if (FAILED(hr = MFCreateDXGISurfaceBuffer(__uuidof(ID3D11Texture2D), in_texture, 0, false, &input_buffer)))
        return hr;

    // Create sample
    CComPtr<IMFSample> input_sample;
    if (FAILED(hr = MFCreateSample(&input_sample)))
        return hr;
    if (FAILED(hr = input_sample->AddBuffer(input_buffer)))
        return hr;

    // Set input sample times
    if (FAILED(hr = input_sample->SetSampleTime(100)))
        return hr;
    if (FAILED(hr = input_sample->SetSampleDuration(1000)))
        return hr;

    // Process input
    if (FAILED(hr = in_transform->ProcessInput(0, input_sample, 0)))
        return hr;

    // Process output
    DWORD status;
    MFT_OUTPUT_DATA_BUFFER output_buffer;
    output_buffer.pSample = nullptr;
    output_buffer.pEvents = nullptr;
    output_buffer.dwStreamID = 0;
    output_buffer.dwStatus = 0;

    MFT_OUTPUT_STREAM_INFO mft_stream_info;
    ZeroMemory(&mft_stream_info, sizeof(MFT_OUTPUT_STREAM_INFO));

    if (FAILED(hr = in_transform->GetOutputStreamInfo(0, &mft_stream_info)))
        return hr;

    ATLASSERT(mft_stream_info.dwFlags & MFT_OUTPUT_STREAM_PROVIDES_SAMPLES);

    if (FAILED(hr = in_transform->ProcessOutput(0, 1, &output_buffer, &status)))
        return hr;

    *p_sample_out = output_buffer.pSample;

    // Test output to file
    /*IMFMediaBuffer* buffer;
    if (FAILED(hr = outputBuffer.pSample->ConvertToContiguousBuffer(&buffer)))
        return hr;

    unsigned char* data;
    DWORD length;
    if (FAILED(hr = buffer->GetCurrentLength(&length)))
        return hr;

    if (FAILED(hr = buffer->Lock(&data, nullptr, &length)))
        return hr;

    std::ofstream fout;
    fout.open("raw.nv12", std::ios::binary | std::ios::out);
    fout.write((char*)data, length);
    fout.close();

    if (FAILED(hr = buffer->Unlock()))
        return hr;*/
        // End test output

    return hr;
}

int main()
{
    HRESULT hr;

    if (FAILED(hr = init_mf()))
        return hr;

    // Initialize DXGI
    CComPtr<ID3D11Device> device;
    CComPtr<ID3D11DeviceContext> context;
    if (FAILED(hr = init_dxgi(device, context)))
        return hr;

    // Create device manager
    CComPtr<IMFDXGIDeviceManager> device_manager;
    UINT resetToken;
    if (FAILED(hr = MFCreateDXGIDeviceManager(&resetToken, &device_manager)))
        return hr;

    // https://docs.microsoft.com/en-us/windows/win32/api/dxva2api/nf-dxva2api-idirect3ddevicemanager9-resetdevice
    // When you first create the Direct3D device manager, call this method with a pointer to the Direct3D device.
    if (FAILED(hr = device_manager->ResetDevice(device, resetToken)))
        return hr;

    // Get decoder
    CComPtr<IMFTransform> decoder_transform;
    CComPtr<IMFActivate> decoder_activate;
    CComPtr<IMFAttributes> decoder_attributes;
    CComQIPtr<IMFMediaEventGenerator> decoder_event_generator;
    if (FAILED(hr = get_decoder(decoder_transform, decoder_activate, decoder_attributes)))
        return hr;

    // Get the name of the decoder
    CComHeapPtr<wchar_t> friendly_name;
    uint32_t friendly_name_length;
    if (FAILED(hr = decoder_activate->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &friendly_name, &friendly_name_length)))
        return hr;
    std::wcout << "- Selected decoder: " << static_cast<wchar_t const*>(friendly_name) << std::endl;

    // Enable hardware acceleration
    if (FAILED(hr = decoder_attributes->SetUINT32(CODECAPI_AVDecVideoAcceleration_H264, true)))
        return hr;
    // Enable low-latency mode - otherwise the decoder will require many input frames before it's able produce any output
    if (FAILED(hr = decoder_attributes->SetUINT32(CODECAPI_AVLowLatencyMode, true)))
        return hr;

    // Get decoder stream IDs
    DWORD input_stream_id, output_stream_id;
    hr = decoder_transform->GetStreamIDs(1, &input_stream_id, 1, &output_stream_id);
    if (hr == E_NOTIMPL) // Doesn't mean failed, see remarks
    {                    // https://docs.microsoft.com/en-us/windows/win32/api/mftransform/nf-mftransform-imftransform-getstreamids
        input_stream_id = 0;
        output_stream_id = 0;
        hr = S_OK;
    }
    if (FAILED(hr))
        return hr;

    // Init decoder-related objects/variables
    if (FAILED(hr = configure_decoder(decoder_transform, device_manager, input_stream_id, output_stream_id)))
        return hr;

    // Apparently you can do this, idek man
    decoder_event_generator = decoder_transform;

    // Init color conversion-related objects/variables
    IMFTransform* color_transform;
    if (FAILED(hr = CoCreateInstance(CLSID_VideoProcessorMFT, nullptr, CLSCTX_INPROC_SERVER,
        IID_IMFTransform, (void**)&color_transform)))
        return hr;

    if (FAILED(hr = color_transform->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, reinterpret_cast<ULONG_PTR>(device_manager.p))))
        return hr;

    if (FAILED(hr = configure_color_conversion(color_transform)))
        return hr;

    if (FAILED(hr = decoder_transform->ProcessMessage(MFT_MESSAGE_COMMAND_FLUSH, NULL)))
        return hr;
    if (FAILED(hr = decoder_transform->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, NULL)))
        return hr;
    if (FAILED(hr = decoder_transform->ProcessMessage(MFT_MESSAGE_NOTIFY_START_OF_STREAM, NULL)))
        return hr;

    int frameIndex = 1;
    do
    {
        // Read frame data from .h264 file
        std::ifstream fin("..\\CaptureAndEncode\\Encoded Frames\\frame"   std::to_string(frameIndex)   ".h264", std::ios::binary |
            std::ios::in);

        if (!fin)
            throw std::runtime_error("Invalid file path specified");

        // Get file length
        fin.seekg(0, std::ios::end);
        size_t length = fin.tellg();
        fin.seekg(0, std::ios::beg);

        // Variables
        CComPtr<IMFMediaBuffer> input_buffer;
        CComPtr<IMFSample> input_sample;
        DWORD cbMaxLength, cbCurrentLength;
        BYTE* pBuffer;

        // Create memory buffer and make the underlying array readable/writeable by using Lock()
        if (FAILED(hr = MFCreateMemoryBuffer(length, &input_buffer)))
            return hr;
        if (FAILED(hr = input_buffer->Lock(&pBuffer, &cbMaxLength, &cbCurrentLength)))
            return hr;

        // Copy frame data from file to array;
        fin.read((char*)pBuffer, length);
        fin.close();

        // Unlock it again (no longer readable/writeable)
        if (FAILED(hr = input_buffer->Unlock()))
            return hr;
        if (FAILED(hr = input_buffer->SetCurrentLength(length)))
            return hr;

        // Create sample and add the buffer to it
        if (FAILED(hr = MFCreateSample(&input_sample)))
            return hr;
        if (FAILED(hr = input_sample->AddBuffer(input_buffer)))
            return hr;

        // Process input
        hr = decoder_transform->ProcessInput(0, input_sample, 0);
        if (SUCCEEDED(hr))
            std::cout << "decoder_transform::ProcessInput() - SUCCESS" << std::endl;
        else if (hr == MF_E_NOTACCEPTING)
            std::cout << "decoder_transform::ProcessInput() - MF_E_NOTACCEPTING" << std::endl;
        else
            std::cout << "decoder_transform::ProcessInput() - ERROR" << std::endl;

        // Output H264 -> NV12
        DWORD status;
        MFT_OUTPUT_DATA_BUFFER output_buffer;
        output_buffer.pSample = nullptr;
        output_buffer.pEvents = nullptr;
        output_buffer.dwStreamID = 0;
        output_buffer.dwStatus = 0;

        MFT_OUTPUT_STREAM_INFO mft_stream_info;
        ZeroMemory(&mft_stream_info, sizeof(MFT_OUTPUT_STREAM_INFO));

        if (FAILED(hr = decoder_transform->GetOutputStreamInfo(0, &mft_stream_info)))
            return hr;

        if ((mft_stream_info.dwFlags & MFT_OUTPUT_STREAM_PROVIDES_SAMPLES) == 0 &&
            (mft_stream_info.dwFlags & MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES) == 0)
        {
            std::cout << "This decoder requires that we allocate the output sample ourselves" << std::endl;

            CComPtr<IMFSample> output_sample;
            CComPtr<IMFMediaBuffer> output_media_buffer;

            if (FAILED(hr = MFCreateSample(&output_sample)))
                return hr;

            if (FAILED(hr = MFCreateMemoryBuffer(mft_stream_info.cbSize, &output_media_buffer)))
                return hr;

            if (FAILED(hr = output_sample->AddBuffer(output_media_buffer)))
                return hr;

            output_buffer.pSample = output_sample.Detach();
        }

        hr = decoder_transform->ProcessOutput(0, 1, &output_buffer, &status);
        if (SUCCEEDED(hr))
        {
            std::cout << "decoder_transform::ProcessOutput() - SUCCESS" << std::endl;
            // Test output to file
            IMFMediaBuffer* buffer;
            if (FAILED(hr = output_buffer.pSample->ConvertToContiguousBuffer(&buffer)))
                return hr;

            unsigned char* data;
            DWORD length;
            if (FAILED(hr = buffer->GetCurrentLength(&length)))
                return hr;

            if (FAILED(hr = buffer->Lock(&data, nullptr, &length)))
                return hr;

            std::ofstream fout;
            fout.open("raw.nv12", std::ios::binary | std::ios::out);
            fout.write((char*)data, length);
            fout.close();

            if (FAILED(hr = buffer->Unlock()))
                return hr;
            // End test output
        }   
        else if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
            std::cout << "decoder_transform::ProcessOutput() - MF_E_TRANSFORM_NEED_MORE_INPUT" << std::endl;
        else if (hr == E_INVALIDARG)
            std::cout << "decoder_transform::ProcessOutput() - E_INVALIDARG" << std::endl;
        else if (hr == MF_E_TRANSFORM_STREAM_CHANGE)
        {
            std::cout << "decoder_transform::ProcessOutput() - MF_E_TRANSFORM_STREAM_CHANGE" << std::endl;

            CComPtr<IMFMediaType> output_type;
            if (FAILED(hr = decoder_transform->GetOutputAvailableType(0, 0, &output_type)))
                return hr;

            // Create output type
            /*if (FAILED(hr = MFCreateMediaType(&output_type)))
                return hr;*/

            // Reconfigure output settings
            if (FAILED(hr = output_type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)))
                return hr;
            if (FAILED(hr = output_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_NV12)))
                return hr;
            if (FAILED(hr = MFSetAttributeRatio(output_type, MF_MT_PIXEL_ASPECT_RATIO, 1, 1)))
                return hr;

            // Set output type
            if (FAILED(hr = decoder_transform->SetOutputType(output_stream_id, output_type, 0)))
                return hr;
        }

        frameIndex  ;

        input_sample.Release();
    } while (frameIndex <= 60);


    return hr;
}

uj5u.com熱心網友回復:

您只需要在處理流更改中遵循這一點

  1. 客戶來電IMFTransform::GetOutputAvailableType此方法回傳一組更新的輸出型別。
  2. 客戶端呼叫SetOutputType設定新的輸出型別。
  3. 客戶端繼續呼叫ProcessInput/ ProcessOutput

在上面的問題正文中,您嘗試執行 3 而不執行 2。您的媒體型別很可能與 MFT 有所不同,因此它可能會拒絕它并阻止處理,直到解決此問題。

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

標籤:

上一篇:Pythonctypes-嘗試ReadProcessMemory時收到ERROR_PARTIAL_COPY

下一篇:獲取H.264視頻的解碼器MFT

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

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

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

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more