FFMpeg视频编码实战和音频编码实战
视频编码流程
- avcodec_find_encoder:首先,通过指定的编码器名称(如H.264、MPEG-4等)找到对应的编码器。
- avcodec_alloc_context3:为找到的编码器分配一个上下文结构,这个结构包含了编码器所需的各种参数和状态信息。
- 设置编码上下文参数:配置编码器上下文的参数,包括分辨率、帧率、比特率等。
- avcodec_open2:打开编码器,准备开始编码工作。
- av_packet_alloc:分配一个AVPacket结构,用于存储编码后的数据包。
- av_frame_alloc:分配一个AVFrame结构,用于存储原始视频帧的数据。
- 设置Frame参数:配置AVFrame结构,包括设置像素格式、宽度、高度等参数。
- av_frame_get_buffer:为AVFrame分配缓冲区,用于存储视频帧的数据。
- 读文件:从输入源读取视频帧数据。如果读取成功,则继续处理;如果读取失败,则跳转到flush_encode步骤。
- avcodec_send_frame:将AVFrame发送给编码器进行编码。
- avcodec_receive_packet:从编码器接收编码后的数据包。
- 写文件:将编码后的数据包写入输出文件。
- flush_encode:当读取文件失败时,调用flush_encode函数清理编码器中的剩余数据。
- 释放资源:释放之前分配的所有资源,包括AVFrame、AVPacket和编码器上下文。
//准备yuv文件//引入FFMPEG库#include<QDebug>
extern "C"{
#include<libavcodec/avcodec.h>
}const char* inFileName = "D:\\output.yuv";
const char* outFileName = "output.h264";/*** @brief 编码一帧数据并写入输出文件** @param codecContext 编码器上下文,包含编码器配置信息* @param packet 存储编码后的数据包* @param frame 待编码的原始帧数据* @param outFile 输出文件指针* @return int 成功返回0,失败返回错误码(负数)*/
int encode(AVCodecContext* codecContext, AVPacket* packet, AVFrame* frame, FILE* outFile) {// 1. 发送待编码的帧到编码器int ret = avcodec_send_frame(codecContext, frame);if (ret < 0) {qDebug() << "avcodec_send_frame failed";return -8; // 错误码-8:发送帧失败}// 2. 循环接收编码后的数据包while (ret == 0) {ret = avcodec_receive_packet(codecContext, packet);// 2.1 检查是否需要更多输入或已结束if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {return 0; // 正常情况:需要更多数据或编码完成}// 2.2 检查其他错误else if (ret < 0) {qDebug() << "avcodec_receive_packet failed";return -9; // 错误码-9:接收数据包失败}// 3. 成功接收到数据包,写入文件if (ret == 0) {fwrite(packet->data, 1, packet->size, outFile);}}return 0; // 正常结束
}int main(){int ret = 0;//准备编码器const AVCodec* codec = nullptr;AVCodecContext* codecContext = nullptr;AVPacket* packet = nullptr;AVFrame* frame = nullptr;FILE* inFile = nullptr;FILE* outFile = nullptr;//查找264编码器codec = avcodec_find_encoder(AV_CODEC_ID_H264);if(!codec){qDebug() << "avcodec_find_encoder failed";return -1;}//分配编码器上下文codecContext = avcodec_alloc_context3(codec);if(!codecContext){qDebug() << "avcodec_alloc_context3 failed";return -2;}//设置上下文参数codecContext->width = 1280; //设置视频的宽度为 1280 像素codecContext->height = 720; //设置视频的高度为 720 像素codecContext->time_base = AVRational{1, 25}; //设置时间基(time base)为 1/25 秒,这是时间戳的基本单位,表示每个时间单位代表 1/25 秒codecContext->pix_fmt = AV_PIX_FMT_YUV420P; //设置像素格式为 YUV420PcodecContext->framerate = AVRational{25, 1}; //设置帧率为 25 帧/秒//打开编码器ret = avcodec_open2(codecContext, codec, NULL);if(ret != 0){qDebug() << "avcodec_open2 failed";return -3;}packet = av_packet_alloc();if(!packet){qDebug() << "avcodec_open2 failed";return -4;}frame = av_frame_alloc();if(!frame){qDebug() << "av_frame_alloc failed";return -5;}//设置帧参数frame->width = 1280;frame->height = 720;frame->format = AV_PIX_FMT_YUV420P;// 申请frame的内存来存放帧数据ret = av_frame_get_buffer(frame, 0);if (ret < 0) { // 修正:检查返回值是否为负数(失败)qDebug() << "av_frame_get_buffer failed, error:" << ret;return -6;}//我们开始打开输入文件读数据inFile = fopen(inFileName, "rb");if(inFile == nullptr){qDebug() << "open infile failed";return -7;}//打开输出文件写数据outFile = fopen(outFileName, "wb");if(outFile == nullptr){qDebug() << "open outFileName failed";return -7;}//循环读数据编码while(!feof(inFile)){//frame能不能写,我们需要将yuv数据填充到frame,检查是否可写ret = av_frame_is_writable(frame);if(ret < 0){//如果不可写,我们设置可写ret = av_frame_make_writable(frame);}//从yuv文件读取//y分量fread(frame->data[0], 1, frame->width * frame->height, inFile);//u分量fread(frame->data[1], 1, frame->width * frame->height / 4, inFile);//v分量fread(frame->data[2], 1, frame->width * frame->height / 4, inFile);//编码encode(codecContext, packet, frame, outFile);}//如果没有数据了,我们退出//flush_encodeencode(codecContext, packet, nullptr, outFile); //刷新编码器qDebug()<<"编码完成";//释放资源av_packet_free(&packet);av_frame_free(&frame);avcodec_free_context(&codecContext);fclose(inFile);fclose(outFile);return 0;
}
音频编码实战
一、初始化阶段
- avcodec_find_encoder
查找合适的音频编码器(如 AAC、MP3)。 - avcodec_alloc_context3
分配编码器上下文。 - 设置编码器参数
如采样率、通道数、比特率等。 - avcodec_open2
打开编码器。 - avformat_alloc_output_context2
创建输出格式上下文。 - avformat_new_stream
新建输出音频流。 - avio_open
打开输出文件。 - avformat_write_header
写入文件头信息。 - swr_init
初始化音频重采样(如果需要转换采样格式或通道布局)。
二、编码循环阶段
- av_frame_get_buffer
获取一个音频帧缓冲区用于填充数据。 - 读取文件
判断是否还有音频数据需要编码。- 如果有(true):
- avcodec_send_frame:送入音频帧。
- avcodec_receive_packet:从编码器接收压缩数据。
- av_interleaved_write_frame:将编码后数据写入输出文件。
- 如果没有(false):
- flush_encode:刷新编码器内部缓存(送入空帧)。
- av_write_trailer:写入文件尾。
- 释放资源:关闭文件、释放上下文、帧、包等资源。
- 如果有(true):
#include <QDebug>
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswresample/swresample.h"
}int main(){char inputfile[] = "D:\\output.pcm";char outputfile[] = "audio.aac";//准备编码器const AVCodec* avCodec = avcodec_find_encoder(AV_CODEC_ID_AAC);if(!avCodec){qDebug() << "avcodec_find_encoder failed";return -1;}//准备编码上下文AVCodecContext* avCodecContext = avcodec_alloc_context3(avCodec);if(!avCodecContext){qDebug() << "avcodec_alloc_context3 failed";return -1;}//设置上下文参数int ret=0;avCodecContext->sample_rate = 44100; //表示音频的采样率为 44.1kHz(CD 音质标准)。avCodecContext->channels = 2; //双声道avCodecContext->sample_fmt = AV_SAMPLE_FMT_FLTP; //表示浮点型平面(Planar)采样格式。avCodecContext->bit_rate = 64000; //表示编码后的音频比特率为 64kbps。avCodecContext->channel_layout = AV_CH_LAYOUT_STEREO; //明确指定声道布局为立体声(左右声道)。//打开解码器ret = avcodec_open2(avCodecContext, avCodec,NULL);if(ret<0){qDebug() << "avcodec_open2 failed";return -1;}//创建输出上下文AVFormatContext* avFormatContext = NULL;//初始化输出上下文avformat_alloc_output_context2(&avFormatContext, NULL, NULL, outputfile);if(!avFormatContext){qDebug() << "avformat_alloc_output_context2 failed";return -1;}// 新建输出音频流AVStream* st = avformat_new_stream(avFormatContext, NULL);st->codecpar->codec_tag = 0;//这个流需要获取编码器参数avcodec_parameters_from_context(st->codecpar, avCodecContext);//打开输出文件ret = avio_open(&avFormatContext->pb, outputfile, AVIO_FLAG_WRITE);if(ret<0){qDebug() << "avio_open failed";return -1;}//写入文件头信息avformat_write_header(avFormatContext, NULL);SwrContext* swrContext = NULL;// 设置参数, 1. 上下文 2.输出声道布局 4.输出采样率, 5.输入声道布局 6.输入样本格式 7.输入采样率 8.配音 9.日志swrContext = swr_alloc_set_opts(swrContext, avCodecContext->channel_layout, avCodecContext->sample_fmt, avCodecContext->sample_rate,AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 44100,0, 0);if(!swrContext){qDebug() << "swr_alloc_set_opts failed";return -1;}// 初始化音频重采样ret = swr_init(swrContext);if(ret<0){qDebug() << "swr_init failed";return -1;}//准备frameAVFrame* avFrame = av_frame_alloc();avFrame->format = AV_SAMPLE_FMT_FLTP;avFrame->channels=2;avFrame->channel_layout = AV_CH_LAYOUT_STEREO;avFrame->nb_samples=1024;// 获取一个音频帧缓冲区用于填充数据ret = av_frame_get_buffer(avFrame, 0);if(ret<0){qDebug() << "av_frame_get_buffer failed";return -1;}//开始读pcm->frameint readSize = avFrame->nb_samples*2*2; //双声道,float 16位,每次读取的大小char* pcms = new char[readSize]; //申请内存FILE* fp = fopen(inputfile, "rb");//开始编码for(;;){AVPacket pkt;av_init_packet(&pkt);int len = fread(pcms,1,readSize, fp);if(len <=0){break;}else{//开始重采样const uint8_t* data[1];data[0] = (uint8_t*)pcms;len = swr_convert(swrContext, avFrame->data, avFrame->nb_samples, data, avFrame->nb_samples);if(len <=0){qDebug() << "swr_convert failed";break;}//重采样成功,我们开始编码数据ret = avcodec_send_frame(avCodecContext, avFrame);if(ret < 0){qDebug() << "avcodec_send_frame failed";continue;}//ret = avcodec_receive_packet(avCodecContext, &pkt);if(ret == 0){av_interleaved_write_frame(avFormatContext, &pkt);}}}//写入结尾av_write_trailer(avFormatContext);//释放资源fclose(fp);avio_close(avFormatContext->pb);avcodec_close(avCodecContext);avcodec_free_context(&avCodecContext);avformat_free_context(avFormatContext);return 0;
}
相关文章:
FFMpeg视频编码实战和音频编码实战
视频编码流程 avcodec_find_encoder:首先,通过指定的编码器名称(如H.264、MPEG-4等)找到对应的编码器。avcodec_alloc_context3:为找到的编码器分配一个上下文结构,这个结构包含了编码器所需的各种参数和状…...
vue+uniapp 获取上一页直接传递的参数
在小程序里页面之间跳转有时候需要传递参数给下个页面用 const toDetail item > { uni.navigateTo({ url: /pagesFood/stu/FoodSelection?groupCode1&merchCode2, }); }; 那么下个页面就要获取到这些参数,在实际开发中ÿ…...
各种排序思路及实现
目录 1.排序概念常见的排序算法 2.常见排序算法实现(1)插入排序直接插入排序希尔排序(缩小增量排序) (2)选择排序直接选择排序堆排序 (3)交换排序冒泡排序快速排序(hoare…...
GPT文生图模型新玩法
GPT-4o发布了最新的生图模型GPT-4o-Image,在图像控制力、一致性上实现了显著提升,其表现甚至展现出超越Midjourney的潜力。这款模型不仅能读懂细致的指令,还能赋予照片艺术化的新生命。接下来,我们将介绍几个有趣的实践方向&#…...
uni-app ucharts自定义换行tooltips
实现效果: 第一步:在uni_modules文件夹下找到config-ucharts.js和u-charts.js文件 第二步:在config-ucharts.js文件中配置换行格式 // 换行格式"wrapTooltip":function(item, category, index, opts){return item.name:…...
java 集合进阶
双列集合 map 实例 package mymap;import java.util.HashMap; import java.util.Map;public class MapDemo1 {public static void main(String[] args) {/*V put(K key,v value)添加元素V remove(object key)根据键删除键值对元素void clear()移除所有的键值对元素boolean c…...
RPC 2025/4/8
RPC(Remote Procedure Call),远程过程调用。 应用场景:大型微服务项目,服务部署到不同的服务器上,需要远程调用,可以使用RPC。 两个概念: 远程过程调用本地调用 RPC目的:…...
浅层神经网络:全面解析(扩展)
浅层神经网络:全面解析(扩展) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 一、神经网络架构演进图谱 #mermaid-svg-…...
【Hadoop入门】Hadoop生态之ZooKeeper简介
1 什么是ZooKeeper? 在分布式系统的世界里,协调各节点之间的工作是一项复杂而关键的任务。ZooKeeper正是为解决这一问题而生的开源分布式协调服务,它像一个高效的"和事佬",帮助分布式系统中的各个组件达成一致、同步状态…...
树和图论(详细整理,简单易懂!)
树和图论 树的遍历模版 #include <iostream> #include <cstring> #include <vector> #include <queue> // 添加queue头文件 using namespace std;const int MAXN 100; // 假设一个足够大的数组大小 int ls[MAXN], rs[MAXN]; // 定义左右子树数…...
CWGAN-GP 原理及实现(pytorch版)
CWGAN-GP 一、CWGAN-GP 原理1.1 CWGAN-GP 的核心改进1.2 CWGAN-GP 的损失函数1.3 CWGAN-GP 的优势1.4 关键参数选择1.5 应用场景 二、CWGAN-GP 实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模型2.6 查看训练损失2.7 图片转GIF2.8 模型加载和推理…...
zookeeper平滑扩缩容
在进行ZooKeeper的扩容和缩容操作时,需要注意以下几点: 数据一致性 重要性:ZooKeeper的核心特性之一是保证数据的一致性。在操作过程中,必须确保数据的一致性,以避免数据丢失或损坏。 实现方式:ZooKeeper通…...
Github 热点项目 ChartDB AI自动导表结构+迁移脚本,3分钟生成专业数据库关系图
ChartDB堪称数据库设计神器!亮点①:动动手指输入SQL,秒出结构图,表关系一目了然,团队评审时再也不用画图两小时。亮点②:AI智能转换超贴心,MySQL转PostgreSQL只需点个按钮,跨平台迁移…...
RVOS-1.环境搭建与系统引导
0.环境搭建 riscv-operating-system-mooc: 开放课程《循序渐进,学习开发一个 RISC-V 上的操作系统》配套教材代码仓库。 mirror to https://github.com/plctlab/riscv-operating-system-mooc 在 Ubuntu 20.04 以上环境下我们可以直接使用官方提供的 GNU工具链和 QEM…...
Java List<JSONObject> 转换为 List<实体类>
可以使用 Fastjson 的 toJavaObject 方法直接转换,无需中间序列化步骤。以下是具体实现和注意事项: import com.alibaba.fastjson.JSONObject; import java.util.List; import java.util.stream.Collectors;public class Converter {public static List…...
CesiumEarth v1.12 更新,支持安卓平板离线浏览3DTiles格式的三维倾斜模型
CesiumEarth v1.12 更新 2025年4月8日 阅读需 1 分钟 发布时间:2025年04月08日 新增用户登录: 从1.12版本开始需要通过登录方可使用CesiumEarth 账号可以通过邮箱免费注册 后续将陆续发布云服务相关的功能 发布Desktop版本: Deskt…...
OpenEuler运维实战-系统资源监控与性能优化-CPU·内存·IO
CPU 基本概念定界定位思路常用CPU性能分析工具 基本概念 中央处理器(Central Processing Unit,简称CPU)是计算机的主要设备之一,其功能是解释计算机指令以及处理计算机软件中的数据。 物理核:可以真实看到的CPU核&…...
react实现SVG地图区域中心点呈现圆柱体,不同区域数据不同,圆柱体高度不同
效果图: 代码: import React, { useState, useEffect } from react;const InnerMongoliaMap () > {// 每个区域的数据(名称、中心坐标、圆柱体高度值)const [regionData, setRegionData] useState([{ id: "呼和浩特市…...
Qwen - 14B 怎么实现本地部署,权重参数大小:21GB
Qwen - 14B 权重参数大小:21GB 参数量与模型占用存储空间(GB)是不同概念。Qwen - 14B参数量约140亿 。其模型大小在不同精度下占用存储空间不同,如在一些资料中提到,Qwen - 14B在特定情况下占用空间约21GB 。实际存储…...
线程实现参考资料
参考 并发编程系列 - Java线程池监控及CompletableFuture详解_taskexecutor.execute没有执行如何监控到-CSDN博客 JAVA异步实现的四种方式_java异步编程的四种方法-CSDN博客 Java线程池深度解析与自定义实战-CSDN博客 Java8 CompletableFuture 异步多线程的实现_java_脚本之…...
python-63-前后端分离之图书管理系统的Flask后端
文章目录 1 flask后端1.1 数据库实例extension.py1.2 数据模型models.py1.3 .flaskenv1.4 app.py1.5 运行1.6 测试链接2 关键函数和文件2.1 请求视图类MethodView2.2 .flaskenv文件3 参考附录基于flask形成了图书管理系统的后端,同时对其中使用到的关键文件.flaskenv和函数类M…...
Qt网络编程之服务端
Qt网络编程之服务端 TCP(传输控制协议)是一种可靠的、面向流的、面向连接的传输协议。它特别适合连续的数据传输。 1. 主要类和函数 1.1 QTcpServer 监听函数: bool QTcpServer::listen(const QHostAddress &address QHostAddress::…...
案例-流量统计
1.建一个data目录,在data下建log.txt文件 输入手机号码 上行流量 下行流量 2.在com.example.flow下建四个Java类3.flowBean flowMapper flowReducer flowDriver...
开源身份和访问管理方案之keycloak(二)管理员引导和恢复
文章目录 开源身份和访问管理方案之keycloak(二)管理员引导和恢复管理员引导和恢复在 Keycloak 启动时引导临时管理员帐户对于恢复丢失的管理员访问权限使用专用命令引导管理员用户或服务帐户创建一个管理员用户创建一个服务账号重新获得对具有更高安全性…...
TCP,UDP协议和域名地址
1.TCP(传输控制协议)是面向连接,UDP(用户数据报协议)是无连接的 2.应用层:FTP,HTTP,SMTP,TELNET,DNS,TFTP 传输层;TCP,UDP 网际层:IP,ICMP,ARP,RARP 3.TCP21:20端口数据传输;21端…...
算法进阶指南 分形
问题描述 分形,具有以非整数维形式充填空间的形态特征。通常被定义为: “一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。 现…...
2025年 npm淘宝镜像最新地址
查看当前镜像 npm config get registry 切换陶宝镜像源 npm config set registry https://registry.npmmirror.com/ 验证npm镜像源是否切换成功 npm config get registry 如果返回的地址是https://registry.npmmirror.com/,那么说明你已经成功切换到淘宝的npm…...
0基础 | 硬件 | LM386芯片
LM386芯片:音频功率放大器芯片 内部集成三极管功能将微弱信号放大20-200倍,并且驱动内阻为8Ω的扬声器注意CD系列芯片,内部集成MOS管 LM386特性 LM386主要由以下三个部分组成 内部电路 差分输入 差分输入 多个三极管左右对称,形…...
Spring Boot集成APK Parser库实现APK文件解析
目录 1. 添加依赖 2. 创建APK解析服务 3. 创建控制器 4. 测试 注意事项 在Spring Boot项目中集成APK Parser库并解析APK文件,可以按照以下步骤进行操作: 1. 添加依赖 在项目的pom.xml文件中添加apk-parser库的依赖: <dependency&…...
java基础 迭代Iterable接口以及迭代器Iterator
Itera迭代 Iterable < T>迭代接口(1) Iterator iterator()(2) forEach(Consumer<? super T> action)forEach结合Consumer常见场景forEach使用注意细节 (3)Spliterator spliterator() Iterator< T>迭代器接口如何“接收” Iterator<T>核心方法迭代器的…...
Linux: network: tcpdump: packets dropped by kernel
文章目录 最近遇到一个问题原因libpcap/tcpdump 接口linux/libpcap 接口内核的处理原因可能有以下几种:解决方法:man pcap_stats最近遇到一个问题 tcpdump命令显示有dropped的包,而且是被内核drop的。 [root@-one-01 ~]# tcpdump -i any udp and port 8080 -v -w /root/udp…...
TCP三次握手和TCP四次挥手
一 TCP三次握手 TCP建立连接的过程叫做握手,握手需要客户端和服务器之间交换三个TCP报文段。如图所示,假设主机A为TCP客户端,主机B为TCP服务端。在最初时间,两端的TCP进程都是处于CLOSED状态 (1)主机A主动…...
博途 TIA Portal之1200做主站与调试助手的TCP通讯
博途支持的通讯非常多,常见的有S7、TCP/IP,UDP等等,本文将演示TCP的通讯,通讯的双方是1200PLC和调试助手之间,编程采用ST语言。 1、硬件准备 1200PLC一台,带调试助手的PC机一台,调试助手是我经…...
第十天 - socket编程基础 - TCP/UDP服务开发 - 练习:简易端口扫描器
Python网络编程入门:从Socket到端口扫描器实战 一、前言:为什么要学网络编程? 在这个万物互联的时代,掌握网络编程技术就像拥有了一把打开互联网世界的钥匙。无论是开发聊天软件、网络游戏,还是构建分布式系统&#…...
欧税通香港分公司办公室正式乔迁至海港城!
3月20日,欧税通香港分公司办公室正式乔迁至香港油尖旺区的核心商业区海港城!左手挽着内地市场,右手牵起国际航道——这波乔迁选址操作堪称“地理课代表”! 乔迁仪式秒变行业大联欢!感谢亚马逊合规团队、亚马逊云、阿里国际站、Wayfair、coupang、美客多…...
Maven的安装配置-项目管理工具
各位看官,大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习:Maven的安装配置-项目管理工具 目录 1.什么是Maven?Maven用来干什么的?…...
【Linux篇】缓冲区的工作原理:如何影响你程序的输入输出速度
从内存到磁盘:缓冲区如何提升文件I/O效率 一. 缓冲区1.1 什么是缓冲区1.2 为什么要引入缓冲区1.3 缓冲区类型1.4 FILE1.4.1 基本概念1.4.2 FILE 结构体的作用1.4.3 FILE 的工作机制 二. 最后 在程序开发中,缓冲区是一个经常被提及却不容易深入理解的概念…...
编写junit测试类 import org.junit.Test;
1. 添加依赖 <!-- Spring Boot Starter Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> 2. …...
初识数据结构——深入理解LinkedList与链表:吃透LinkedList与链表的终极指南
📌 深入理解LinkedList与链表:从原理到实战应用 🌟 引言 在Java集合框架中,LinkedList和ArrayList是最常用的两种列表结构。它们各有优劣,适用于不同的场景。本文将带你深入探索LinkedList的底层实现——链表&#x…...
C++版Qt之登录界面设计
在C开发中,使用Qt框架可以快速构建美观且功能强大的GUI应用程序。本文将介绍如何设计一个漂亮的登录界面,包括账号和密码输入框,并确保只有验证成功后才能进入主窗口。 项目结构 文件列表 LoginDialog.h:登录对话框的头文件Logi…...
Java logback框架日志输出中文乱码的解决方案(windows)
在Java开发中,日志记录是一个重要的部分,它可以帮我们定位问题、运行时监控、错误排查与故障恢复。但是,在有些情况下,使用Logback记录的中文日志会出现乱码,这会影响日志的可读性,给维护带来麻烦。本文将探…...
【c++】c/c++内存管理
小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 c系列专栏<—请点击 倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己! 目录 前言一、c语言内存管理二、一图搞懂c/c中的程序内存区域划分三、c内存管理1. new和d…...
【C++】Stack Queue 仿函数
📝前言: 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础,所以这篇文章主要关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue &am…...
Python:基于Flask框架的数据可视化系统
以下是一个基于Flask框架的数据可视化系统代码示例,包含核心功能实现: python 复制 # app.py 后端核心代码 from flask import Flask, render_template, jsonify import sqlite3 from collections import defaultdict import jieba import reapp Fla…...
JVM即时编译(JIT)
JVM基础回顾 Java 作为一门高级程序语言,由于它自身的语言特性,它并非直接在硬件上运行,而是通过编译器(前端编译器)将 Java 程序转换成该虚拟机所能识别的指令序列,也就是字节码,然后运行在虚拟机之上的;…...
JVM高阶架构:并发模型×黑科技×未来趋势解析
🚀前言 “你是否还在为synchronized锁竞争头疼?是否好奇ZGC如何实现亚毫秒停顿?Java的未来将走向何方? 本文将带你深入JVM最硬核的三大领域: 并发模型:揭秘happens-before如何保证多线程安全(…...
Java的JDK、JRE、JVM关系与作用
Java的JDK、JRE、JVM关系与作用 java中的JDK、JRE和JVM是三个核心组件,各自承担不同角色,且存在层级依赖关系 1. JVM(Java Virtual Machine,Java虚拟机) 是什么: JVM是虚拟的计算机,能够执行…...
XMLHttpRequest vs Fetch API:一场跨越时代的“浏览器宫斗剧“
## 序幕:两个API的"身世之谜" 在Web开发的江湖里,XMLHttpRequest(简称XHR)就像一位身经百战的老将,而Fetch API则是手持光剑的绝地武士。让我们先来段"DNA检测": - **XHR(…...
Windows Anaconda使用Sentence-BERT获取句子向量
1、安装Anaconda: Anaconda是一个流行的Python数据科学平台,它包含了许多科学计算和数据分析的库,包括transformers和sentence_transformers。虽然不是必需的,但使用Anaconda可以简化环境管理和依赖安装的过程。 可以从Anaconda官…...
【Java设计模式】第5章 工厂方法模式讲解
5. 工厂方法模式 5.1 工厂方法讲解 定义:定义一个创建对象的接口,由子类决定实例化的类,将对象创建延迟到子类。适用场景: 创建对象需要大量重复代码。客户端不依赖具体产品的创建细节。优点: 符合开闭原则,新增产品只需扩展子类。客户端仅依赖抽象接口,不依赖具体实现…...