当前位置: 首页 > news >正文

通过多线程获取RV1126的AAC码流

目录

一RV1126多线程获取音频编码AAC码流的流程

1.1AI模块的初始化并使能

1.2AENC模块的初始化

​​​​​​​1.3绑定AI模块和AENC模块

​​​​​​​1.4多线程获取每一帧AAC码流

​​​​​​​1.5每个AAC码流添加ADTSHeader头部

​​​​​​​1.6写入具体每一帧AAC的ES码流

二代码实战


一RV1126多线程获取音频编码AAC码流的流程

上面是RV1126多线程获取AAC码流的流程,分为六步:AI模块的初始化并使能、AENC模块的初始化、绑定AI模块和AENC模块、创建多线程获取AAC码流、向每个AAC码流添加ADTSHeader头部(这个是重点)、写入具体每一帧AAC的ES码流。

1.1AI模块的初始化并使能

AI模块的初始化实际上就是对AI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_AI_SetChnAttr设置AI模块并使能RK_MPI_AI_EnableChn,伪代码如下:

AI_CHN_ATTR_S ai_chn_s;

ai_chn_s.pcAudioNode = AUDIO_PATH;

ai_chn_s.u32Channels = 2;

ai_chn_s.u32NbSamples = 1024;

ai_chn_s.u32SampleRate = 48000;

ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL;

ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16;

ret = RK_MPI_AI_SetChnAttr(AI_CHN, &ai_chn_s);

if(ret)

{

   printf("RK_MPI_AI_SetChnAttr Failed...\n");

}

ret = RK_MPI_AI_EnableChn(AI_CHN);

if(ret)

{

     printf("RK_MPI_AI_EnableChn Failed...\n");

}

​​​​​​​1.2AENC模块的初始化

AENC模块的初始化实际上就是对AI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_AENC_CreateChn设置AENC模块伪代码如下:

AENC_CHN_ATTR_S aenc_attr;

aenc_attr.enCodecType = RK_CODEC_TYPE_AAC;

aenc_attr.u32Bitrate = 64000;

aenc_attr.u32Quality = 1;

aenc_attr.stAencAAC.u32Channels = 2;

aenc_attr.stAencAAC.u32SampleRate = 48000;

ret = RK_MPI_AENC_CreateChn(AENC_CHN, &aenc_attr);

if (ret)

{

        printf("Create AENC[0] failed! ret=%d\n", ret);

        return -1;

 }else{

        printf("Create AENC[0] success!\n");

}

​​​​​​​1.3绑定AI模块和AENC模块

分别创建两个MPP_CHN_S结构体,分别是AI模块的MPP_CHN_S和AENC模块的MPP_CHN_S,创建完成之后则用RK_MPI_SYS_Bind对两个模块进行绑定

MPP_CHN_S ai_mpp_chn_s;

ai_mpp_chn_s.enModId = RK_ID_AI;

ai_mpp_chn_s.s32ChnId = 0;

MPP_CHN_S aenc_mpp_chn_s;

aenc_mpp_chn_s.enModId = RK_ID_AENC;

aenc_mpp_chn_s.s32ChnId = 0;

ret = RK_MPI_SYS_Bind(&ai_mpp_chn_s, &aenc_mpp_chn_s);

if (ret)

 {

        printf("RK_MPI_SYS_Bind Failed....\n");

 }else{

        printf("RK_MPI_SYS_Bind Success....\n");

}

​​​​​​​1.4多线程获取每一帧AAC码流

开启一个线程去采集每一帧AENC模块的数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_AENC,通道号ID是AENC创建的通道ID号。这里需要注意的是,要进行两层写入。第一层要进行adts header头部的写入,第二层则需要进行adts es流的写入

....................................................

While(1)

{

 mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AENC, AENC_CHN, -1);

 if (!mb)

 {

        printf("Get Aenc_Buffer break...\n");

        break;

 }

 ...................................

 fwrite(aac_header, 1, 7, aac_file); //对每一帧AAC码流写入adts_header头部

 fwrite(RK_MPI_MB_GetPtr(mb), 1, RK_MPI_MB_GetSize(mb), aac_file); //写入每一帧AAC的ES码流

}

.......................................................

​​​​​​​1.5每个AAC码流添加ADTSHeader头部

