NAudio.MacOS 使用 Core Audio HAL 播放音频文件(CoreAudioPlayer 完整实战指南)
音视频音频处理【免费下载链接】NAudioAudio and MIDI library for .NET项目地址https://gitcode.com/gh_mirrors/na/NAudio点击查看免费下载本篇指南基于 NAudio 仓库中的 PlayAudioFileMacOS.md 文档展开系统讲解在 macOS 上通过NAudio.MacOS包中的CoreAudioPlayer播放任意IWaveProvider以 WAV 文件为例的完整流程从安装预发布包、默认设备播放、设备枚举与选择、隐藏设备获取到硬件音量控制与逐通道音量调节。阅读本文后你将能够在 macOS 应用中以最小代码量完成音频播放并理解其内部格式协商、自动重采样与 HAL 格式变更自愈机制具备直接投入实战与二次开发的能力。为什么 macOS 上需要 CoreAudioPlayer在 NAudio 生态中Windows 平台常见的WaveOut、WasapiOut等输出设备实现依赖 WASAPI / WaveOut 等 Windows 专属 APImacOS 上并不存在这些 API。因此 NAudio 为 macOS 提供了独立的NAudio.MacOS包其中包含Core Audio Framework音频 HAL的托管封装围绕 Apple 的 Core Audio HAL API 提供设备枚举、属性读取、I/O 回调注册等基础能力CoreAudioPlayer位于NAudio.Wave命名空间一个通过 Core Audio HAL 播放音频的IWavePlayer实现也是 NAudio 用户在 macOS 上进行播放时的默认选择CoreAudioRecorder对应的录音实现Audio Toolbox 的 Audio Converter Services 与 Extended Audio File Services提供 macOS 原生重采样器、MP3只读、MP4/AAC、OGG Vorbis只读、FLAC 等文件读写能力。从源码注释可见CoreAudioPlayer被标记为[SupportedOSPlatform(ios2.0)]与[SupportedOSPlatform(macos10.5)]即支持 iOS 2.0 与 macOS 10.5 及以上版本见 CoreAudioPlayer.BaseAPI.cs。包引用状态预发布Pre-releaseNAudio.MacOS属于独立分包不包含在NAudio元包meta-package中必须显式引用。同时该包目前仍处于预发布阶段其 API 仍在演进、可能发生破坏性变更因此安装时需要使用--prerelease开关dotnet add package NAudio.MacOS --prerelease这一点在包的 README.md 中也有同样说明该包仍处于 pre-release 阶段可能发生破坏性代码变更请自行评估使用风险。最小播放示例默认输出设备播放 WAV 文件CoreAudioPlayer可以播放你提供的任意IWaveProvider。对于 WAV 文件可以直接使用 NAudio Core 库中的WaveFileReader读取using NAudio.Wave; using (var audioFile new WaveFileReader(any.wav)) using (var outputDevice new CoreAudioPlayer()) // 默认输出设备 { outputDevice.Init(audioFile); outputDevice.Play(); while (outputDevice.PlaybackState PlaybackState.Playing) { Thread.Sleep(200); } }代码要点new CoreAudioPlayer()的无参构造函数会通过AudioSystemObject.Instance.DefaultOutputDevice自动选定系统默认输出设备见 CoreAudioPlayer.BaseAPI.csInit(IWaveProvider)完成设备初始化、格式协商与 I/O 回调注册之后才能调用Play()主线程通过轮询PlaybackState并在循环中Thread.Sleep(200)等待播放自然结束避免using块提前释放资源播放结束后Dispose会一并释放设备监听句柄、I/O 过程与数据源。仓库中的集成测试给出了同样的使用范式测试CanPlayThreeSecondSignal用SignalGenerator生成 3 秒白噪声覆盖 44100/48000/52000/64000 Hz、单声道/双声道/三声道/四声道以及 IEEE float 与非 float 共 8 种组合均通过Init → Play → 轮询 PlaybackState → Stop → Dispose的流程验证见 CoreAudioPlayerTests.cs。无需手动协商格式内部自动重采样[!NOTE]CoreAudioPlayer不需要你在调用方做任何设备格式协商该工作由类的内部算法完成。当你的 wave provider 的格式与 HAL 当前格式不一致时它会在内部重采样以匹配。由于 HAL 格式经常变化该类会为你妥善处理这些变化。这个零配置承诺在源码层面有明确支撑。以Init为入口Initialize(bool) 会执行以下决策流程通过selectedDevice.GetStreams(AudioObjectPropertyScopeConstants.Output)获取设备的输出流列表逐个检查流的VirtualFormatNativeHAL 虚拟格式寻找与 provider 格式匹配采样率、位深、块对齐、声道数、编码全部一致的流直接复用若设备流是**非交错non-interleaved**布局则要求所有流格式一致并重建交错后的描述符多数情况下由此引入重采样需求若没有匹配的流则选定第一条流并启用内部重采样器。当需要重采样时ResamplerSource会创建LowLevelAudioConverter底层即 macOS Audio Converter Services把 provider 的数据按目标 ASBD 转换后交给 HAL 缓冲见 CoreAudioPlayer.ResamplerSource.cs当格式完全匹配时则使用RawSource直接把 provider 的数据拷贝进 HAL 缓冲零额外转换开销见 CoreAudioPlayer.RawSource.cs。应对 HAL 格式变化与设备失效在 I/O 过程中CoreAudioPlayer还通过属性监听实现了两类自愈虚拟格式变化OnVirtualFormatChanged当设备流的虚拟格式发生改变时先停止当前 I/O 过程销毁旧的数据源含重采样器再从零开始Initialize()若此前正在播放则自动恢复播放见 CoreAudioPlayer.InitAPI.cs流变更OnStreamsChanged输出流集合变化时同样执行停止 → 重建 → 恢复流程见 CoreAudioPlayer.InitAPI.cs设备失效OnDeviceWillBeDestroyed当所选设备即将被移除时播放器进入Invalidated状态并通过PlaybackStopped事件以CoreAudioException携带kAudioHardwareBadDeviceError通知调用方见 CoreAudioPlayer.InitAPI.cs。仓库测试IsHardenedAgainstVirtualFormatChanges专门验证了播放器在外部线程随机修改流虚拟格式时仍能正确重建初始化逻辑见 CoreAudioPlayerTests.cs。选择输出设备进行播放如果不想使用系统默认输出设备可以先通过 HAL 音频系统对象AudioSystemObject的Devices属性枚举系统当前安装的全部设备using NAudio.MacOS.CoreAudio; // 枚举所有可提供输出的设备。 foreach (var device in AudioSystemObject.Instance.Devices) { if (device.GetStreams(AudioObjectPropertyScopeConstants.Output).Length 0) { Console.WriteLine(${device.Name} - {device.Manufacturer}); } } // 选定设备后将其交给播放器 // using var createdPlayer new CoreAudioPlayer(chosenDevice);要点说明AudioSystemObject.Instance是 HAL 音频系统对象的单例入口源码中对应kAudioHardwarePropertyDevices属性枚举见 AudioSystemObject.cs用GetStreams(AudioObjectPropertyScopeConstants.Output)的返回值长度来判断设备是否具备输出能力选定的设备对象通过new CoreAudioPlayer(AudioDevice device)构造函数传入见 CoreAudioPlayer.BaseAPI.cs。注意该构造函数会校验设备IsAlive若设备即将被移除会抛出InvalidOperationException。[!NOTE]Devices属性返回的是调用时刻系统中安装的全部设备既包含输出设备也包含输入设备筛选输出设备是调用方自己的职责。[!NOTE] 你也可以通过音频系统对象实例提供的ConvertUIDToDevice方法获取隐藏设备hidden device。前提是你必须知道该设备的 UID。任何设备都可以通过其DeviceUID属性取得 UID对于CoreAudioPlayer则可以通过Device属性拿到它正在使用的设备对象进而读取DeviceUID。这一补充说明在源码中有完整对应AudioSystemObject.ConvertUIDToDevice(string uid)用于按 UID 解析设备见 AudioSystemObject.csAudioDevice.DeviceUID读取设备的kAudioDevicePropertyDeviceUID见 AudioDevice.cs而CoreAudioPlayer.Device属性直接暴露当前选中的设备对象见 CoreAudioPlayer.BaseAPI.cs。关于播放状态与暂停语义PlaybackState只会返回Playing或Stopped两种状态——这是因为 HAL 的 I/O 过程模型中没有暂停概念HAL 按需周期性回调每个 I/O 过程因此Pause()在实现上直接硬连线到Stop()自然也就不存在Paused状态见 CoreAudioPlayer.BaseAPI.cs。若你的业务逻辑依赖暂停语义需要自行维护目标暂停位置并在恢复时重新Init并Play相应片段。另外Stop()对PlaybackStopped事件做了去重仅在状态为Playing时触发一次事件避免源数据自然耗尽与主动Stop()造成事件重复派发见 CoreAudioPlayer.BaseAPI.cs。播放过程中的异常也会通过StoppedEventArgs.Exception透出测试中正是通过检查该字段来断言播放未被异常中断。改变设备的增益音量整体音量Volume 属性直接设置CoreAudioPlayer实例上的Volume属性即可改变设备音量createdPlayer.Volume 0.8f;关于该属性的实现与约束见 CoreAudioPlayer.BaseAPI.cs取值范围为0f到1f越界赋值会抛出ArgumentOutOfRangeException赋值操作会遍历所选设备的ControlList对所有AudioLevelControl且Kind AudioControlKind.VolumeControl的控件设置ScalarValue读取操作会基于每个音量控件的DecibelRange与DecibelValue反算标量值并取最小值源码注释提醒某些情况下 HAL 的属性更新存在滞后读取可能返回过时的 1但赋值总能达到预期效果。[!WARNING] 与许多其他IWavePlayer实现不同此实现直接修改设备的硬件音量控制。系统用户通常会将音量设置为期望值因此不建议你修改该值。如果只想调整增益而不打扰用户设置的系统音量请使用VolumeSampleProvider。也就是说软件增益的推荐做法是把VolumeSampleProvider注入到音频链路中例如var volumeProvider new VolumeSampleProvider(sampleSource.ToSampleProvider()) { Volume 0.8f }; // outputDevice.Init(volumeProvider.ToWaveProvider());VolumeSampleProvider位于NAudio.Wave.SampleProviders命名空间是 NAudio Core 库提供的通用软件增益组件不影响任何硬件音量状态。逐通道音量遍历设备控制列表在某些情况下你可能希望按通道分别修改音量。做法是取出设备的控制列表并逐个遍历控件foreach (var control in createdPlayer.Device.ControlList) { if (control is AudioLevelControl lc lc.Kind AudioControlKind.VolumeControl) { System.Console.WriteLine(Modifying volume of channel {0}., lc.Element); lc.ScalarValue 0.8f; } }说明CoreAudioPlayer.Device.ControlList等价于调用所选设备对象的ControlList属性底层读取设备的kAudioObjectPropertyControlList见 AudioDevice.csAudioLevelControl是音量电平控件的托管封装其ScalarValue属性读写设备的kAudioLevelControlPropertyScalarValue见 AudioLevelControl.cslc.Element标识该控件对应的通道元素据此可以仅对特定声道例如只降低左声道进行调节设备也提供ConstructControlListChangedEvent()等方法用于监听控制列表变化见 AudioDevice.cs适合实现音量面板的实时刷新。播放器其他实用能力一览CoreAudioPlayer除播放与音量控制外还实现了 NAudio 的若干标准接口见 CoreAudioPlayer.BaseAPI.cs接口 / 能力说明IWavePlayer提供Init、Play、Pause、Stop、PlaybackState、PlaybackStopped等标准播放契约IWaveLatencyAverageLatency由设备输出延迟与所选数据源的流延迟相加求得CurrentLatency优先根据 I/O 回调中的采样时间/主机时间戳实时计算时间戳无效时回退到AverageLatency见 CoreAudioPlayer.IOProcedureBase.csIWavePositionGetPosition()返回累计播放字节数暂停时记账、停止时清零语义与WaveOut的waveOutReset/waveOutPause对齐见 CoreAudioPlayer.BaseAPI.csOutputWaveFormat返回当前实际交付给 HAL 的虚拟格式含重采样后的目标格式IAsyncDisposableDisposeAsync()将线程安全的Dispose()调度到线程池执行其中PlaybackStopped事件的派发遵循创建播放器时的SynchronizationContext若创建线程存在同步上下文如 UI 线程事件会投递回该上下文执行避免在 HAL I/O 线程上直接回调用户代码见 CoreAudioPlayer.BaseAPI.cs。数据流向与 I/O 过程原理源码级为了更深入理解CoreAudioPlayer这里梳理其数据管线对应源码文件见 src/NAudio.MacOS/Wave/ 下的CoreAudioPlayer.*.csIWaveProvider │ ProviderFormatMatchesPlayerFormat 判定是否匹配 HAL 虚拟格式 ▼ RawSource格式匹配直接拷贝 │ 或 ResamplerSource格式不匹配经 LowLevelAudioConverter 重采样/声道转换 ▼ PlayerProcedureCoreAudioIOProcedure 子类HAL I/O 回调 ├── InterleavedProcedure交错布局只填充 EnabledBufferIndex 指定的缓冲 └── NonInterleavedProcedure非交错布局先读入临时交错缓冲再按通道拆写 ▼ HAL AudioBufferList → 音频设备两个 I/O 过程实现各有讲究InterleavedProcedure会完整填满分配给它的 HAL 缓冲循环读取直到缓冲耗尽且只写入EnabledBufferIndex指定的那一个缓冲——因为输出AudioBufferList中每个设备流都有一个缓冲禁用流对应的缓冲会被 HAL 丢弃若全部填充会造成数据源被多次消费见 CoreAudioPlayer.InterleavedProcedure.csNonInterleavedProcedure按每帧通道字节数 × 通道数的步长把交错的中间缓冲数据拆解写入各通道缓冲并自动扩容临时缓冲见 CoreAudioPlayer.NonInterleavedProcedure.cs基类PlayerProcedure在源数据耗尽后不会立即停止而是等到下一个 I/O 周期再停确保 HAL 已消费完缓冲中最后的数据避免截断见 CoreAudioPlayer.IOProcedureBase.cs。常见问题与最佳实践小结找不到 NAudio.MacOS 包该包仅以预发布版本发布dotnet add package必须带--prerelease。播放无声或采样率不对无需自行重采样——播放器会根据 HAL 虚拟格式自动插入LowLevelAudioConverter请勿在 provider 侧重复重采样避免双重转换带来的音质损耗。想控制音量但不想动系统音量使用VolumeSampleProvider做软件增益CoreAudioPlayer.Volume只应在明确需要修改硬件音量时才使用。监听播放结束/异常订阅PlaybackStopped并检查StoppedEventArgs.Exception事件在存在同步上下文时会回投到创建线程派发。设备被拔出怎么办播放器会通过PlaybackStopped携带CoreAudioExceptionkAudioHardwareBadDeviceError通知你此时应释放旧实例并重新枚举设备重建播放器。多设备选择结合AudioSystemObject.Instance.Devices、DeviceUID与ConvertUIDToDevice可以在启动时记住用户选择的设备 UID下次直接解析并传入构造函数从而支持隐藏设备。延伸阅读PlayAudioFileMacOS.md本文对应的原始文档src/NAudio.MacOS/README.mdNAudio.MacOS包的能力边界与预发布状态说明CoreAudioPlayer.BaseAPI.cs播放器公开 API、音量与状态管理实现CoreAudioPlayer.InitAPI.cs格式匹配、重采样决策与自愈逻辑CoreAudioPlayerTests.cs多格式播放与虚拟格式变更压力测试PlayAudioFileLinuxAlsa.md 与 PlayAudioFileMacOS.md 对应的其他平台播放指南可作横向对比Linux 侧对应NAudio.Alsa包的AlsaOut。赞分享音视频音频处理【免费下载链接】NAudioAudio and MIDI library for .NET项目地址https://gitcode.com/gh_mirrors/na/NAudio点击查看免费下载相关推荐使用 NAudio.MacOS 的 Extended Audio File Services 读取音频文件macOS 解码与播放实战使用 NAudio.MacOS 的 Extended Audio File Services 读取音频文件macOS 解码与播放实战 导读 本文讲解 NAu音视频音频处理Vue Audio Player 音频播放器组件完整指南Vue Audio Player 音频播放器组件完整指南 Vue Audio Player 是一个轻量级且功能丰富的 Vue.js 组件专为满足PC和移动端音NAudio 3 的 macOS 原生音频封装架构解析Core Audio HAL 播放录制与 Audio Toolbox 重采样与文件读写设计NAudio 3 的 macOS 原生音频封装架构解析Core Audio HAL 播放录制与 Audio Toolbox 重采样与文件读写设计 NAudio音视频音频处理上一篇如何在3个步骤内将PixelCNN扩展到自定义数据集图像生成模型完整适配指南下一篇Morphic性能瓶颈分析数据库查询与API请求优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Pony 编译器 0.39.1 版本修复详解:类型参数引用、Windows 管道与部分函数字面量推断

