二.使用ffmpeg对原始音频数据重采样并进行AAC编码
重采样:将音频三元组【采样率 采样格式 通道数】之中的任何一个或者多个值改变。
一.为什么要进行重采样?
1.原始音频数据和编码器的数据格式不一致
2.播放器要求的和获取的数据不一致
3.方便运算
二.本次编码流程
1.了解自己本机麦克风参数,我的切换为44100/16/2;包括麦克风录音的size可能不一样,本机windows下录音的size为88200;
1.ffmpeg获取麦克风数据
2.ffmpeg对数据进行重采样(本次三元组无需变换)
3.使用AAC编码器对重采样后的数据进行AAC编码,然后存入.aac文件
4.使用ffplay播放测试
三.整体代码
#include "customcodex.hpp"int add_samples_to_fifo(AVAudioFifo *fifo,uint8_t **input_data,const int frame_size)
{int ret = 0;int size = 0;printf("add_samples_to_fifo size:%d \n", frame_size);size = av_audio_fifo_size(fifo) + frame_size;ret = av_audio_fifo_realloc(fifo, size);if (ret < 0){printf("Error, Failed to reallocate fifo!\n");return ret;}ret = av_audio_fifo_write(fifo, reinterpret_cast<void **>(input_data), frame_size);if (ret < frame_size){printf("Error, Failed to write data to fifo!\n");return AVERROR_EXIT;}return 0;
}
int read_fifo_and_encode(AVAudioFifo *fifo,AVFormatContext *fmt_ctx,AVCodecContext *c_ctx,AVFrame *frame)
{int ret = 0;const int frame_size = FFMIN(av_audio_fifo_size(fifo),c_ctx->frame_size);printf("read fifo - size : %d ,c_ctx->frame_size : %d\n", av_audio_fifo_size(fifo), c_ctx->frame_size);ret = av_audio_fifo_read(fifo, reinterpret_cast<void **>(frame->data), frame_size);if (ret < frame_size){printf("Error, Failed to read data from fifo!\n");return AVERROR_EXIT;}return 0;
}
int open_coder(AVCodecContext **codec_ctx)
{// 编码器const AVCodec *codex = avcodec_find_encoder_by_name("libfdk_aac");// codex->capabilities = AV_CODEC_CAP_VARIABLE_FRAME_SIZE;if (!codex){fprintf(stderr, "Codec not found\n");return -1;}// 编码器上下文*codec_ctx = avcodec_alloc_context3(codex);(*codec_ctx)->sample_fmt = AV_SAMPLE_FMT_S16; // 采样大小(*codec_ctx)->channel_layout = AV_CH_LAYOUT_STEREO; //(*codec_ctx)->channels = 2; // 声道数(*codec_ctx)->sample_rate = 44100; // 采样率(*codec_ctx)->bit_rate = 0; // AAC 128k;AAC HE 64k; AAC_HE V2:32K// codec_ctx->profile = FF_PROFILE_AAC_HE_V2; // 用哪个AACif (avcodec_open2(*codec_ctx, codex, NULL) < 0){fprintf(stderr, "failed avcodec_open2 \n");return -1;}return 0;
}
int encode(AVCodecContext *codec_ctx, AVFrame *avframe, AVPacket *outpkt, FILE *outfile)
{printf("open_coder - codec_ctx->frame_size: %d ,avframe-size:%d\n", codec_ctx->frame_size, avframe->nb_samples);int ret = avcodec_send_frame(codec_ctx, avframe);printf("avcodec_send_frame:%d\n", ret);if (ret < 0){fprintf(stderr, "Error sending frame to encoder\n");return -1;}while (ret >= 0){// 获取编码后的音频数据ret = avcodec_receive_packet(codec_ctx, outpkt);printf("avcodec_receive_packet:%d\n", ret);if (ret < 0){printf("encode - ret: %d \n", ret);// 有数据但是不够了生成一帧了 没有数据了if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)return 0;exit(-1);}printf("fwrite - outpkt.size: %d \n", outpkt->size);fwrite(outpkt->data, 1, outpkt->size, outfile);fflush(outfile);}return 0;
}int read_audio()
{int ret = 0;char errors[1024];AVFormatContext *fmt_ctx = NULL;AVDictionary *options = NULL;AVAudioFifo *fifo = nullptr;FILE *outfile = fopen("./out.pcm", "wb+");FILE *outfile_aac = fopen("./out.aac", "wb+");if (outfile == nullptr){printf("filed open out file\n");}AVPacket pkt;av_init_packet(&pkt);int frame_count = 0;const char *devicename = "audio=麦克风 (Realtek(R) Audio)";// 找到采集工具const AVInputFormat *iformat = av_find_input_format("dshow");if (iformat == NULL){printf("AVInputFormat find failed \n");return -1;}// 打开音频设备ret = avformat_open_input(&fmt_ctx, devicename, iformat, &options);if (ret < 0){av_strerror(ret, errors, 1024);av_log(NULL, AV_LOG_ERROR, "error:%s", errors);return -1;}// 重采样缓冲区uint8_t **src_data = NULL;int src_linesize = 0;uint8_t **dst_data = NULL;int dst_linesize = 0;// 初始化重采样上下文SwrContext *swr_ctx = initSwr();if (!swr_ctx){printf("failed init swr\n");return -1;}// 编码器上下文AVCodecContext *codec_ctx;ret = open_coder(&codec_ctx);if (ret != 0){return -1;}// 音频输入数据AVFrame *avframe = initInAvframe();//AVPacket *outpkt = av_packet_alloc();av_init_packet(outpkt);// Create the FIFO buffer for the audio samples to be encoded.fifo = av_audio_fifo_alloc(codec_ctx->sample_fmt, codec_ctx->channels, 1);if (!fifo){printf("Error, Failed to alloc fifo!\n");return -1;}// 88200/2=44100/2=22050// 每次读取数据大小是88200,16位2个字节,双声道// 创建输入缓冲区initBuffer(&src_data, src_linesize, &dst_data, dst_linesize);av_log(NULL, AV_LOG_DEBUG, "src-size:%d , dst-size:%d\n", src_linesize, dst_linesize);int count = 0;while (1){int frame_size = codec_ctx->frame_size;static bool finished = false;while (av_audio_fifo_size(fifo) < frame_size){printf("av_audio_fifo_size(fifo) :%d , frame_size :%d\n", av_audio_fifo_size(fifo), frame_size);ret = av_read_frame(fmt_ctx, &pkt);printf("av_read_frame-ret : %d\n", ret);if (ret == 0){printf("pkt-size:%d\n", pkt.size);memcpy((void *)src_data[0], (void *)pkt.data, pkt.size);ret = swr_convert(swr_ctx, // 重采样的上下文dst_data, // 输出结果缓冲区22050, // 每个通道的采样数(const uint8_t **)src_data, // 输入缓冲区22050); // 输入单个通道的采样数printf("swr_convert-ret:%d\n", ret);ret = add_samples_to_fifo(fifo, dst_data, 22050);printf("add_samples_to_fifo-ret:%d\n", ret);}if (count >= 20){finished = true;break;}count++;printf("##################### count:%d\n", count);}while (av_audio_fifo_size(fifo) > frame_size || (finished && av_audio_fifo_size(fifo) > 0)){ret = read_fifo_and_encode(fifo, fmt_ctx, codec_ctx, avframe);encode(codec_ctx, avframe, outpkt, outfile_aac);}if (finished){// 强制将编码器缓冲区中的音频进行编码输出encode(codec_ctx, nullptr, outpkt, outfile_aac);break;}}freePtr(src_data, dst_data, swr_ctx, fmt_ctx, outfile, outfile_aac);return 0;
}
void freePtr(uint8_t **src_data, uint8_t **dst_data, SwrContext *swr_ctx, AVFormatContext *fmt_ctx,FILE *outfile, FILE *outfile_aac)
{// 释放输入输出缓冲区if (src_data){av_freep(&src_data[0]);}av_freep(src_data);if (dst_data){av_freep(&dst_data[0]);}av_freep(dst_data);// 释放重采样的上下文swr_free(&swr_ctx);avformat_close_input(&fmt_ctx);fclose(outfile);fclose(outfile_aac);av_log(NULL, AV_LOG_DEBUG, "end");
}
SwrContext *initSwr()
{SwrContext *swr_ctx = swr_alloc();// 设置重采样参数av_opt_set_int(swr_ctx, "in_channel_count", 2, 0);av_opt_set_int(swr_ctx, "in_sample_rate", 44100, 0); // 输入采样率av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);av_opt_set_int(swr_ctx, "out_channel_count", 2, 0);av_opt_set_int(swr_ctx, "out_sample_rate", 44100, 0); // 输出采样率av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);swr_init(swr_ctx);return swr_ctx;
}
AVFrame *initInAvframe()
{AVFrame *avframe = av_frame_alloc();avframe->nb_samples = 1024; // 单通道一个音频的采样数avframe->format = AV_SAMPLE_FMT_S16;avframe->channel_layout = AV_CH_LAYOUT_STEREO; // AV_CH_LAYOUT_STEREOav_frame_get_buffer(avframe, 0); // 22050*2*2=88200if (!avframe || !avframe->buf){printf("failed get frame buffer\n");return nullptr;}return avframe;
}
void initBuffer(uint8_t ***src_data, int &src_linesize, uint8_t ***dst_data, int &dst_linesize)
{av_samples_alloc_array_and_samples(src_data, // 输出缓冲区地址&src_linesize, // 缓冲区的大小2, // 通道个数22050, // 单通道采样个数AV_SAMPLE_FMT_S16, // 采样格式0);// 创建输出缓冲区av_samples_alloc_array_and_samples(dst_data, // 输出缓冲区地址&dst_linesize, // 缓冲区的大小2, // 通道个数22050, // 单通道采样个数AV_SAMPLE_FMT_S16, // 采样格式0);
}
四.遇到的问题
1.采样格式和采样个数不明确
解决办法:查看系统声音设置中,相应设备的输出格式,一般包含位深和采样率
采样个数的话通过打开并读取音频数据,可以通过pkt.size打印出来。
相关文章:
二.使用ffmpeg对原始音频数据重采样并进行AAC编码
重采样:将音频三元组【采样率 采样格式 通道数】之中的任何一个或者多个值改变。 一.为什么要进行重采样? 1.原始音频数据和编码器的数据格式不一致 2.播放器要求的和获取的数据不一致 3.方便运算 二.本次编码流程 1.了解自己本机麦克风参数&#x…...
【初学者】请介绍一下指针分析(Pointer Analysis)?
李升伟 整理 指针分析(Pointer Analysis) 指针分析(Pointer Analysis)是一种静态程序分析技术,用于确定程序中指针可能指向的内存位置或对象。它是编译器优化、程序验证、漏洞检测和并行化等领域的重要基础。 1. 指…...
【程序人生】成功人生架构图(分层模型)
文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层:调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…...
目标检测20年(一)
今天看的文献是《Object Detection in 20 Years: A Survey》,非常经典的一篇目标检测文献,希望通过这篇文章学习到目标检测的基础方法并提供一些创新思想。 论文链接:1905.05055 目录 一、摘要 1.1 原文 1.2 翻译 二、介绍 三、目标检测…...
SQLMesh系列教程:SQLMesh虚拟数据环境
各种工具都已将软件工程实践引入到数据工程中,但仍有差距存在,尤其是在测试和工作流等领域。SQLMesh 的目标是在这些领域开辟新的天地,解决像 dbt 这样的竞争产品尚未提供强大解决方案的难题。在这篇文章中,我将对 SQLMesh 进行简…...
【python小游戏】扫雷
扫雷小游戏代码。供消遣娱乐: import tkinter as tk from tkinter import messagebox import random# 游戏参数(中等难度:15x15 网格,40 颗雷) ROWS 15 COLS 15 MINES 40 CELL_SIZE 30 COLORS {default: #CCCCCC…...
【Linux】learning notes(4)cat、more、less、head、tail、vi、vim
文章目录 catmore 查看整个文件less 查看整个文件head 查看部分文件tail 查看部分文件vim / vi cat cat 命令在 Linux 和 Unix 系统中非常常用,它用于连接文件并打印到标准输出设备(通常是屏幕)。虽然 cat 的基本用法很简单,但它…...
【论文阅读】Adversarial Patch Attacks on Monocular Depth Estimation Networks
一、背景 单目深度估计是CV领域一个比较热门的研究方向,但是现有的方法过度依赖于非深度特征,使得单目深度估计的模型容易受到外界的攻击,针对这一问题该论文设计了一种攻击贴图的方法,用于攻击深度学习实现的单目深度估计模型。…...
基于Flask的自闭症患者诊断辅助系统:助力自闭症诊断
基于Flask的自闭症患者诊断辅助系统:助力自闭症诊断的创新方案 在当今社会,自闭症的早期准确诊断对于患者的治疗和康复至关重要。作为项目的第一作者,我致力于开发一款基于Web的自闭症诊断辅助系统,为这一领域贡献一份力量。 本…...
SqlServer Sql学习随笔
环境 SqlServerSSMSC# 查询 --查询来自数据库[MyTestDb]的[dbo]的表[testTable]前1000条数据--dbo 代表 数据库所有者(Database Owner),在 SQL Server 里,它是一个模式(Schema)。 --**模式(Sc…...
【6】组合计数学习笔记
前言 关于今天发现自己连快速幂都忘记怎么写这件事 这篇博客是组合计数基础,由于大部分内容都是 6 6 6 级,所以我就给整个提高级的组合数学评了 6 6 6 级。 组合计数基础 加法原理与乘法原理 加法原理(分类计数原理)&#…...
功能安全实战系列06-英飞凌Tricore系列SMU详解
本文框架 前言1.What?1.1SMU特性及架构1.1.1 SMU_core和SMU_stdby1.1.2 Flip-Flop机制1.1.3 RT Alarm (RecoveryTime)1.2 Alarm状态机1.3 FSP1.4 Alarm handing1.4.1 SMU_core Alarm handing1.4.2 SMU_Standby Alarm handing1.5 寄存器介绍2.How?2.1 如何排查SMU问题前言 在…...
Python 中的集合的中高级用法
Python 中的集合(set)是一种无序且不重复的数据结构,适用于去重、成员检测和集合运算等场景。以下是集合的中级和高级用法,涵盖从基础到高级的详细操作。 1. 集合的创建与初始化 1.1 创建集合 # 空集合 empty_set = set()# 直接初始化 my_set = {1, 2,...
opencv初步学习——图像处理2
这一部分主要讲解如何初步地创建一个图像,以及彩色图像我们的一些基本处理方法 一、创建一个灰度图像 1-1、zeros()函数 [NumPy库] 要用到这一个函数,首先我们需要调用我们的NumPy库,这一个函数的作用是可以帮助我们生成一个元素值都是0的二…...
传统服务部署、虚拟化部署与云原生部署资源消耗对比与优化指南
1. 三种部署方式概述 1.1 传统服务部署 定义:直接运行于物理服务器或基础Linux操作系统环境,无虚拟化层隔离 特点: 资源独占(CPU/内存/磁盘) 部署流程简单但扩展困难 典型场景:单一业务高负载场景&…...
使用htool工具导出和导入Excel表
htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...
【Linux内核】从文件层面理解socket建立的方式(优雅的C风格多态)
内核层面理解 Socket 的创建和连接 引言 众所周知,Linux 下一切皆文件。无论是普通文件(如 file.txt),还是特殊文件(包括网络套接字),我们都可以以处理文件的方式来访问它们。网络套接字&…...
WebSocket:开启实时通信的新篇章
在当今的互联网应用中,实时交互已经成为不可或缺的一部分。无论是实时的在线聊天、股票行情更新,还是多人在线游戏,都需要一种高效的双向通信机制。而这正是 WebSocket 的用武之地。 本文将带你深入了解 WebSocket,探索其工作原理…...
只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”
当消费电子领域普遍追求“更轻更薄”的设计美学时,遨游三防平板不止于此,还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中,三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足,常因环境…...
C++ 各种map对比
文章目录 特点比较1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map(SGI STL 扩展) C 示例代码代码解释 特点比较 1. std::map 底层实现:基于红黑树(一种自平衡的二叉搜索树)…...
《量子门与AI神经元:计算世界的奇妙碰撞》
在当今科技飞速发展的时代,量子计算和人工智能作为前沿领域,正不断颠覆我们对计算和智能的认知。量子门操作和AI中的神经元计算过程,分别作为这两大领域的核心机制,看似处于不同维度,却有着千丝万缕的联系,…...
【Linux———生产消费模型】
并不是真的路过而已,也不是真的不会想你.............................................................................. 文章目录 前言 一、【生产者消费者模型的介绍】 1、【概念引入】 2、【特点—321原则】 3、【优点】 二、【基于阻塞队列的生产者消费…...
876.链表的中间节点
题目 Python # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:slow fa…...
蓝桥杯第13届真题2
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码&a…...
【微信小程序变通实现DeepSeek支持语音】
微信小程序实现录音转文字,并调用后端服务(Node.js)进行语音识别和,然后调用DeepSeek 处理的完整实现。 整体架构 前端(微信小程序): 实现录音功能。将录音文件上传到后端。接收后端返回的语音…...
XSS 绕过分析:一次循环与两次循环的区别
目录 代码分析 代码流程: 一次循环的问题 原因分析:删除顺序导致遗漏 两次循环修复方案 两种绕过方式 绕过方法 1:DOM破环 绕过方法 2:SVG XSS(双 SVG 绕过) 1. 为什么 "一个SVG注定失败&…...
AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命
摘要 AI正深度重构工程设计、施工与总承包行业,推动从传统经验驱动向数据智能驱动的转型。本文系统性解析AI当前在智能优化设计、施工过程管理、全生命周期数字孪生等场景的应用,展望未来AI在自动化决策、跨域协同等领域的潜力,并从投入产出…...
全局上下文网络GCNet:创新架构提升视觉识别性能
摘要:本文介绍了全局上下文网络(GCNet),通过深入分析非局部网络(NLNet),发现其在重要视觉识别任务中学习的全局上下文与查询位置无关。基于此,提出简化的非局部模块、全局上下文建模…...
MySQL 调优
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
ASP3605抗辐照加固同步降压调节器——商业航天电源芯片解决方案新选择
ASP3605企业宇航级型号ASP3605S2U通过SEU≥75 MeVcm/mg与SEL≥75 MeVcm/mg抗辐射测试。其输入电压4V至15V,输出电流5A,支持多相级联与冗余设计,适用于卫星、航天器电源系统。 面向航天场景的核心功能设计 1. 抗辐射与可靠性保障 单粒子效应…...
C#的List和DIctionary实现原理(手搓泛型类以及增删查改等功能)
这里写自定义目录标题 ListDIctionary List MyList类:这是一个泛型类,能够存储任意类型的元素。 _items数组:用于实际存储元素。 _size变量:记录当前列表中的元素数量。 构造函数:初始化数组容量为 4。 Count属性&…...
设计模式-对象创建
对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…...
Linux进程虚拟内存空间的管理
5、 进程虚拟内存空间的管理 主要逻辑 重点函数 task_struct函数(进程在内核中的描述符函数) 进程在内核中的描述符task_struct结构: struct task_struct{ //进程的描述符//进程idpid_t pid;//用于标识线程所属的进程pid_t tgi…...
git tag常用操作
git tag是干嘛用的,相当于一个轻量级的分支。在一个分支上,创建一个tag,就是标记某一次的提交。然后方便checkout到 这个标签上。用tag的意思就是不用专门再创建一个新分支来修改后续的改动。分支不变,继续在上面改动,…...
VIVO手机如何实现证件照换底色?证件照换底色技巧分享
在日常生活中,我们常常需要使用不同底色的证件照,无论是办理证件、提交资料还是其他用途,一张符合要求的证件照都显得尤为重要。 而VIVO手机凭借其强大的拍照功能和便捷的图片编辑工具,为我们提供了一种简单高效的证件照换底色解…...
函数闭包的学习
作用:可以保存外部函数的变量 形成条件: 1 函数嵌套 2 内部函数用了外部函数的变量或者参数 3 外部函数返回了内部函数(是返函数名,不带括号) 这个使用了外部函数变量的内部函数称为闭包。 口诀:函数嵌…...
解码软件需求的三个维度:从满足基础到创造惊喜
在软件开发的世界里,用户需求就像一张复杂的地图,指引着产品前进的方向。但并非所有需求都能带来同样的价值——有些是产品生存的“氧气”,有些是吸引用户的“磁石”,还有一些则是让人眼前一亮的“魔法”。如何区分它们࿱…...
网页制作代码html制作一个网页模板
制作一个简单而实用的网页模板:HTML基础入门 在数字时代,网页已成为信息展示和交流的重要平台。HTML(HyperText Markup Language)作为网页制作的基础语言,为开发者提供了构建网页的基本框架。本文将带你了解如何使用H…...
股票量化交易开发 Yfinance
以下是一段基于Python的股票量化分析代码,包含数据获取、技术指标计算、策略回测和可视化功能: python import yfinance as yfimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom backtesting import Bac…...
从 Snowflake 到 Databend Cloud:全球游戏平台借助 Databend 实现实时数据处理
导读:某全球游戏平台为全球数百万玩家提供实时的技能型游戏体验与无缝的实时互动。对该游戏平台而言,保持数据的实时更新和实时分析,对提升玩家互动和留存率至关重要。他们在使用 Snowflake 进行实时数据摄取和分析时遇到了重大挑战ÿ…...
工作记录 2017-02-08
工作记录 2017-02-08 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、CPT的录入页面做修改 1.1、Total 改为 Price 1.2、当删除行时,下面的行自动上移。 2、Pending Payments、Payment Posted、All A/R Accounts页面加了CoIns…...
【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
RabbitMQ基于AMQP协议实现,由多个核心组件组成,确保消息的可靠传递。 Rabbit的架构图: 1.RabbitMQ的基本架构: 1.核心组件: 1.Producer(生产者): 发送消息到RabbitMQ。 2.Exchange(交换机):接…...
Quartz知识点总结
简单说明 简单的定时任务使用Timer或者ScheduledExecutorService quartz支持复杂的定时执行功能。支持ram存储(内存存储)和持久化存储。quartz有分布式和集群能力 简单使用 获取任务调度器Schedule。任务调度器可以管理任务。创建任务实例。使用JobB…...
P2786 英语1(eng1)- 英语作文
P2786 英语1(eng1)- 英语作文 题目背景 蒟蒻 HansBug 在英语考场上,挠了无数次的头,可脑子里还是一片空白。 题目描述 眼下出现在 HansBug 蒟蒻面前的是一篇英语作文,然而智商捉急的 HansBug 已经草草写完了&#…...
Clion远程开发配置
代码开发环境:windows下,基于Clion 2024.3开发,标准为C20 代码运行环境:远程服务器,ubuntu,cmake版本3.12,gcc11.4,g11.4,gdb12.1 实现功能:在本地windows开…...
Javascript基础
目录 1. 变量声明2. 基本数据类型3.复杂数据类型4.字符串方法5.对象方法6.时间方法7.条件(if)8.循环(for/while)9.遍历(for in/of)10.多选(Switch)END 1. 变量声明 const࿱…...
蓝桥杯2023年第十四届省赛真题-阶乘的和
蓝桥杯2023年第十四届省赛真题-阶乘的和 时间限制: 2s 内存限制: 320MB 提交: 3519 解决: 697 题目描述 给定 n 个数 Ai,问能满足 m! 为∑ni1(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘,即 1 2 3 m。 输入格式 输入的第一行包含一个整…...
供应链优化售前方案建议书V23(58页PPT)(文末有下载方式)
随着家电行业的快速发展,供应链管理已成为企业竞争的关键要素。杭州松下电器在面对日益复杂的市场环境和激烈的市场竞争时,急需对其供应链进行优化。本文将对杭州松下电器的供应链优化方案进行详细解读,探讨其优化策略及其潜在价值。 供应链…...
校园论坛系统Selenium自动化测试
本文为自动化测试 本项目自动化测试代码链接(仅供参考): 自动化测试代码 功能测试文章链接: 校园论坛系统自动化测试报告-CSDN博客 🌈自动化测试 思维导图 根据思维导图, 我们选取几个主要的功能进行自动化测试 编写代码 思路: 根据脑图进行测试用例的编写&am…...
Linux 一步部署DHCP服务
#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误:非root用户,权限不足!" exit 0 fi #防火墙与高级权限 systemctl stop firewa…...