媒体资源生产转码过程
音视频基础
1. 音频基础原理
1.1 声音的基本概念
- 声波: 声音是通过空气或其他介质传播的机械波。声波的特性包括频率(Hz)、振幅(dB)和波形。
- 采样率 (Sampling Rate): 每秒对声音信号进行采样的次数,单位为赫兹(Hz)。常见的采样率有44.1 kHz(CD音质)、48 kHz(专业音频)等。
- 位深度 (Bit Depth): 每个采样点的量化精度,单位为比特(bit)。常见的位深度有16 bit、24 bit等。
- 声道 (Channels): 声音的通道数,如单声道(Mono)、立体声(Stereo)、多声道(如5.1环绕声)。
1.2 音频编码
- 无损压缩: 保留所有原始数据,不丢失信息,如FLAC、ALAC。
- 有损压缩: 通过去除人耳不易察觉的信息来减少数据量,如MP3、AAC、OGG Vorbis。
- 编码标准:
- MP3 (MPEG-1 Audio Layer 3): 广泛使用的有损音频编码格式。
- AAC (Advanced Audio Coding): 提供比MP3更好的音质,广泛用于流媒体。
- FLAC (Free Lossless Audio Codec): 无损音频编码格式,保留所有原始数据。
- Opus: 适用于实时通信和流媒体,提供高质量音频压缩。
2. 视频基础原理
2.1 图像的基本概念
- 像素 (Pixel): 图像的基本单位,每个像素由红、绿、蓝三种颜色分量组成。
- 分辨率 (Resolution): 图像的宽度和高度,以像素为单位,如1920x1080。
- 帧 (Frame): 视频中的一幅静止图像,视频由连续的帧组成。
- 帧率 (Frame Rate): 每秒显示的帧数,单位为fps(frames per second),如24 fps、30 fps、60 fps。
2.2 视频编码
- 帧内编码 (Intra-frame Coding, I-frames): 对单个帧进行编码,不依赖其他帧。
- 帧间编码 (Inter-frame Coding, P-frames, B-frames): 通过参考前一帧或前后帧进行预测编码,提高压缩效率。
- 编码标准:
- H.264/AVC (Advanced Video Coding): 广泛使用的标准,支持高分辨率视频。
- H.265/HEVC (High Efficiency Video Coding): 新一代标准,提供更高的压缩效率。
- VP9: 由Google开发的开源视频编码标准。
- AV1: 由开放媒体联盟开发的开源视频编码标准,提供比VP9更好的压缩效率。
4. 传输与存储
4.1 传输
- 流媒体: 通过网络实时传输音视频数据,常见的协议有RTMP、HLS、DASH。
- 文件传输: 通过FTP、HTTP等协议传输音视频文件。
4.2 存储
- 本地存储: 存储在硬盘、SSD等本地设备上。
- 云存储: 存储在云端服务器上,如AWS S3、阿里云OSS。
5. 常见问题与优化
5.1 延迟与同步
- 低延迟: 通过优化编码参数、使用高效的传输协议等方式减少延迟。
- 音视频同步: 确保音频和视频的时间同步,通常通过时间戳来实现。
5.2 质量与带宽
- 自适应比特率: 根据网络条件动态调整比特率,确保流畅播放。
- 编码优化: 通过选择合适的编码参数和算法,平衡质量和带宽需求。
6. 工具与软件
- FFmpeg: 强大的开源多媒体框架,支持多种编解码器和容器格式。
- HandBrake: 开源的视频转码工具,用户友好且功能强大。
- Adobe Media Encoder: 专业的视频编码工具,集成在Adobe Creative Suite中。
- VLC Media Player: 开源的多媒体播放器,支持多种编解码器和容器格式。
视频编解码技术
视频编解码是多媒体处理中的关键技术,涉及将原始视频数据压缩为更小的文件以便存储和传输,然后再解压缩以供播放。以下是一些关于视频编解码的关键知识:
1. 基本概念
- 编码 (Encoding): 将原始视频数据压缩成更小的文件格式,以减少存储空间和带宽需求。
- 解码 (Decoding): 将压缩后的视频文件还原为原始视频数据,以便播放。
1.1 编码过程
- 预处理: 包括去噪、色彩校正等。
- 采样与量化: 将模拟信号转换为数字信号。
- 压缩: 通过各种算法(如运动估计、变换编码、量化、熵编码)减少数据量。
- 封装: 将编码后的数据封装到容器格式中(如MP4、MKV)。
1.2解码过程
- 解封装: 从容器格式中提取编码后的数据。
- 解码: 通过解码器将压缩的数据还原为原始数据。
- 后处理: 包括色彩校正、滤波等。
- 播放: 将解码后的数据输出到显示器和扬声器。
2. 常见视频编码标准
-
H.264/AVC (Advanced Video Coding):
- 广泛使用的标准,支持高分辨率视频。
- 适用于多种设备,包括智能手机、平板电脑、电视等。
- 提供良好的压缩效率和图像质量。
-
H.265/HEVC (High Efficiency Video Coding):
- 新一代标准,相比H.264提供更高的压缩效率(约50%)。
- 支持更高分辨率(如4K、8K)。
- 需要更强的计算能力来实现编码和解码。
-
VP9:
- 由Google开发的开源视频编码标准。
- 提供与H.265类似的压缩效率。
- 主要用于Web视频流(如YouTube)。
-
AV1:
- 由开放媒体联盟(AOMedia)开发的开源视频编码标准。
- 目标是提供比VP9更好的压缩效率。
- 逐渐被更多平台和支持。
-
MPEG-4 Part 2:
- 较早的标准,广泛应用于早期的数字视频内容。
- 被H.264逐步取代。
3. 编码参数
- 分辨率 (Resolution): 视频的宽度和高度(如1920x1080, 1280x720)。
- 帧率 (Frame Rate): 每秒显示的帧数(如24 fps, 30 fps, 60 fps)。
- 比特率 (Bitrate): 每秒传输的数据量(如5 Mbps, 3 Mbps)。
- 关键帧 (Key Frames, I-frames): 完整的图像帧,不依赖于其他帧。
- P-帧 (Predictive Frames): 通过参考前一帧进行预测编码。
- B-帧 (Bidirectional Frames): 通过参考前后帧进行双向预测编码。
4. 编码技术
- 帧内编码 (Intra-frame Coding): 对单个帧进行编码,不依赖其他帧。
- 帧间编码 (Inter-frame Coding): 通过参考其他帧进行编码,提高压缩效率。
- 运动估计 (Motion Estimation): 识别帧间的运动信息,用于帧间编码。
- 量化 (Quantization): 降低图像数据的精度,以减少数据量。
- 熵编码 (Entropy Coding): 使用无损压缩算法(如Huffman编码、算术编码)进一步压缩数据。
5. 常见的视频容器格式
- MP4 (MPEG-4 Part 14): 广泛使用的容器格式,支持多种编解码器。
- MKV (Matroska Video): 开源容器格式,支持多种编解码器和字幕。
- AVI (Audio Video Interleave): 早期的容器格式,现在较少使用。
- FLV (Flash Video): 用于在线视频流,主要由Adobe Flash Player支持。
- TS (Transport Stream): 用于广播和实时流媒体,支持多路复用。
6. 硬件加速
- GPU加速: 利用图形处理器(GPU)进行视频编码和解码,提高处理速度和效率。
- 专用硬件: 如Intel Quick Sync, NVIDIA NVENC, AMD VCE等,专门设计用于视频编解码任务。
7. 应用场景
- 直播: 实时编码和传输,需要低延迟和高稳定性。
- 点播: 预先编码好的视频,可以进行高质量压缩。
- 移动设备: 优化编码参数以适应移动设备的处理能力和带宽限制。
- 云服务: 大规模视频转码和分发,需要高效的并行处理能力。
8. 工具和软件
- FFmpeg: 强大的开源多媒体框架,支持多种编解码器和容器格式。
- HandBrake: 开源的视频转码工具,用户友好且功能强大。
- Adobe Media Encoder: 专业的视频编码工具,集成在Adobe Creative Suite中。
- VLC Media Player: 开源的多媒体播放器,支持多种编解码器和容器格式。
9. 性能优化
- 多线程编码: 利用多核处理器进行并行编码,提高效率。
- 预处理: 在编码前进行去噪、色彩校正等预处理,提高编码质量。
- 自适应比特率: 根据网络条件动态调整比特率,确保流畅播放。
生产转码过程
媒体生产转码是将原始视频或音频文件转换为不同格式、分辨率、比特率等参数的过程,以适应不同的播放设备和网络条件。这个过程通常涉及多个步骤和技术,下面是一个详细的媒体生产转码过程:
1. 输入文件准备
- 源文件获取:从存储系统中获取原始媒体文件。
- 文件验证:检查文件的完整性和格式,确保文件没有损坏且符合预期。
2. 预处理
- 解复用:将原始文件中的音视频流分离出来。
- 解码:将音视频流解码为原始的未压缩数据。
- 预处理滤波:应用一些预处理滤波器,如去噪、色彩校正、裁剪等,以提高视频质量。
3. 编码设置
- 选择编码器:根据目标格式选择合适的编码器(如H.264, H.265, VP9, AAC, MP3等)。
- 配置参数:
- 分辨率:设定输出视频的分辨率(如1080p, 720p, 480p等)。
- 比特率:设定输出视频的比特率(如5 Mbps, 3 Mbps, 1 Mbps等)。
- 帧率:设定输出视频的帧率(如30 fps, 24 fps等)。
- 音频参数:设定输出音频的比特率、采样率、声道数等。
4. 编码
- 视频编码:将预处理后的视频数据编码为目标格式。
- 音频编码:将预处理后的音频数据编码为目标格式。
- 多路复用:将编码后的音视频流重新组合成一个文件(如MP4, MKV, HLS, DASH等)。
5. 后处理
- 封装:将编码后的音视频流封装到指定的容器格式中。
- 元数据添加:添加必要的元数据信息,如标题、作者、版权信息等。
- 字幕嵌入:如果需要,可以将字幕嵌入到最终的媒体文件中。
6. 质量检查
- 自动检测:使用自动化工具对转码后的文件进行质量检测,确保没有明显的质量问题(如黑屏、音频丢失等)。
- 人工审核:在某些情况下,可能需要人工审核以确保最终输出的质量。
7. 存储与分发
- 存储:将转码后的文件存储到指定的存储系统中(如云存储、本地服务器等)。
- 分发:通过CDN(内容分发网络)或其他分发机制将文件推送到用户端。
8. 日志记录与监控
- 日志记录:记录整个转码过程的日志,包括输入文件、处理步骤、输出文件等信息。
- 监控:实时监控转码任务的状态,确保任务按时完成,并及时发现和处理任何问题。
示例流程
以下是一个具体的示例流程,假设我们将一个高清视频文件转换为适合移动设备播放的低分辨率版本:
-
输入文件准备:
- 获取原始高清视频文件(例如1080p, 10 Mbps, 30 fps, H.264编码)。
-
预处理:
- 解复用视频和音频流。
- 解码视频和音频流。
- 应用去噪滤波器。
-
编码设置:
- 选择H.264编码器。
- 设置输出分辨率为720p。
- 设置输出比特率为3 Mbps。
- 设置输出帧率为30 fps。
- 选择AAC音频编码器。
- 设置音频比特率为128 kbps。
-
编码:
- 将预处理后的视频数据编码为720p, 3 Mbps, 30 fps, H.264格式。
- 将预处理后的音频数据编码为128 kbps, AAC格式。
- 将编码后的音视频流复用为MP4文件。
-
后处理:
- 封装为MP4文件。
- 添加元数据信息(如标题、作者)。
- 嵌入字幕(如果需要)。
-
质量检查:
- 自动检测输出文件的质量。
- 人工审核确保没有明显的问题。
-
存储与分发:
- 将转码后的MP4文件存储到云存储系统。
- 通过CDN将文件分发给用户。
-
日志记录与监控:
- 记录整个转码过程的日志。
- 实时监控转码任务的状态。
相关文章:
媒体资源生产转码过程
音视频基础 1. 音频基础原理 1.1 声音的基本概念 声波: 声音是通过空气或其他介质传播的机械波。声波的特性包括频率(Hz)、振幅(dB)和波形。采样率 (Sampling Rate): 每秒对声音信号进行采样的次数,单位为赫兹&…...
WPF控件Grid的布局和C1FlexGrid的多选应用
使用 Grid.Column和Grid.Row布局,将多个C1FlexGrid布局其中,使用各种事件来达到所需效果,点击复选框可以加载数据到列表,移除列表的数据,自动取消复选框等 移除复选框的要注意!!!&am…...
Postman配置环境变量
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Postman是一套比较方便的接口测试工具,但我们在使用过程中,可能会出现创建了API请求,但API的URL会随着服务器IP地址的变化而改…...
import语句详解
在 Java 中,import 语句用于引入其他包中的类、接口或静态成员,以便在当前源文件中直接使用它们,而不需要写完整的类名(包括包名)。以下是 import 语句的详细解释和使用方法: 一、import语句的基本概念 定…...
数据结构与算法之二叉树: LeetCode 199. 二叉树的右视图 (Ts版)
二叉树的右视图 https://leetcode.cn/problems/binary-tree-right-side-view/ 描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1 输入:root [1,2,3,nu…...
CentOS7修改Docker默认存储路径
当你使用Docker时,Docker的默认配置是将镜像、容器和卷存储在系统/var/lib/docker/目录下,如果docker镜像安装的太多会导致磁盘不够,你可以尝试以下方法来释放空间: 清理无用的镜像和容器:使用docker命令删除不再使用…...
宝塔面板使用 GoAccess Web 日志分析教程
宝塔面板是一个简单方便的服务器运维面板,但其网站统计功能是收费的。而 GoAccess 是一个用 C 编写的免费开源 Web日志分析器,本文将介绍如何在宝塔面板中开启 GoAccess Web 日志分析功能。 内容索引 下载安装 GoAccess在宝塔面板中添加日志切割的计划任务将 Web 日志输出到…...
【FPGA】时序约束与分析
设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…...
c++入门之 命名空间与输入输出
1、命名空间 1.1使用命名空间的原因 先看一个例子: #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问,这个程序能跑起来吗? 答案是否定的 原因是,当我们想创建一个全局变量 …...
【zotero】解决无法参考文献交叉跳转、相关参考文献插件推荐
无法跳转 参考大佬文章的方法: https://blog.csdn.net/air__Heaven/article/details/137470687 但是有可能有时候又跳不了了,可以多多执行一下 zotero-citation插件 github地址 : https://github.com/MuiseDestiny/zotero-citation cl ht…...
《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》
在人工智能领域,深度学习模型的训练与推理通常需要强大的计算资源和大量的数据支持。而鸿蒙系统的分布式框架为解决这一问题提供了新的思路和方法,使得深度学习模型能够在多个设备之间实现高效的训练与推理。 鸿蒙分布式框架概述 鸿蒙系统是一款面向万…...
不同方式获取音频时长 - python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
用python实现烟花代码,完整代码拿走不谢
有时候用python实现一些有趣的代码,既有趣,又能提升知识 使用Python实现动态烟花代码 效果如下: 不废话,直接上代码: import pygame from random import randint, uniform, choice import mathvector pygame.math…...
[OPEN SQL] 限定选择行数
本次操作使用的数据库表为SCUSTOM,其字段内容如下所示 航班用户(SCUSTOM) 该数据库表中的部分值如下所示 指定查询多少行数据,我们可以使用语法UP TO n ROWS来实现对数据前n项的查询 语法格式 SELECT * FROM <dbtab> UP TO n ROWS 参数说明 db…...
【入门级】计算机网络学习
网络安全:前端开发者必知:Web安全威胁——XSS与CSRF攻击及其防范-CSDN博客 三次握手四次挥手:前端网络—三次握手四次挥手_前端三次握手-CSDN博客 http协议和https协议的区别:前端网络—http协议和https协议的区别-CSDN博客 网…...
Redis 安装与 Spring Boot 集成指南
安装 Redis 和将其与 Spring Boot 应用集成是构建高效缓存解决方案的常见步骤。以下是详细的指南,帮助你在本地环境中安装 Redis,并在 Spring Boot 项目中配置和使用它。 1. 安装 Redis Windows 环境 Redis 官方并不直接支持 Windows,但你…...
基于 Python 和 OpenCV 的人脸识别上课考勤管理系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【c/c++】 windows下调用putty
windows和linux系统存在差异,同样的数据在两边的终端行为都不一样,就很头疼。 例如:换行符,win下是\r\n 而linux下是\n 又或者win下使用vi 好在找到了解决方案 1、通过第三方程序GoTTY(支持windows和Linux&#x…...
JVM常见面试题
1.内存泄漏与内存溢出的区别 内存泄漏是指不再使用的对象无法得到及时的回收,持续占用内存空间,从而导致系统内存逐渐减少,系统性能下降,最终可能引发内存溢出内存溢出是指程序在运行时需要分配内存,但 JVM 没有足够的内存可以分配(超出可用内存大小),最终导致内存分配…...
手机租赁系统开发解决方案与市场趋势分析
内容概要 手机租赁系统开发正如一场技术与商业的双重舞会,双方时而相互辉映,时而却也是一场较量。在这片快速变幻的市场中,了解当前的技术实现与挑战尤为重要。例如,系统架构的选择、数据安全性以及用户体验设计都可能成为企业发…...
基于Qt的OFD阅读器开发原理与实践
摘要 本文详细探讨了基于Qt开发OFD阅读器的原理与实践。通过解析OFD文件格式、构建文档结构、实现页面渲染、处理用户交互以及进行性能优化,本文展示了如何使用Qt框架开发一个功能强大、性能优异的OFD阅读器。文章还提供了示例代码和未来发展方向,为开发…...
Redis实现高效的负载均衡算法
1. Redis存储设计 我们需要在 Redis 中存储以下信息: 配置列表(List<Config>):存储所有配置项。总权重:存储所有配置的总权重。当前轮询状态:存储当前的轮询状态(如当前随机值或索引&am…...
spring依赖注入
一、 注入方式 1. 构造器注入 构造器注入通过构造方法来注入依赖的对象。当Spring容器创建Bean时,会通过构造器来传递依赖对象。这种方式是最推荐的方式,因为它可以确保依赖对象在创建时已经完全注入。 示例: Component public class Car…...
流浪猫流浪狗领养PHP网站源码
源码介绍 流浪猫流浪狗领养PHP网站源码,适合做猫狗宠物类的发信息发布。当然其他信息发布也是可以的。 导入数据库,修改数据库配置/application/database.php 设置TP伪静态,设置运行目录, 后台:/abcd.php/dashboard?…...
ffmpeg 编译遇到的坑
makeinfo: error parsing ./doc/t2h.pm: Undefined subroutine &Texinfo::Config::set_from_init_file called at ./doc/t2h.pm line 24. 编译选项添加: --disable-htmlpages...
灵活运用事务回滚,快捷处理多张数据表格
各位编程宝子们(尤其是对MySQL了解不多的宝子们)在使用关系表处理时,有时候会希望简单一次性解决多张表的数据处理,但又有时候无从下手。其实有时候掌握数据的事务和回滚便可以简单解决这些事情,接下来我将以一个学生信…...
MyBatis 性能优化
1. 引言 1.1 什么是 MyBatis? MyBatis 是一款流行的 Java 持久层框架,能够将 Java 对象与 SQL 数据库映射起来。与传统的 JDBC 不同,MyBatis 提供了灵活的 SQL 映射功能,使开发者可以专注于业务逻辑,而无需编写冗长的…...
【python基础】python内置函数 zip用法介绍
zip() 是 Python 中非常有用的内建函数,能够将多个可迭代对象(如列表、元组、字符串等)打包成一个迭代器,它将对应位置的元素组合成元组,并返回一个由这些元组组成的迭代器。通常用于并行处理多个可迭代对象。 1. 基本…...
Unity Android AAB包GooglePlay上线备忘
aab GooglePlay要求新上线的App必须使用aab格式提交,在Unity Build Settings中勾选Build App Bundle 选项即可;或者在代码中设置: EditorUserBuildSettings.buildAppBundle true; 安装测试 https://developer.android.com/tools/bundlet…...
基于springboot的课程作业管理系统源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的课程作业管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 可以管理首页、个人中心…...
JVM生产环境常用参数配置及调优建议
一、生产常用参数配置 JAVA_OPTS="-server -Xms4G -Xmx4 -Xmn2G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:G1HeapRegionSize=16m -XX:MaxGCCount=10 -XX:MetaspaceSize=256m -XX:…...
vue 实现打包并同时上传至服务器端
将 publish_script 及以下文件 upload.server.js 添加到 主文件下,与 src 同级别 具体操作步骤: 1、安装 npm install scp2 2、将下面两条命令加入至 package.json 的 scripts 中 "upload": "node publish_script/upload.server.js&q…...
深入探索AI核心模型:CNN、RNN、GAN与Transformer
在人工智能的飞速发展中,众多深度学习模型和算法不断涌现,推动了许多领域的进步。特别是在图像识别、自然语言处理、生成建模等方向,AI模型的应用越来越广泛。本文将介绍几种最常用的AI模型,包括卷积神经网络(CNN&…...
【Elasticsearch】配置分片分配到指定节点
配置分片分配到指定节点 参考文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html 两种方式:根据节点属性分配和根据节点名称分配。 测试环境 tar xvf elasticsearch-7.17.25-linux-x86_64.tar.gz…...
【贵州省】乡镇界arcgis格式shp数据乡镇名称和编码内容下载测评
shp数据字段乡镇名称和编码,坐标是wgs84,数据为SHP矢量格式,下载下来直接加载进ArcMap即可使用 下载地址:https://download.csdn.net/download/zhongguonanren99/14928126...
EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端
产品需求: 前端上传个csv 或 excel 文件,文件共4列,验证文件大小,类型,文件名长度,文件内容,如果某行某个单元格数据验证不通过,就把错误信息放到这行第五列,然后把带有…...
Python 植物大战僵尸
文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路: 导入必要的库和模块:首先,我们导入了Python的os、time库以及pygame库,还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…...
继承(7)
大家好,今天我们继续来学习一下继承的知识,这方面需要大家勤动脑才能理解,那么我们来看。 1.9 protected关键字 在类和对象章节中,为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …...
UML(统一建模语言)
目录 一、用例图(Use Case Diagram) 二、类图(Class Diagram) 2.1、泛化(Generalization) 2.2、实现(Realization) 2.3、关联(Association) 2.4、聚合&…...
【面试题】技术场景 7、定位系统瓶颈
系统瓶颈定位方法总述 面试官询问如何快速定位系统瓶颈,旨在考察线上调试经验。主要方法包括: 压测:在项目上线前找出系统瓶颈并修复。监控工具或链路追踪工具:项目上线后用于实时监控或评测找瓶颈。Arthas(原阿尔萨…...
计算机网络之---传输层的功能
传输层的功能 传输层是 OSI(开放系统互联)七层模型中的第四层,位于应用层和网络层之间。传输层的主要作用是提供端到端的通信服务,确保数据在不同设备之间的可靠传输。它主要负责将来自上层(应用层)的数据拆…...
设计一个利用事务特性可以阻塞线程的排他锁,并且通过注解和 AOP 来实现
设计思路: 利用数据库表记录锁标识:通过唯一标识符(如方法名 参数),我们可以在数据库中插入一条记录,表示当前方法正在执行。这条记录需要记录插入时间。 注解:通过注解标识哪些方法需要加锁&a…...
《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Tzr9Y3EQ7/ 《安富莱嵌入式周报》第348期:开源低功…...
C#实现凸壳算法
凸壳计算代码: public static PointD[] calcConvexHull(PointD[] points) {// 按 x 坐标对点进行排序Array.Sort(points, (p1, p2) => p1.X.CompareTo(p2.X));// 创建下凸壳var lowerHull = new List<PointD>();foreach (var point in points){while (lowerHull.Co…...
轻量级适合阅读的优秀 C++ 开源项目
CTPL 这是一个现代简易版的、高效的C线程池库,代码行数500行左右。 代码示例: void first(int id) { std::cout << "hello from " << id << \n; } struct Second { void operator()(int id) const { std::cout << &q…...
数据结构:栈(Stack)和队列(Queue)—面试题(一)
目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述: 给定一个只包括 (,),{,},[,] …...
20250110-System类
1. 定义 java不支持全局变量和方法,因此将与系统相关的重要方法和变量放在了一个统一的类中,即System类,其中所有的成员都是静态的。 2. System类中的方法 PS: System.out.print(),其中的out是System的静态变量&am…...
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
JavaSE——网络编程
一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象: InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象(比如说域名) InetAddress host InetAddress.getByNa…...
antd-design-vue1.7.8浏览器中使用
快速开始 引入js和css <link href"antd/antd.css" rel"stylesheet"> <script src"vue2/vue.js" type"text/javascript"></script> <script src"antd/antd.js" type"text/javascript">&…...