Pony 编译器 0.39.1 版本修复详解:类型参数引用、Windows 管道与部分函数字面量推断

编程语言编译器语言运行时 【免费下载链接】ponyc Pony is an open-source, actor-model, capabilities-secure, high performance programming language 项目地址: https://gitcode.com/gh_mirrors/po/ponyc 点击查看 免费下载 本篇文章围绕 Pony 语言编译器 pony…

2026/10/10 8:20:51 阅读更多 →
Zotero PDF2zh 翻译服务 extraData 额外字段配置完全指南:从插件传参到 Server 底层执行机制

Zotero PDF2zh 翻译服务 extraData 额外字段配置完全指南:从插件传参到 Server 底层执行机制

人工智能AI 应用 【免费下载链接】zotero-pdf2zh PDF2zh for Zotero | Zotero PDF中文翻译插件 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf2zh 点击查看 免费下载 在 Zotero PDF2zh 中,每个 LLM 翻译服务(OpenAI、DeepSeek、O…

2026/10/10 8:20:51 阅读更多 →
NYU-DLSP20 第10周笔记(意大利语版)的意译与校对 —— 第10周第2部分:自监督学习与对比学习(ClusterFit 与 PIRL)

NYU-DLSP20 第10周笔记(意大利语版)的意译与校对 —— 第10周第2部分:自监督学习与对比学习(ClusterFit 与 PIRL)

示例工程 【免费下载链接】NYU-DLSP20 NYU Deep Learning Spring 2020 项目地址: https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning 点击查看 免费下载 意大利语版文档核心内容与要点 本节是第10周“自监督学习”讲座的第2部分(B部分&#x…

2026/10/10 8:20:50 阅读更多 →

最新新闻

gPROMS二次开发教程(06):MODEL 语言精讲(二)——数组、并行结构与层次化模型

gPROMS二次开发教程(06):MODEL 语言精讲(二)——数组、并行结构与层次化模型

gPROMS二次开发教程(06):MODEL 语言精讲(二)——数组、并行结构与层次化模型版本声明块 工具/软件:gPROMS 桌面建模环境 gPROMS ModelBuilder;检索期官方发布锚点 gPROMS Process 2022.1.0&…

2026/10/10 9:07:47 阅读更多 →
解读学习网络数据安全风险评估解决方案

解读学习网络数据安全风险评估解决方案

本 66 页 PPT 适配数据安全合规、第三方风险评估咨询方案编制,紧扣《网络数据安全风险评估办法》与 GB/T45577‑2025 最新国标要求。梳理法规政策演进,明确强制与鼓励评估适用场景,输出评估准备、调研、识别、分析评价、总结五阶段标准化流程…

2026/10/10 9:07:47 阅读更多 →
gPROMS二次开发教程(03):第一个模型——把一台 CSTR 写成 gPROMS 能解的方程组

gPROMS二次开发教程(03):第一个模型——把一台 CSTR 写成 gPROMS 能解的方程组

gPROMS二次开发教程(03):第一个模型——把一台 CSTR 写成 gPROMS 能解的方程组版本声明块 工具/软件:gPROMS 桌面建模环境 gPROMS ModelBuilder;检索期官方发布锚点 gPROMS Process 2022.1.0,适用版本以官方…

2026/10/10 9:07:47 阅读更多 →
设计暴雨与设计洪水计算软件:矢量数据解析与模型集成全流程

设计暴雨与设计洪水计算软件:矢量数据解析与模型集成全流程

1. 项目定位:为什么设计暴雨计算要落地成客户端做水文计算的工程师大概都有过这样的体会:拿到一个防洪评价项目,方案本身不难,真正磨人的是数据。一个项目下来,流域边界是业主给的DWG,河网是另一个人从遥感…

2026/10/10 9:07:47 阅读更多 →
LeetCode 447 回旋镖的数量:用哈希表按距离统计组合数(宫水三叶刷题日记题解详解)

LeetCode 447 回旋镖的数量:用哈希表按距离统计组合数(宫水三叶刷题日记题解详解)

教程文档 【免费下载链接】LogicStack-LeetCode 公众号「宫水三叶的刷题日记」刷穿 LeetCode 系列文章源码 项目地址: https://gitcode.com/gh_mirrors/lo/LogicStack-LeetCode 点击查看 免费下载 本篇技术指南以「宫水三叶的刷题日记」系列中的 447. 回旋镖的数量…

2026/10/10 9:07:47 阅读更多 →
基于 GSAP 重建 Aura 流体拖拽交互演示:从 Prompt 到源码级实现指南

基于 GSAP 重建 Aura 流体拖拽交互演示:从 Prompt 到源码级实现指南

【免费下载链接】Skills Agent skills for designers and builders using Codex, Claude, Cursor, and other AI coding agents 项目地址: https://gitcode.com/gh_mirrors/skills48/Skills 点击查看 免费下载 导读 本文以仓库中 gsap 技能 的演示提示词文档 PROM…

2026/10/10 9:06:46 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →