FFmpeg中文语音自适应比特率编码实战:从原理到HLS流生成
在音视频处理项目中尤其是针对中文语音内容我们常常面临一个核心挑战如何在不同网络条件和设备性能下保证语音的清晰度与流畅度同时有效控制文件体积直接使用固定比特率CBR编码在弱网环境下容易卡顿而在良好网络下又浪费带宽。自适应比特率ABR编码技术正是解决这一痛点的关键。本文将手把手带你使用 FFmpeg 这一音视频处理的瑞士军刀实现一套针对中文语音的完整 ABR 编码实战方案。无论你是刚接触流媒体的新手还是希望优化现有语音服务质量的开发者都能从本文获得从原理到代码、从配置到排错的系统性知识。1. 背景与核心概念为什么中文语音需要ABR在深入实战之前我们有必要厘清几个核心概念理解 ABR 对于中文语音处理的特殊价值。1.1 固定比特率 vs. 自适应比特率固定比特率CBR在整个编码过程中比特率保持恒定。例如始终以 64kbps 的码率编码音频。优点是简单、文件大小可预测缺点是无法适应内容复杂度变化简单片段浪费码率复杂片段如多人激烈对话可能因码率不足而丢失细节导致清晰度下降。自适应比特率ABR编码器会根据音频信号的瞬时复杂度动态分配比特率。在静音或简单音节处使用低码率在复杂音节、爆破音或音调变化剧烈处使用高码率。在平均码率相同的情况下ABR 通常能获得比 CBR 更好的主观听感质量。对于中文语音其特性如四声音调、爆破音、齿音使得信号复杂度变化显著ABR 的优势尤为突出。1.2 ABR 与流媒体HLS/DASHABR 技术是现代流媒体如 HLS、DASH的基石。它允许服务器准备同一内容、不同码率如 32kbps, 64kbps, 128kbps的多个版本称为“码率阶梯”。播放器会根据当前网络带宽和设备性能自动选择最合适的码率片段进行播放从而实现无缝的清晰度切换避免缓冲。我们的实战目标就是使用 FFmpeg 生成适用于 HLS/DASH 流媒体的、多码率的中文语音音频流。1.3 关键编码器AAC与Libopus针对语音编码最常用的两种编码器是AACAdvanced Audio Coding应用极广兼容性极佳是 HLS 流媒体的标准音频编码格式。其aac编码器支持 ABR 模式。Opus由 IETF 制定特别针对语音和通用音频优化在低码率下语音清晰度通常优于 AAC。WebRTC 标准强制使用 Opus。FFmpeg 通过libopus库支持。本文将重点演示 AAC 编码器的 ABR 应用因为它是流媒体领域的“通用货币”。2. 环境准备与 FFmpeg 安装工欲善其事必先利其器。首先确保你的系统上安装了功能完整的 FFmpeg。2.1 安装 FFmpeg对于 Ubuntu/Debiansudo apt update sudo apt install ffmpeg对于 CentOS/RHELsudo yum install epel-release sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm sudo yum install ffmpeg ffmpeg-devel对于 macOS使用 Homebrewbrew install ffmpeg对于 Windows访问 FFmpeg 官方下载页面 。选择 “Windows builds from gyan.dev” 或 “BtbN” 提供的编译版本。下载解压后将bin目录路径如C:\ffmpeg\bin添加到系统的PATH环境变量中。2.2 验证安装及关键编码器安装完成后在终端或命令提示符中输入以下命令验证ffmpeg -version此命令会输出 FFmpeg 版本、配置选项和库的版本。请确保输出中包含--enable-libaac或--enable-libfdk-aac如果使用 Fraunhofer AAC 编码器质量更好以及--enable-libopus。同时检查 AAC 编码器是否支持aac编码器软件编码ffmpeg -encoders | grep aac如果看到A... aac说明可用。2.3 准备示例语音文件你需要一个中文语音的源文件进行测试。可以是一个.wav无损推荐、.mp3或.m4a文件。本文假设你有一个名为chinese_speech.wav的源文件。如果没有可以使用以下命令从视频中提取音频或生成一个测试音# 从视频提取音频 ffmpeg -i input_video.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 chinese_speech.wav # 生成一段简单的测试语音需要 macOS say 命令或类似工具 # say -v Ting-Ting 这是一段用于测试自适应比特率编码的中文语音 --data-formatLEF3244100 -o test.wav3. 核心原理与 FFmpeg ABR 参数详解FFmpeg 的aac编码器通过-b:a音频比特率参数并结合-aac_coder等参数来实现 ABR。3.1 ABR 相关参数解析-b:a或-ab指定目标平均比特率。这是 ABR 控制的核心。例如-b:a 64k表示目标平均码率为 64 kbps。-aac_coder指定 AAC 编码器内部使用的算法。对于 ABR重要的值是twoloop默认值。使用双循环编码在质量和码率控制之间取得较好平衡支持 ABR。anmr另一种速率控制方法。fast快速编码但码率控制可能不精确。要实现有效的 ABR请确保使用twoloop默认即可。-profile:a指定 AAC 音频配置文件。常用aac_lowLC低复杂度兼容性最好。-cutoff设置截止频率可以过滤掉人耳不敏感的高频在低码率下节省带宽。对于语音设置为1400014kHz通常足够。3.2 单文件 ABR 编码示例我们先对一个单独的音频文件进行 ABR 编码这是生成流媒体多码率版本的基础步骤。目标将chinese_speech.wav编码为平均码率 64kbps 的 AAC 文件。ffmpeg -i chinese_speech.wav -c:a aac -b:a 64k -aac_coder twoloop -profile:a aac_low -cutoff 14000 -movflags faststart output_abr_64k.aac参数解释-i chinese_speech.wav输入文件。-c:a aac指定音频编码器为 AAC。-b:a 64k目标平均比特率 64 kbps。-aac_coder twoloop使用支持 ABR 的编码算法显式指定确保行为。-profile:a aac_low使用 AAC-LC 配置文件兼容性最佳。-cutoff 14000限制带宽至 14kHz针对语音优化。-movflags faststart将元数据移动到文件开头便于网络流式播放。output_abr_64k.aac输出文件。你可以通过ffprobe检查输出文件的平均码率ffprobe -v error -show_entries formatbit_rate -of defaultnoprint_wrappers1:nokey1 output_abr_64k.aac输出应接近64000。4. 完整实战生成 HLS 自适应比特率语音流HLSHTTP Live Streaming是苹果公司提出的流媒体协议现在已被广泛支持。我们将创建包含三个码率32k 64k 128k的 ABR 语音流。4.1 项目结构准备创建一个工作目录并准备好源文件。mkdir hls_audio_abr cd hls_audio_abr cp /path/to/your/chinese_speech.wav .4.2 分步编码与切片HLS 要求将音频流切割成一系列小的.ts传输流文件并由一个.m3u8播放列表索引。我们将使用ffmpeg一条命令同时生成三个码率的流和主播放列表。这是最有效率的方式。ffmpeg -i chinese_speech.wav \ -map 0:a:0 -c:a aac -b:a 32k -aac_coder twoloop -profile:a aac_low -cutoff 12000 -hls_time 6 -hls_playlist_type vod -hls_segment_filename stream_32k_%03d.ts -f hls stream_32k.m3u8 \ -map 0:a:0 -c:a aac -b:a 64k -aac_coder twoloop -profile:a aac_low -cutoff 14000 -hls_time 6 -hls_playlist_type vod -hls_segment_filename stream_64k_%03d.ts -f hls stream_64k.m3u8 \ -map 0:a:0 -c:a aac -b:a 128k -aac_coder twoloop -profile:a aac_low -cutoff 18000 -hls_time 6 -hls_playlist_type vod -hls_segment_filename stream_128k_%03d.ts -f hls stream_128k.m3u8关键参数解释针对每一条流-map 0:a:0从输入文件0中选择第一个音频流a:0。确保只处理音频。-c:a aac -b:a ...指定编码器和目标平均码率。-cutoff根据码率调整带宽。低码率32k用更严格的过滤12kHz高码率128k可以保留更多高频18kHz。-hls_time 6每个.ts切片的目标时长是 6 秒。-hls_playlist_type vod表示这是点播Video on Demand内容播放列表将是静态的。-hls_segment_filename “stream_XXk_%03d.ts”定义切片文件的命名模式。%03d会被替换为序号001 002...。-f hls指定输出格式为 HLS。stream_XXk.m3u8该码率对应的播放列表文件。运行后你会得到stream_32k.m3u8stream_64k.m3u8stream_128k.m3u8以及一堆.ts切片文件。4.3 创建主播放列表Master Playlist主播放列表master.m3u8用于告诉播放器有哪些可用的码率版本及其信息。我们需要手动或通过工具创建它。创建一个名为master.m3u8的文本文件内容如下#EXTM3U #EXT-X-VERSION:3 #EXT-X-STREAM-INF:BANDWIDTH32000,CODECSmp4a.40.2 stream_32k.m3u8 #EXT-X-STREAM-INF:BANDWIDTH64000,CODECSmp4a.40.2 stream_64k.m3u8 #EXT-X-STREAM-INF:BANDWIDTH128000,CODECSmp4a.40.2 stream_128k.m3u8参数解释#EXTM3UM3U 文件头。#EXT-X-VERSION:3HLS 协议版本。#EXT-X-STREAM-INF描述一个变体流Variant Stream。BANDWIDTH该流的峰值比特率单位比特/秒。这里我们近似使用平均码率值32k - 32000。CODECS编解码器信息。mp4a.40.2对应 AAC-LC 格式。最后一行是子播放列表文件的路径。4.4 最终文件结构与验证完成后的目录结构应类似于hls_audio_abr/ ├── chinese_speech.wav # 源文件 ├── master.m3u8 # 主播放列表 ├── stream_32k.m3u8 # 32k码率播放列表 ├── stream_64k.m3u8 # 64k码率播放列表 ├── stream_128k.m3u8 # 128k码率播放列表 ├── stream_32k_001.ts # 32k码率切片文件 ├── stream_32k_002.ts ├── ... ├── stream_64k_001.ts ├── ... └── stream_128k_00N.ts验证你可以使用 VLC 播放器直接打开master.m3u8文件。在播放时通过工具 - 媒体信息 - 编解码器选项卡可以看到正在播放的流信息。在网络条件变化时或手动在 VLC 的“视频-轨道”中选择不同比特率的音频轨道播放器应能自动或手动切换不同码率的流。5. 常见问题与排查思路在实际操作中你可能会遇到以下问题问题现象可能原因排查思路与解决方案错误Unrecognized option ‘-aac_coder’FFmpeg 编译时未包含aac编码器或版本过旧。1. 运行 ffmpeg -encoders生成的.ts文件没有声音或播放异常编码参数不兼容或切片问题。1. 检查源文件是否有音频流ffprobe chinese_speech.wav。2. 尝试简化命令先不加-cutoff和-profile参数生成一个码率版本测试。3. 确保-map 0:a:0正确映射了音频流。对于纯音频输入有时直接用-c:a aac即可。HLS 播放列表无法播放或切换主播放列表BANDWIDTH值错误或路径不对。1. 用ffprobe检查每个stream_xxk.m3u8对应的第一个.ts文件的实际码率ffprobe -show_entries formatbit_rate stream_64k_001.ts。2. 将master.m3u8中的BANDWIDTH值设置为略高于ffprobe查出的值例如64k码率文件显示为 66000则设置为 70000。3. 确保所有.m3u8和.ts文件在同一目录或主播放列表中的路径正确。中文语音在低码率下听起来“闷”或不清楚截止频率 (-cutoff) 设置过低或编码器在低码率下性能不足。1. 尝试提高低码率版本的-cutoff如从 12k 提到 14k。2. 考虑使用专为语音优化的编码器Opus。将-c:a aac替换为-c:a libopus -b:a 32k。Opus 在 24k-32k 码率下对语音的保留通常优于 AAC。3. 适当提高目标平均码率。命令执行时间过长同时编码多个码率流对 CPU 压力大。1. 如果源文件是 WAV 等无损格式可以先将其转码为一个高质量的中间格式如-c:a aac -b:a 256k然后以此中间文件为输入分别生成低码率版本减轻解码压力。2. 使用-threads参数指定 FFmpeg 使用的线程数如-threads 2。6. 进阶优化与最佳实践掌握了基础操作后以下实践能让你的 ABR 语音流更专业、更高效。6.1 使用更高质量的 AAC 编码器libfdk_aac如果您的 FFmpeg 编译时支持libfdk_aac通常需要自行编译它的编码质量通常优于内置的aac编码器。# 检查是否支持 ffmpeg -encoders | grep fdk # 使用 libfdk_aac 进行编码 ffmpeg -i input.wav -c:a libfdk_aac -b:a 64k -profile:a aac_low -cutoff 14000 output.m4a注意libfdk_aac的许可证Fraunhofer FDK AAC与 GPL 不兼容因此在许多预编译的 FFmpeg 包中可能未包含。商业使用需留意许可证问题。6.2 针对语音的 Opus 编码方案对于对兼容性要求不高如 WebRTC、内部应用但极度追求低码率下语音质量的场景Opus 是绝佳选择。# 生成单文件 Opus ABR 编码 ffmpeg -i chinese_speech.wav -c:a libopus -b:a 32k -vbr on -compression_level 10 -application voip output_32k.opus # 生成 HLS 流 (需注意HLS 标准对 Opus 支持较新播放器兼容性需测试) ffmpeg -i chinese_speech.wav -c:a libopus -b:a 32k -application voip -f hls ...-vbr on开启可变比特率VBROpus 本身是高度自适应的。-application voip明确告诉编码器这是语音内容优化编码参数。-compression_level压缩级别0-10越高编码越慢质量可能更好。6.3 自动化脚本与生产环境考虑在生产环境中你需要一个自动化脚本来处理批量文件。#!/bin/bash # encode_audio_abr.sh INPUT_FILE$1 OUTPUT_DIR$2 BASE_NAME$(basename $INPUT_FILE .wav) mkdir -p $OUTPUT_DIR BITRATES(32k 64k 128k) CUTOFFS(12000 14000 18000) for i in ${!BITRATES[]}; do BR${BITRATES[$i]} CF${CUTOFFS[$i]} ffmpeg -i $INPUT_FILE -map 0:a:0 -c:a aac -b:a $BR -aac_coder twoloop -cutoff $CF \ -hls_time 6 -hls_playlist_type vod \ -hls_segment_filename $OUTPUT_DIR/${BASE_NAME}_${BR}_%03d.ts \ -f hls $OUTPUT_DIR/${BASE_NAME}_${BR}.m3u8 done # 然后调用另一个脚本或函数生成 master.m3u8生产环境要点版本管理将 FFmpeg 版本固定避免不同服务器编码结果不一致。错误处理在脚本中添加-nostdin -y参数自动覆盖输出文件非交互模式并检查命令返回值。日志与监控记录编码任务的开始、结束时间、耗时及状态。存储与CDN生成的.ts和.m3u8文件应放置在 Web 服务器或 CDN 上并正确配置 MIME 类型application/vnd.apple.mpegurl用于.m3u8video/MP2T用于.ts。6.4 音频预处理优化在编码前对语音进行预处理可以提升最终效果标准化/压缩使用loudnorm过滤器进行响度标准化使不同语音文件的音量一致。ffmpeg -i input.wav -af loudnormI-16:LRA11:TP-1.5 print_formatjson -f null -此命令先分析音频获取参数第二遍再用参数进行标准化处理降噪对于有环境噪声的录音可以使用afftdn等过滤器进行降噪处理。通过本文的梳理你应该已经掌握了使用 FFmpeg 为中文语音实现自适应比特率编码的完整流程。从理解 ABR 的原理和价值到安装配置 FFmpeg 环境再到详细解析编码参数并完成 HLS 流的多码率生成最后涵盖了常见问题的排查和面向生产的优化建议。这套方法不仅适用于语音点播其核心思想同样可以扩展至视频 ABR 编码、直播转码等更复杂的场景。建议你亲手操作一遍并根据自己的业务数据如主流用户网络状况调整码率阶梯找到清晰度与流畅度的最佳平衡点。