在写入AACES码流前需要对其进行ADTS Header的封装,adts header头部分为:adts_fixed_header和adts_variable_header。在对其写入的时候需要把这两个头部都一并写到码流上面。下面就是封装的具体方法。

typedef struct AacFreqIdx_

{

    RK_S32 u32SmpRate;

    RK_U8 u8FreqIdx;

} AacFreqIdx;

AacFreqIdx AacFreqIdxTbl[13] = {{96000, 0}, {88200, 1}, {64000, 2}, {48000, 3}, {44100, 4}, {32000, 5}, {24000, 6}, {22050, 7}, {16000, 8}, {12000, 9}, {11025, 10}, {8000, 11}, {7350, 12}};

static void GetAdtsHeader(RK_U8 *pu8AdtsHdr, RK_S32 u32SmpleRate, RK_U8 u8Channel,RK_U32 u32DataLen)

{

    RK_U8 u8FreqIdx = 0;

    for (int i = 0; i < 13; i++)

    {

        if (u32SmlpRate == AacFreqIdxTbl[i].u32SmpRate)

        {

            u8FreqIdx = AacFreqIdxTbl[i].u8FreqIdx;

            break;

        }

    }

    RK_U32 u32PacketLen = u32DataLen + 7;

    pu8AdtsHdr[0] = 0xFF;    //主要是写入syncword同步字节的前8位

    pu8AdtsHdr[1] = 0xF1;   //主要是写入syncword同步字节的后4位,并且设置ID号、layer、protection_absent

    pu8AdtsHdr[2] = ((AAC_PROFILE_LOW) << 6) + (u8FreqIdx << 2) + (u8Channel >> 2); //设置音频profile、sample_rate_index、声道数

    pu8AdtsHdr[3] = (((u8Channel & 3) << 6) + (u32PacketLen >> 11)); //设置声道数,original_copy,home,copyright_identification_bit、copyright_identification_start、aac_frame_length

pu8AdtsHdr[4] = ((u32PacketLen & 0x7FF) >> 3);  //设置aac_frame_length+adts_buffer_fullness

    pu8AdtsHdr[5] = (((u32PacketLen & 7) << 5) + 0x1F);//设置adts_buffer_fullness + number_of_raw_data_blocks_in_frame

    pu8AdtsHdr[6] = 0xFC; //设置 number_of_raw_data_blocks_in_frame

}

上面这个方法需要传入四个参数,分别是:

第一个参数pu8AdtsHdr:需要处理输出的字符串

第二个参数u32SampleRate音频的采样率(根据音频采样率去查找对应的采样率索引,这里的索引是AacFreqIdx)

第三个参数u8Channel音频通道数

第四个参数u32DataLen每一帧aac码流的长度(这里需要注意的是,在写入AAC码流的时候需要把每个AAC长度+7,因为头部是adts的头部是7个字节)

设置完成之后,就要对每个码流进行7个字节头部的写入。

fwrite(aac_header, 1, 7, aac_file); //对每一帧AAC码流写入adts_header头部

​​​​​​​1.6写入具体每一帧AAC的ES码流

在写入AAC头部之后,就可以写入每一帧具体的AAC的ES码流

..................................................

fwrite(RK_MPI_MB_GetPtr(mb), 1, RK_MPI_MB_GetSize(mb), aac_file); //写入每一帧AAC的ES码流

