如果您觉得画质损失明显,但又不想速度慢太多,我建议您在 ultrafast(最快)和 medium(默认)之间寻找一个平衡点。
推荐方案:画质与速度的“黄金平衡点”
对于您拥有 64 核 CPU 的强大配置,我强烈建议使用 superfast 或 veryfast。
速度:依然非常快(比
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作用:设置切片标志为“独立片段”。
原理:它会在切片中添加额外的信息,使得每个切片都可以独立解码,不依赖前一个切片的数据(如移除运动矢量预测)。
效果:
加载更快:播放器拖动进度条时,可以直接定位到任意切片,无需加载前一个切片的数据。
稳定性:在某些多线程或高并发处理场景下,能减少切片出错或数据溢出的风险(即解决您之前遇到的 “Result too large” 错误)。
6. 输出文件名
-hls_segment_filename "...\segment_%03d.ts"作用:指定切片文件的保存路径和命名规则。
%03d:这是占位符,表示用 3 位数字来编号(例如segment_000.ts,segment_001.ts…)。
"...\playlist.m3u8"作用:最终的索引文件路径。播放器实际上打开的是这个文件,它里面记录了所有
.ts切片的地址。
总结
这条命令的设计逻辑是:
全局线程自动调度 (
-threads 0)。视频编码极简快速 (
ultrafast+ 限制 8 线程)。音频标准化 (双声道 + 48kHz) 以减少计算负担。
切片格式稳健 (
independent_segments) 以防止大数据量处理崩溃。
这是一个在高配置机器(如您的 64 核 CPU)上运行既快又稳的黄金组合。