相关新闻

Claude Code MCP升级:AI智能体连接本地开发工具实战指南

Claude Code MCP升级:AI智能体连接本地开发工具实战指南

这次我们来看 Claude Code 的 MCP 升级。这不是一次简单的功能更新,而是 Claude 在开发者工具领域的一次大规模能力跃进。根据官方数据,其月下载量已突破 4 亿次,这背后是 MCP 协议带来的连接能力爆发。简单说,Claude Code 通过 M…

2026/10/17 16:26:40 阅读更多 →
揭秘即墨网站建设哪家好:从避坑指南到实战攻略,手把手教你找到最懂你的设计团队

揭秘即墨网站建设哪家好:从避坑指南到实战攻略,手把手教你找到最懂你的设计团队

最近总有朋友在后台问我:“老板,我想做一个网站,可是即墨这个地方找了好几家,报价千差万别,功能也看不懂,到底即墨网站建设哪家好啊?”这句话,听得我心里既是无奈又是着急。无奈是因为很多老板在选服务商的时候,容易被那些花里胡哨的案例迷了眼,最后要么预算超支,要…

2026/10/15 12:38:23 阅读更多 →
电力场景输电线缆绝缘导线有皮电线缺陷检测数据集VOC+YOLO格式1998张1类别

电力场景输电线缆绝缘导线有皮电线缺陷检测数据集VOC+YOLO格式1998张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1998标注数量(xml文件个数):1998标注数量(txt文件个数):1998标注类别…

