200字
windown下使用多核cpu加速m3u8切片
2026-01-14
2026-01-15

如果您觉得画质损失明显,但又不想速度慢太多,我建议您ultrafast(最快)和 medium(默认)之间寻找一个平衡点

推荐方案:画质与速度的“黄金平衡点”

对于您拥有 64 核 CPU 的强大配置,我强烈建议使用 superfastveryfast

  • 速度:依然非常快(比 ultrafast 稍慢一点点,但在多核 CPU 上几乎感觉不到)。

  • 画质:会有显著提升,消除了大部分“马赛克”和“噪点”。

方案 A:使用 superfast(推荐)

ffmpeg -threads 0 -i "C:\Users\yangy\Videos\屏幕录制\屏幕录制 2024-11-03 202526.mp4" -c:v libx264 -preset superfast -tune zerolatency -threads 8 -c:a aac -ac 2 -ar 48000 -f hls -hls_time 5 -hls_list_size 0 -hls_segment_type mpegts -hls_flags independent_segments -hls_segment_filename "C:\Users\yangy\Videos\屏幕录制\out\segment_%03d.ts" "C:\Users\yangy\Videos\屏幕录制\out\playlist.m3u8"

*(只改了 -preset ultrafast-preset superfast)*

方案 B:使用 veryfast(画质更好)

如果方案 A 的画质您还是觉得不够清晰,请用这个:

ffmpeg -threads 0 -i "C:\Users\yangy\Videos\屏幕录制\屏幕录制 2024-11-03 202526.mp4" -c:v libx264 -preset veryfast -tune zerolatency -threads 8 -c:a aac -ac 2 -ar 48000 -f hls -hls_time 5 -hls_list_size 0 -hls_segment_type mpegts -hls_flags independent_segments -hls_segment_filename "C:\Users\yangy\Videos\屏幕录制\out\segment_%03d.ts" "C:\Users\yangy\Videos\屏幕录制\out\playlist.m3u8"

*(只改了 -preset ultrafast-preset veryfast)*

进阶:如果必须保留原画质(无损/接近无损)-hls_list_siz

1. 全局与输入参数

  • -threads 0(第一个)

    • 位置:紧跟在 ffmpeg 之后,在 -i 之前。

    • 作用:设置全局线程数。0 表示自动检测,让 FFmpeg 自动根据您的 CPU 核心数(比如您的 64 核)来分配线程用于文件的读取、解封装和解码。这是开启多线程处理的第一步。

2. 输入文件

  • -i "..."

    • 作用:指定输入视频文件的路径。

3. 视频编码参数 (-c:v 部分)

  • -c:v libx264

    • 作用:指定视频编码器为 libx264(即 H.264 格式)。这是目前兼容性最好的编码格式。

  • -preset ultrafast

    • 作用:设置编码预设为“极速”。

    • 原理ultrafast 关闭了几乎所有耗时的高级压缩算法(如多参考帧、复杂的熵编码等)。

    • 效果:编码速度极快,CPU 占用低,但代价是生成的文件体积会稍大一些。对于追求速度的场景,这是首选。

  • -tune zerolatency

    • 作用: tune 为“零延迟”。

    • 原理:优化编码器的决策过程,减少帧与帧之间的依赖等待。

    • 效果:进一步降低处理延迟,常用于直播或快速转码,防止画面出现卡顿或处理停滞。

  • -threads 8(第二个)

    • 作用:专门设置 libx264 编码器的线程数。

    • 为什么要设置:虽然前面全局设了 0,但对于 H.264 编码来说,线程数并不是越多越好。过多的线程会导致线程间通信开销巨大,反而降低速度。对于 64 核 CPU,通常将每个编码任务的线程限制在 6-12 之间效率最高。这里设为 8,既能利用多核,又避免了资源争抢。

4. 音频编码参数 (-c:a 部分)

  • -c:a aac

    • 作用:指定音频编码器为 AAC(高级音频编码),这是 HLS 标准通用的音频格式。

  • -ac 2

    • 作用:强制设置输出音频的声道数为 2(立体声)。

    • 目的:防止源文件如果有 5.1 或 7.1 声道导致处理变慢,统一转换为立体声可以加速处理。

  • -ar 48000

    • 作用:强制设置音频采样率为 48000 Hz。

    • 目的:统一采样率可以减少 FFmpeg 重采样的计算量,提高处理速度。

5. 格式与封装参数 (-f hls 部分)

  • -f hls

    • 作用:指定输出格式为 HLS(HTTP Live Streaming),即生成 .m3u8.ts 切片文件。

  • -hls_time 5

    • 作用:设置每个视频切片(.ts 文件)的目标时长为 5 秒

    • 注意:实际切片时长可能会根据关键帧的位置稍微浮动。

  • -hls_list_size 0

    • 作用:设置播放列表(.m3u8 文件)中保留的切片数量。

    • 含义0 表示保留所有切片。如果不设为 0,FFmpeg 可能会删除旧的切片文件(用于直播场景),而我们需要的是完整保存。

  • -hls_segment_type mpegts

    • 作用:明确指定切片的封装格式为 MPEG-TS。

    • 目的:虽然这是默认值,但明确写出可以防止 FFmpeg 尝试使用 fMP4(基于 MP4 的切片),后者在某些旧播放器或浏览器上兼容性不如 TS 好,且处理起来可能更繁琐。

  • -hls_flags independent_segments

    • 作用:设置切片标志为“独立片段”。

    • 原理:它会在切片中添加额外的信息,使得每个切片都可以独立解码,不依赖前一个切片的数据(如移除运动矢量预测)。

    • 效果

      1. 加载更快:播放器拖动进度条时,可以直接定位到任意切片,无需加载前一个切片的数据。

      2. 稳定性:在某些多线程或高并发处理场景下,能减少切片出错或数据溢出的风险(即解决您之前遇到的 “Result too large” 错误)。

6. 输出文件名

  • -hls_segment_filename "...\segment_%03d.ts"

    • 作用:指定切片文件的保存路径和命名规则。

    • %03d:这是占位符,表示用 3 位数字来编号(例如 segment_000.ts, segment_001.ts …)。

  • "...\playlist.m3u8"

    • 作用:最终的索引文件路径。播放器实际上打开的是这个文件,它里面记录了所有 .ts 切片的地址。

总结

这条命令的设计逻辑是:

  1. 全局线程自动调度 (-threads 0)。

  2. 视频编码极简快速 (ultrafast + 限制 8 线程)。

  3. 音频标准化 (双声道 + 48kHz) 以减少计算负担。

  4. 切片格式稳健 (independent_segments) 以防止大数据量处理崩溃。

这是一个在高配置机器(如您的 64 核 CPU)上运行既快又稳的黄金组合。

评论