二代码实战

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>#include "include/rkmedia/rkmedia_api.h"
#include "include/rkmedia/rkmedia_buffer.h"
#include "include/rkmedia/rkmedia_common.h"
#include "rkmedia_api.h"
#define AUDIO_PATH "default"
#define AI_CHN 0
#define AENC_CHN 0#define AAC_PROFILE_LOW 1typedef struct AacFreqIdx_
{RK_S32 u32SampleRate;RK_U8 u8FreqIdx;
} AacFreqIdx;AacFreqIdx AacFreqIdxTbl[13] = {{96000, 0}, {88200, 1}, {64000, 2}, {48000, 3}, {44100, 4}, {32000, 5}, {24000, 6}, {22050, 7}, {16000, 8}, {12000, 9}, {11025, 10}, {8000, 11}, {7350, 12}};static void GetAdtsHeader(RK_U8 *pu8AdtsHdr, RK_S32 u32SmpleRate, RK_U8 u8Channel,RK_U32 u32DataLen)
{RK_U8 u8FreqIdx = 0;for (int i = 0; i < 13; i++){if (u32SmpleRate == AacFreqIdxTbl[i].u32SampleRate){u8FreqIdx = AacFreqIdxTbl[i].u8FreqIdx;break;}}RK_U32 u32PacketLen = u32DataLen + 7;pu8AdtsHdr[0] = 0xFF;                                                           // 主要是写入syncword同步字节的前8位pu8AdtsHdr[1] = 0xF1;                                                           // 主要是写入syncword同步字节的后4位,并且设置ID号、layer、protection_absentpu8AdtsHdr[2] = ((AAC_PROFILE_LOW) << 6) + (u8FreqIdx << 2) + (u8Channel >> 2); // 设置音频profile、sample_rate_index、声道数pu8AdtsHdr[3] = (((u8Channel & 3) << 6) + (u32PacketLen >> 11));                // 设置声道数,original_copy,home,copyright_identification_bit、copyright_identification_start、aac_frame_lengthpu8AdtsHdr[4] = ((u32PacketLen & 0x7FF) >> 3);                                  // 设置aac_frame_length+adts_buffer_fullnesspu8AdtsHdr[5] = (((u32PacketLen & 7) << 5) + 0x1F);                             // 设置adts_buffer_fullness + number_of_raw_data_blocks_in_framepu8AdtsHdr[6] = 0xFC;                                                           // 设置 number_of_raw_data_blocks_in_frame
}void *get_audio_aenc_thread(void *args)
{pthread_detach(pthread_self());FILE *aac_file = fopen("test_capture.aac", "w+");MEDIA_BUFFER mb = NULL;RK_U8 aac_header[7];while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_AENC, AENC_CHN, -1);if (!mb){printf("RK_MPI_SYS_GetMediaBuffer break....\n");break;}printf("Get AAC_Buffer Success...\n");//获取AENC的AAC码流头部GetAdtsHeader(aac_header, 48000, 2, RK_MPI_MB_GetSize(mb));fwrite(aac_header, 1, 7, aac_file); //写入7个字节的头部fwrite(RK_MPI_MB_GetPtr(mb),1, RK_MPI_MB_GetSize(mb), aac_file); //写入AAC的ES码流RK_MPI_MB_ReleaseBuffer(mb);}
}int main(int argc, char *argv[])
{int ret;AI_CHN_ATTR_S ai_chn_s;ai_chn_s.pcAudioNode = AUDIO_PATH; //音频采样路径ai_chn_s.u32SampleRate = 48000;     //音频采样率ai_chn_s.u32NbSamples = 1024;       //音频采样个数ai_chn_s.u32Channels = 2;           //音频采样通道ai_chn_s.enSampleFormat = RK_SAMPLE_FMT_S16; //采样格式ai_chn_s.enAiLayout = AI_LAYOUT_NORMAL;    //采样布局ret = RK_MPI_AI_SetChnAttr(AI_CHN, &ai_chn_s); //设置AI属性if (ret){printf("RK_MPI_AI_SetChnAttr failed...\n");}else{printf("RK_MPI_AI_SetChnAttr success...\n");}ret = RK_MPI_AI_EnableChn(AI_CHN);  //使能AI模块if (ret){printf("RK_MPI_AI_EnableChn failed...\n");}else{printf("RK_MPI_AI_EnableChn success...\n");}AENC_CHN_ATTR_S aenc_chn_attrs;  //AENCaenc_chn_attrs.enCodecType = RK_CODEC_TYPE_AAC;//AENC模块的编码协议aenc_chn_attrs.u32Bitrate = 64000; //音频编码比特率,64kbpsaenc_chn_attrs.u32Quality = 1;     //音频质量aenc_chn_attrs.stAencAAC.u32Channels = 2; //音频通道数aenc_chn_attrs.stAencAAC.u32SampleRate = 48000; //音频编码采样率,这里要和AI模块的采样率一致ret = RK_MPI_AENC_CreateChn(AENC_CHN, &aenc_chn_attrs); //创建AENC模块if (ret){printf("RK_MPI_AENC_CreateChn failed....\n");}else{printf("RK_MPI_AENC_CreateChn success....\n");}MPP_CHN_S ai_mpp_chn_s;ai_mpp_chn_s.enModId = RK_ID_AI;ai_mpp_chn_s.s32ChnId = AI_CHN;MPP_CHN_S aenc_mpp_chn_s;aenc_mpp_chn_s.enModId = RK_ID_AENC;aenc_mpp_chn_s.s32ChnId = AENC_CHN;ret = RK_MPI_SYS_Bind(&ai_mpp_chn_s, &aenc_mpp_chn_s);  //绑定AI模块和AENC模块if (ret){printf("RK_MPI_SYS_Bind failed....\n");}else{printf("RK_MPI_SYS_Bind success....\n");}pthread_t pid;pthread_create(&pid, NULL, get_audio_aenc_thread, NULL); //创建线程获取AENC码流while (1){sleep(2);}RK_MPI_SYS_UnBind(&ai_mpp_chn_s, &aenc_mpp_chn_s);RK_MPI_AENC_DestroyChn(AENC_CHN);RK_MPI_AI_DisableChn(AI_CHN);return 0;
}

相关文章:

通过多线程获取RV1126的AAC码流

目录 一RV1126多线程获取音频编码AAC码流的流程 1.1AI模块的初始化并使能 1.2AENC模块的初始化 ​​​​​​​1.3绑定AI模块和AENC模块 ​​​​​​​1.4多线程获取每一帧AAC码流 ​​​​​​​1.5每个AAC码流添加ADTSHeader头部 ​​​​​​​1.6写入具体每一帧AAC的…...

sql sqlserver的进程资源查看,杀掉多余进程

主要是由三个表组成 sys.sysprocesses、sys.dm_exec_sessions、sys.dm_exec_requests 后面两个在2008版本后使用&#xff0c;主要使用sys.dm_exec_sessions SELECT spid AS 会话ID, -- 进程&#xff08;会话&#xff09;的ID blocked AS 被阻塞的会话…...

自然语言处理:朴素贝叶斯

介绍 大家好&#xff0c;博主又来和大家分享自然语言处理领域的知识了。按照博主的分享规划&#xff0c;本次分享的核心主题本应是自然语言处理中的文本分类。然而&#xff0c;在对分享内容进行细致梳理时&#xff0c;我察觉到其中包含几个至关重要的知识点&#xff0c;即朴素…...

Pytorch实现之LSRGAN,轻量化SRGAN超分辨率SAR

简介 简介:在SRGAN的基础上设计了一个轻量化的SRGAN模型结构,通过DSConv+CA与残差结构的设计来减少参数量,同时利用SeLU激活函数构造。与多类SRGAN改进不同的是,很少使用BN层。 论文题目:Lightweight Super-Resolution Generative Adversarial Network for SAR Images(…...

学习记录-缺陷

目录 一、缺陷的判定标准 二、缺陷产生的原因 三、缺陷的生存周期 四、软件缺陷描述及提交要素 1.缺陷的核心内容 2.缺陷的提交要素 五、软件缺陷类型 一、缺陷的判定标准 二、缺陷产生的原因 三、缺陷的生存周期 注入bug > 发现bug > 清除bug 四、软件缺陷描述及提…...

文件压缩与解压工具7-Zip的安装和使用(免费)

一.介绍 7-Zip 是一款开源的文件压缩与解压缩工具&#xff0c;支持多种压缩格式&#xff0c;如 7z、ZIP、RAR、TAR 等。它具有高压缩比&#xff0c;尤其是其独有的 7z 格式&#xff0c;并集成了文件管理器。7-Zip 适用于 Windows 系统&#xff0c;提供命令行版本&#xff0c;…...

如何实现对用户密码的加密

摘要算法&#xff1a; 同样的明文&#xff0c;经过同样的摘要算法&#xff0c;得到的结果是一样的 验证方法&#xff1a;验证经过摘要算法处理后的结果&#xff0c;如果密文一样那么就认为明文是一样的 //数据库存储的一定是密文&#xff0c;用户输入的是明文&#xff1b;把…...

MySQL基础四(JDBC)

JDBC(重点) 数据库驱动 程序会通过数据库驱动&#xff0c;和数据库打交道。 sun公司为了简化开发人员对数据库的统一操作&#xff0c;提供了一个Java操作数据库的规范。这个规范由具体的厂商去完成。对应开发人员来说&#xff0c;只需要掌握JDBC接口。 熟悉java.sql与javax.s…...

审批流AntV框架蚂蚁数据可视化X6饼图(注释详尽)

大家好&#xff0c;这次使用的是AntV的蚂蚁数据可视化X6框架&#xff0c;类似于审批流的场景等&#xff0c;代码如下&#xff1a; X6框架参考网址&#xff1a;https://x6.antv.vision/zh/examples/showcase/practices#bpmn 可以进入该网址&#xff0c;直接复制下方代码进行调试…...

用Python之requests库调用大模型API实现多轮对话

文章目录 1. 多轮对话实现概述2. 多轮对话全上下文实现3. 多轮对话最近上下文的链式实现4. 总结 1. 多轮对话实现概述 多轮对话功能可以让大模型“拥有记忆”&#xff0c;满足如追问、信息采集等需要连续交流的场景。 AI大模型API 不会记录您的对话历史记录。如果您需要让大模…...

《异步江湖:XHR、Promise 与 Event Loop 的恩怨情仇》

XMLHttpRequest XMLHttpRequest&#xff08;简称 XHR&#xff09;是浏览器提供的一个 JavaScript 对象&#xff0c;用于在客户端和服务器之间发送 HTTP 请求。它是实现 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; 技术的核心工具&#xff0c;允许网页在不…...

【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

https://time.geekbang.org/column/article/118205 2.5 渲染流程&#xff08;上&#xff09;&#xff1a;HTML、CSS和JavaScript&#xff0c;是如何变成页面的&#xff1f; 2.4讲了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f; 就进入了渲染阶段。 这…...

蓝桥杯第15届真题解析

由硬件框图可以知道我们要配置LED 和按键、lcd&#xff0c;解决lcd引脚冲突 LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 按键 按键配置&#xff0c;由原理图按键所对引…...

19c rac-expdp备份异常处理

客户反馈&#xff0c;有套19c rac环境&#xff0c;补丁是19.13的&#xff0c;有1个节点使用expdp备份用户异常&#xff0c;报错如下 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production ORA-31626: job does not exist ORA-31637: cannot…...

轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题

这篇博文主要为大家讲解关于sd webui的部署问题&#xff0c;大家有什么不懂的可以随时问我&#xff0c;如果没有及时回复&#xff0c;可联系&#xff1a;1198965922 如果后续大家需要了解怎么用代码调用部署好的webui的接口&#xff0c;可以在评论区留言哦&#xff0c;博主可以…...

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…...

AIP-159 跨集合读

编号159原文链接AIP-159: Reading across collections状态批准创建日期2019-07-26更新日期2019-07-26 有时&#xff0c;用户需要跨集合检索资源&#xff0c;或者在不知道资源所在集合的情况下检索单个资源。 指南 API 可以 在标准 List 方法中允许用户使用 - &#xff08;连…...

C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现

文章目录 引入1.位图的介绍1.1位图的概念1.2位图的应用1.3bitset的基本使用bitset的定义方式bitset成员函数的使用 2.位图的基本模拟实现2.1基本结构2.2构造函数2.3set函数2.4reset2.5test 3.位图考察题目3.1只出现⼀次的整数&#xff1f;3.2找到两个文件交集&#xff1f;3.3出…...

清北deepseek8本手册

“清北手册”通常是“清华大学和北京大学推出的DeepSeek手册”的简写。近期&#xff0c;随着AI技术的迅速发展&#xff0c;清北两高校陆续发布多本自家的DeepSeek学习手册&#xff0c;助力普通人学习进阶。 清华大学的DeepSeek手册已推出5册&#xff0c;内容丰富全面&#xff0…...

如何将Promise.then中的值直接return出来

Promise 如何返回值&#xff0c;而不是返回 Promise 对象。实际开发中使用封装好的异步请求函数&#xff0c;为什么调用该函数返回的值一直都是 undefined。 一、需求 定义一个 foo 函数&#xff0c;在里面执行异步操作&#xff0c;然后取得 Promise.then 中的值并 return 出来…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...