2026/10/15 1:32:03 阅读更多 →

最新新闻

基于深度学习的目标检测道路坑洼识别:YOLOv8训练与部署实践

基于深度学习的目标检测道路坑洼识别:YOLOv8训练与部署实践

毕业设计选“基于深度学习的道路坑洼识别”这个方向的同学,最近明显多了起来。原因不难理解:既能用到Python、深度学习、图像识别这些当下最热的技术词汇,又有一个清晰可落地的应用场景,数据也相对容易获取。但真正动手做起来&…

2026/10/18 11:13:00 阅读更多 →
机器学习与深度学习道路坑洼识别:从数据集到部署的完整实践指南

机器学习与深度学习道路坑洼识别:从数据集到部署的完整实践指南

在开始写之前,我先说句题外话。每年这个时间,都有很多同学在课程设计和毕业设计的选题边缘反复横跳,既想找个有区分度的方向,又怕最后做不出来。道路坑洼识别这个题目,说实话,方向是好的——机器学习和深度…

2026/10/18 11:13:00 阅读更多 →
2026年AI接口聚合服务实力横评:词元之河与硅基流动稳定性对比

2026年AI接口聚合服务实力横评:词元之河与硅基流动稳定性对比

这轮横评的方法论先交代清楚:七十二小时连续压测、十二类典型调用场景模拟,再叠加对三十七位一线开发者的访谈,围绕协议兼容、稳定性、成本透明、密钥治理等八项指标逐一打分。行业背景也不容忽视——《中国AI基础设施白皮书》的调研显示&…

2026/10/18 11:13:00 阅读更多 →
MySQL 8.0免安装版配置指南:从解压到多实例部署

MySQL 8.0免安装版配置指南:从解压到多实例部署

简介:这是一份面向后端开发、运维及数据库初学者的 MySQL 8.0 免安装绿色版资源,主打解压即用,无需繁琐的安装与初始化流程,适合需要快速搭建本地测试环境、临时验证 SQL 语句或学习数据库原理的场景。压缩包共 420 个文件&#x…

2026/10/18 11:13:00 阅读更多 →
AI辅助教材写作如何降低查重率?五个阶段实操指南

AI辅助教材写作如何降低查重率?五个阶段实操指南

1. 先别急着让AI“写”,先搞清楚查重系统到底在“查”什么干过教材编写的人应该都有同感:最让人头疼的不是“没内容可写”,而是辛辛苦苦熬了几个通宵弄出来的稿子,往查重系统里一丢,重复率直接飙到百分之三四十。这时候…

2026/10/18 11:13:00 阅读更多 →
虚拟专题:联邦学习 | 基于 TaoToken 统一 API 通道的联邦学习研究综述与工程落地指南

虚拟专题:联邦学习 | 基于 TaoToken 统一 API 通道的联邦学习研究综述与工程落地指南

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

2026/10/18 11:12:00 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →