- 博客(419)
- 资源 (9)
- 收藏
- 关注
原创 matplotlib 非阻塞显示
"""创建时间:2020-10-29 21:11最近一次修改时间:2020-10-29 21:11创建人:dss最近一次修改人:dss文档描述:串口数据的获取(用完之后记得关闭串口,不然下次获取的是缓存的数据)"""import serialimport numpy as npimport matplotlib.pyplot as pltfrom dataGlove.myData import parse_dataclass MySerial: def __init__(
2020-11-05 17:04:58
975
1
原创 pip install 使用国内镜像
让PIP源使用国内镜像,提升下载速度和安装成功率。对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成功率。国内源:新版ubuntu要求使用https源,要注意。清华:https://pypi.tuna.tsinghua.edu.cn/...
2019-01-15 22:13:36
98308
1
原创 [MediaForge] 架构之美:依赖倒置原则与好莱坞法则在微内核中的实战
通过依赖倒置(DIP)和好莱坞原则物理隔离:插件在 CMake 编译时,必须反向链接Core.lib。核心的 CMake 绝对不会扫描插件的源码。逻辑隔离:核心代码中没有任何具体的插件类名,只有IVideoIFilter等抽象接口。团队解耦:架构师负责维护的纯洁性;外包团队或第三方开发者只需要拿着这些头文件,去开发独立的 DLL 即可。这就解释了为什么在重构时,我们必须将那些看似属于插件的基类文件(如),强行从plugins/目录搬回目录。因为制定标准的人,必须坐在核心的位置。
2026-05-03 21:32:42
315
原创 [MediaForge] 工业级构建:插件化架构下的 CMake 深度改造指南
经过这四大改造,整个QTTest工程实现了一条工业级的自动化构建流水线点击 Build (生成)。CMake 首先编译出Core.dll,并生成包含导出符号的Core.lib。CMake 接着并行编译各个插件模块(如),在编译时链接Core.lib。编译完成后,触发POST_BUILD钩子。所有插件的.dll文件被自动汇聚,整齐地归档到同级的plugins/目录中。运行主程序瞬间扫描到所有插件并动态加载,系统完美运行。
2026-05-03 20:47:42
322
原创 [MediaForge] 进阶架构师:从插件化到微内核与沙盒架构深度解析
系统分为一个极其精简的“核心(Core)”和一堆各自独立的“插件(Plugins)”。核心(Core):不干脏活,只管规则。它定义抽象接口(Interface),提供注册中心(Registry),负责在需要的时候调度插件。插件(Plugin):干脏活,且绝对隔离。插件 A 和插件 B 互相不知道对方的存在。通俗地说,沙盒就是一个“只进不出”的玻璃笼子。就像给小孩准备的沙坑:小孩可以在里面随便玩泥巴(故障隔离),但绝对不允许跨出木框(权限剥夺),渴了只能喊大人递水(受控通信)。
2026-05-03 19:07:53
345
原创 [MediaForge] Protocol Buffers (Protobuf) 在本项目中的使用指南
Protocol Buffers(简称 Protobuf 或 pb)是由 Google 开发的一种轻量级、高效的数据交换格式。它主要用于序列化结构化数据,相比于传统的 XML 或 JSON,它拥有体积更小、解析速度更快、跨语言支持更强的优势。跨进程通信(IPC)的协议层。
2026-04-29 10:01:32
552
原创 [MediaForge] 音视频项目中的配置落盘与加载功能深度解析
本项目对落盘与加载机制的实现遵循了“大道至简”的设计哲学。它没有引入复杂的第三方依赖库,而是利用 STL 标准库手工实现了 JSON 的解析与序列化;同时结合单例模式、互斥锁以及灵活的扁平化 Key 架构,不仅满足了音视频引擎对参数的快速并发读写需求,也兼顾了极高的执行效率与跨平台可移植性。
2026-04-28 09:25:51
129
原创 [MediaForge] 项目架构反思:UI 层与底层多媒体引擎的解耦重构
通过这次架构重构,我们的目标是让 UI 层变得极其“轻薄”和“清爽”。“用户点了什么”和“向 CoreAPI 发送什么指令”。这不仅能大幅提升代码的可读性和可维护性,也将为未来系统接入更多编码器、扩展更多媒体处理功能打下坚实的基础。
2026-04-28 09:03:17
233
原创 [MediaForge] 视频编码器集群与软硬编实现细节
在视频流水线的最后一环,离屏渲染合成好的 YUV 数据需要被高效压缩,才能用于网络推流或本地存储。我们的系统采用了基于接口的插件化设计,支持多路并发编码,并针对不同的应用场景提供了多种编码器实现。本文将详细梳理视频编码器模块的设计,重点对比 FFmpeg 软件编码与 NVENC 硬件编码的实现细节,并记录目前硬编中采用的低延迟参数策略。
2026-04-27 10:27:51
188
原创 [MediaForge] D3D11Render 渲染器设计与离屏合成机制
在多媒体系统中,视频画面的高质量处理和实时合成是重中之重。为了最大限度地利用 GPU 的并行计算能力,减轻 CPU 负担,我们设计并实现了基于 DirectX 11 的硬件渲染器。本文将深入解析的核心设计,探讨其是如何利用硬件加速完成画面绘制、离屏合成以及颜色空间转换的,并记录目前代码中规划的“类 OBS”架构演进方向。
2026-04-27 10:21:39
116
原创 [MediaForge] 视频模块核心架构与 VideoEngine 调度机制
核心调度引擎 (整个视频流水线的“心脏”。它维护着一个独立的后台线程,按照设定的目标帧率(FPS)不断地驱动渲染器工作,并将生成的画面数据分发给各个编码器。硬件渲染器 (负责画面的实际绘制与离屏合成。它利用 DirectX 11 硬件加速,处理纹理映射、颜色空间转换(如 RGB 转 YUV)以及基础的图像变换(缩放、旋转、透明度等)。视频编码器集群 (数据消费端。
2026-04-27 10:09:17
409
原创 [MediaForge] 媒体管线架构解析:从 Element 到 Muxer
在音视频开发中,如何优雅地将采集、处理、编码、封装等功能模块串联起来,是架构设计的核心挑战。在MediaForge工程中,整个媒体处理管线采用了一种基于节点的插件化设计(Node-based Pluggable Architecture)。本文将从最基础的Element抽象类讲起,剖析IOutput与IMux的桥接关系,最终揭示Muxer和Stream在封装层的协作机制。
2026-04-24 10:30:05
468
原创 [MediaForge]深入浅出音视频开发:全面解析音频的 Extradata
简单来说,extradata是一段用于初始化解码器的全局配置数据。它不包含任何具体的音频采样声音内容,而是包含了解码音频所需的关键参数。如果把解码器比作一台生产线,那么extradata就是生产线开工前必须录入的“配置表”。在最常见的 AAC 格式中,extradata通常被称为。Profile(如 LC、HE)采样率索引(Sample Rate Index,如 44100Hz、48000Hz)声道数配置(Channel Configuration,如单声道、双声道)
2026-04-24 10:06:15
166
原创 [MediaForge]深入理解音频开发:FFmpeg AAC 编码器实战指南与避坑指南
通常是因为编码器内部有缓冲延迟(Delay)。在录制结束时,必须向编码器发送一个。
2026-04-23 09:51:28
326
原创 [MediaForge] 深入理解音频开发:FFmpeg AAC 编码器初始化参数全解析
你承诺:“我会一直提供48000Hz立体声FLTP格式的原始数据,并且目标是压成128kbps。FFmpeg 承诺:“好的,我接受任务。请注意,为了保证压缩效率,我每次只接受不多不少刚好1024个采样点。这是我的extradata身份证,请拿去给 MP4 封装器。理清了哪些参数该由你提供,哪些参数该由框架计算,你在编写音视频底层代码时,就不会再对那些晦涩的 API 感到迷茫了。
2026-04-12 14:34:22
380
原创 [MediaForge]深入理解音频开发:为什么我们需要“声道掩码” (Channel Mask)
在音频领域,mask(通道掩码)是一个用**位图(Bitmask)**来表示各个音频物理声道是否存在,以及它们各自位置的整数值。它本质上是一个uint64_t(64位无符号整数),每一位(bit)代表一个特定的物理扬声器位置。如果某一位是1,说明音频中包含该位置的声道;如果是0,则没有。(前置左声道) =0x00000001(二进制的第 0 位)(前置右声道) =0x00000002(二进制的第 1 位)(前置中置声道) =0x00000004(二进制的第 2 位)(低音炮/LFE) =
2026-04-12 12:41:05
390
原创 [MediaForge] 音频技术深度解析(四):音频封装与 MP4 文件
音频封装(Audio Muxing/Multiplexing)是将编码后的音频帧(以及可能的视频帧、字幕等)组织到一个容器文件中的过程,同时添加元数据、索引信息、时间戳等。│ 输入流 ││ ├─ 音频流: AAC 帧序列 (编码后) ││ ├─ 视频流: H.264 帧序列 (编码后, 可选) ││ └─ 字幕流: 字幕数据 (可选) ││▼│ 封装器 (Muxer) ││ │ 1. 写入文件头 (File Header) │ ││ │ 2. 写入元数据 (Metadata) │ │。
2026-04-02 10:30:15
533
原创 [MediaForge] 音频技术深度解析(五):常见问题与快速解决
排查方法论:复现 → 缩小范围 → 截流法 → 检查参数 → 验证假设截流法最有效:在每个节点保存文件,逐一验证工具很重要AI 是好帮手:清晰描述问题,提供完整信息日志要详细:打印所有参数,检查所有返回值。
2026-04-02 10:29:17
260
原创 [MediaForge] 音频技术深度解析(三):音频编码
音频编码(Audio Encoding)是将原始的 PCM(脉冲编码调制)音频数据通过压缩算法转换为更小体积的编码格式的过程。│ 原始 PCM 音频 ││ 采样率: 48000 Hz, 声道: 2, 位深: 16 位 ││ 比特率: 48000 × 2 × 16 = 1,536,000 bps (1.5 Mbps) ││▼│ 音频编码器 ││ │ 1. 心理声学模型分析 (Psychoacoustic Model) │ ││ │ 2. 时域到频域转换 (MDCT) │ │。
2026-04-02 10:26:29
271
原创 [MediaForge] 音频技术深度解析(二):音频重采样
音频重采样(Audio Resampling)是将音频信号从一种采样率、声道数或位深度转换到另一种格式的过程。│ 输入音频信号 ││ 采样率: 44100 Hz, 声道: 2, 位深: 16 位 ││▼│ 重采样处理 ││ │ 1. 抗混叠滤波 (Anti-aliasing Filter) │ ││ │ 2. 插值 (Interpolation) / 抽取 (Decimation) │ ││ │ 3. 声道重映射 (Channel Remapping) │ │。
2026-04-02 10:13:21
180
原创 [MediaForge] 音频技术深度解析(一):音频采集
监听(Monitoring):在采集音频的同时,实时播放到扬声器,让你能听到自己在录什么。✅ 可以开关(✅ 可以调节音量(✅ 独立线程,不影响采集✅ 不经过重采样,低延迟✅ 完整的 WASAPI 封装(设备枚举、采集、Loopback)✅ 双线程设计(MessagePump + ResamplePump)✅ 双 RingBuffer(原始数据 + 处理后数据)✅ 集成 FFmpeg swresample 重采样✅ 监听功能(可开关、可调音量)✅ 详细的日志输出。
2026-04-02 10:12:22
386
原创 [MediaForge] 音视频调试手段深度解析:从实战到方法论
AudioTestDemo 在处理音频数据时经常崩溃。步骤行动发现1查看崩溃调用栈崩溃在 RingBuffer 的 memcpy2检查 RingBuffer 实现Extend() 函数有问题3分析 Extend()环绕情况(m_beginPos >= m_endPos)时数据移动不完整4添加边界检查发现多处缺少边界检查5写单元测试验证修复后的代码抽象出的排查步骤:复现问题- 确保问题能稳定复现定位范围- 是数据结构问题?还是业务逻辑问题?关键函数检查。
2026-04-01 21:29:11
352
原创 [MediaForge] 单元测试深度解析:从理论到实践
最成熟、生态最好的 C++ 测试框架支持测试夹具(Test Fixture)支持参数化测试内置丰富的断言宏配套 GoogleMock 做 Mock支持 XML/JSON 等多种输出格式与 CMake/CTest 集成好// 简单测试// 测试夹具protected:代码覆盖率是衡量测试用例执行了多少代码的指标。覆盖率类型说明级别行覆盖率 (Line Coverage)执行了多少行代码⭐ 最常用函数覆盖率 (Function Coverage)
2026-04-01 21:11:18
363
原创 [MediaForge] CMake 深度解析:从实战到优化
函数作用项目示例添加可执行文件添加库文件(项目中未使用,但很重要)链接库添加头文件搜索路径添加编译选项添加宏定义作用域含义示例场景PRIVATE只用于当前目标,不传递给依赖者内部实现用的头文件PUBLIC用于当前目标,也传递给依赖者公开的 API 头文件INTERFACE不用于当前目标,只传递给依赖者纯头文件库# 链接 Qt 库# 添加头文件路径# MSVC 特定选项if(MSVC)endif()# 条件链接 FFmpegendif()函数作用项目示例添加自定义构建命令。
2026-04-01 20:54:02
240
原创 [MediaForge] C++ 日志基建深度解析:从选型到实现
GitHub星标超20k,是目前C++社区最受欢迎的日志库。核心设计理念是"用现代C++特性实现无锁并发,兼顾性能与易用性"。异步模式支持,性能极高基于 fmt 库的高效格式化(编译期格式检查)Header-only 设计,易于集成丰富的 sink(输出目标)支持:控制台、文件、轮转文件、系统日志等跨平台支持(Windows/Linux/macOS)// 控制台日志");// 文件日志return 0;// 定义一个自定义类型int x, y;
2026-04-01 20:36:40
344
原创 [直播推流]Windows网络编程避坑指南:Winsock的前世今生
当你开始Windows网络编程时,很可能会遇到这样的编译错误:这不是你的代码有问题,而是Windows历史遗留问题导致的经典陷阱。问题根源:第二步:链接正确的库或者在项目设置中添加 WIN32_LEAN_AND_MEAN 是什么?这是一个预处理器宏,告诉Windows.h:这就是技术债务的典型案例:为了向后兼容,新特性只能"绕道"添加。❌ 错误做法❌ 另一个错误检查清单遇到Winsock相关错误时:记住这个模板,你将避免90%的Windows网络编程陷阱!这篇文章源于真实踩坑经历,希
2026-03-09 17:14:23
470
原创 [ffmpeg] 时间基总结
当刚开始 pts 的时间基是以 tbc 为单位保存的,在录制和发送前需要将 pts 和 dts 转换成对应协议的时间基下的 pts 和 dts。如果直接把它们丢进容器,播放器根本没法对齐(一个用 0.0333s 计时,一个用 0.0000208s 计时)。音频:1/48000 → 每个 PTS 单位 = 0.0000208 秒。btn 的时间基是每种协议根据自身场景,定义出来的,不能随意改变。音频:1/samplerate(例如 1/48000)视频:1/framerate(例如 1/30)
2025-09-17 20:02:21
587
原创 内存与网络的字节序:大端 vs 小端
假设有一个 32 位整数 0x12345678,在内存里(低地址→高地址)怎么存:小端 (Little Endian)低字节放在低地址大端 (Big Endian)高字节放在低地址。
2025-09-16 11:28:27
388
原创 【DirectX】如何获取当前上下文的状态
函数获取到的 COM 对象都会增加引用计数,使用完后需要调用。代表 VS/PS/GS/HS/DS/CS):**释放,防止内存泄露。
2025-07-05 11:01:17
285
原创 像素着色器没有绘制的原因
顶点变换后的 Z 值超出了 [0,1] 范围(在使用 Depth Clip 的情况下)会被丢弃。默认是开启的,如果顶点顺序(顺时针/逆时针)不一致,可能导致三角面被剔除。directX调用了 draw,顶点着色器运行,但是像素着色器没有运行。分析下来,本次是因为“顶点变换后的三角形完全在视野外,会被丢弃。视锥体外(Frustum culling)顶点变换后的三角形完全在视野外,会被丢弃。深度裁剪或深度测试失败。
2025-06-19 14:43:55
332
python百例题目.docx
2019-09-02
opencv_python-3.4.0.12-cp27-cp27m-win-amd64.whl
2018-03-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