核心内容概述
本文将在 openEuler 22.03 LTS 操作系统上部署 FFmpeg 多媒体处理框架,并进行深度的视频转码 CPU 性能评测。评测将重点关注不同编码器(H.264/H.265)、不同分辨率(1080p/4K)以及多线程并发场景下的转码性能表现。通过系统化的基准测试,我们将分析 FFmpeg 在 openEuler 环境下的 CPU 利用率、转码速度、资源消耗等关键指标,为企业级视频处理应用提供性能参考依据。测试将涵盖单文件高质量转码、批量转码、实时转码等实际应用场景,全面评估 openEuler 系统在视频处理领域的性能表现。
测试环境配置
本次评测采用华为云通用计算增强型 c6.2xlarge.4 实例,该实例专为计算密集型应用优化,具备以下硬件配置:
- CPU:16 核心(Intel Xeon)
- 内存:32 GB DDR4
- 存储:80 GB 通用型 SSD(提供稳定的 I/O 性能)
- 操作系统:openEuler 22.03 LTS
- 网络:华为云 VPC 网络环境
该配置能够充分发挥多核心并行处理优势,16 核心的配置对于视频转码这类 CPU 密集型任务具有良好的性能表现,32GB 内存足以支持 4K 视频的缓存处理需求。
![[图片]](https://i-blog.csdnimg.cn/direct/e5fdd83068f742909ae43a81effd5ec8.png)
一、FFmpeg 部署与环境准备
1.1 系统环境检查
首先检查系统版本和 CPU 信息,确认硬件资源:
说明:这一步骤用于确认系统环境符合测试要求。lscpu 命令可以显示 CPU 架构、核心数、线程数等关键信息,这些参数直接影响 FFmpeg 的多线程性能表现。
# 查看系统版本
cat /etc/os-release
# 查看 CPU 信息
lscpu | grep -E "Model name|CPU\(s\)|Thread|Core"
# 查看内存信息
free -h
# 查看磁盘信息
df -h
![[图片]](https://i-blog.csdnimg.cn/direct/943ef3ccbb394b6e9a2bedc4eae3ebb8.png)
1.2 安装 FFmpeg
openEuler 22.03 LTS 官方仓库提供了 FFmpeg 软件包,可以直接通过 yum 安装:
# 更新软件源
sudo yum update -y
# 安装 FFmpeg 及相关依赖
sudo yum install -y ffmpeg ffmpeg-devel
# 验证安装
ffmpeg -version
说明:FFmpeg 是一个开源的多媒体处理框架,支持几乎所有的音视频格式。通过 yum 安装可以自动处理依赖关系,确保安装的版本与 openEuler 系统兼容。安装完成后,ffmpeg -version 命令会显示版本信息、编译配置和支持的编解码器列表。

1.3 安装性能监控工具
为了准确测量 CPU 性能,需要安装系统监控工具:
# 安装性能监控工具
sudo yum install -y sysstat htop
# 启动 sysstat 服务
sudo systemctl start sysstat
sudo systemctl enable sysstat
# 检查是否正在运行
sudo systemctl status sysstat
说明:sysstat 工具包含 mpstat、iostat 等命令,用于实时监控 CPU 使用率、I/O 性能等指标。htop 提供了直观的交互式进程监控界面,方便观察 FFmpeg 进程的资源占用情况。

1.4 准备测试视频素材
下载标准测试视频文件用于后续转码测试
# 创建测试目录
mkdir -p ~/ffmpeg-test/{input,output}
cd ~/ffmpeg-test/input
# 生成 1080p 测试视频(5分钟,H.264 编码)
ffmpeg -f lavfi -i "testsrc=s=1920x1080:r=30:duration=300" \
-f lavfi -i "sine=frequency=1000:duration=300" \
-filter_complex "\
[0:v]split=2[v1][v2];\
[v1]drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf:\
text='1080p Performance Test - Time\: %{pts\:hms}':x=(w-tw)/2:y=50:\
fontcolor=white:fontsize=48:box=1:boxcolor=black@0.7:boxborderw=5[txt];\
[v2]zoompan=z='min(zoom+0.001,1.3)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=1920x1080[zoom];\
[txt][zoom]blend=all_mode=overlay:all_opacity=0.7[outv]" \
-map "[outv]" -map 1:a \
-c:v libx264 -preset medium -crf 23 -profile:v high -level 4.1 \
-c:a aac -b:a 128k \
-pix_fmt yuv420p -movflags +faststart \
-t 300 -y test_1080p.mp4
# 生成 4K 测试视频(5分钟,H.264 编码)
ffmpeg -f lavfi -i "testsrc=s=3840x2160:r=30:duration=300" \
-f lavfi -i "sine=frequency=1000:duration=300" \
-filter_complex "\
[0:v]drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf:\
text='4K (3840x2160) Performance Test':x=(w-tw)/2:y=80:\
fontcolor=white:fontsize=96:box=1:boxcolor=black@0.7:boxborderw=10[txt1];\
[txt1]drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans.ttf:\
text='Frame\: %{frame_num} | Time\: %{pts\:hms}':x=(w-tw)/2:y=h-100:\
fontcolor=yellow:fontsize=64:box=1:boxcolor=black@0.7:boxborderw=8[outv]" \
-map "[outv]" -map 1:a \
-c:v libx264 -preset medium -crf 23 -profile:v high -level 5.1 \
-c:a aac -b:a 128k \
-pix_fmt yuv420p -movflags +faststart \
-t 300 -y test_4k.mp4
# 查看视频信息
ffprobe -v error -show_format -show_streams test_1080p.mp4

说明:testsrc 是 FFmpeg 内置的测试信号源,生成标准的彩色条纹图案,包含运动元素,适合用于编解码器性能测试。
二、性能测试方案设计
2.1 测试指标说明
本次评测将关注以下核心性能指标:
- 转码速度(FPS):每秒处理的帧数,数值越高表示转码速度越快
- 转码倍速(Speed):转码速度与视频实际播放速度的比值,例如 2.0x 表示转码速度是实时播放的 2 倍
- CPU 利用率:转码过程中 CPU 的平均使用率,反映多核心利用效率
- 内存占用:转码过程中的内存消耗峰值
- 转码时间:完成整个视频转码所需的总时间
说明:这些指标综合反映了 FFmpeg 在 openEuler 系统上的性能表现。转码速度和倍速直接影响用户体验,CPU 利用率体现了多核心并行效率,内存占用关系到系统资源规划。
2.2 测试场景设计
本次评测设计了 5 个专业测试场景:
| 测试编号 | 测试场景 | 输入格式 | 输出格式 | 测试目的 |
|---|---|---|---|---|
| Test 1 | 1080p H.264 转 H.265 | 1080p H.264 | 1080p H.265 | 评估新一代编码器性能 |
| Test 2 | 4K H.264 转 H.265 | 4K H.264 | 4K H.265 | 评估高分辨率转码能力 |
| Test 3 | 1080p 多线程转码 | 1080p H.264 | 1080p H.264 | 评估多核心扩展性 |
| Test 4 | 4K 快速转码模式 | 4K H.264 | 4K H.264 | 评估实时转码能力 |
| Test 5 | 批量并发转码 | 多个 1080p | 1080p H.264 | 评估并发处理能力 |
三、性能测试实施
3.1 Test 1:1080p H.264 转 H.265 性能测试
测试目的:H.265(HEVC)编码器相比 H.264 能够在相同画质下节省约 50% 的码率,但编码复杂度更高。本测试评估 openEuler 系统在 H.265 编码场景下的性能表现。
# 创建测试脚本
cat > ~/ffmpeg-test/test1_h265.sh << 'EOF'
#!/bin/bash
INPUT="input/test_1080p.mp4"
OUTPUT="output/test1_h265.mp4"
echo "=== Test 1: 1080p H.264 to H.265 ==="
echo "开始时间: $(date)"
# 启动 CPU 监控(后台运行)
mpstat 1 > output/test1_cpu.log &
MPSTAT_PID=$!
# 执行转码
time ffmpeg -i $INPUT \
-c:v libx265 \
-preset medium \
-crf 23 \
-c:a copy \
-y $OUTPUT \
2>&1 | tee output/test1_ffmpeg.log
# 停止 CPU 监控
kill $MPSTAT_PID
echo "结束时间: $(date)"
echo "输出文件大小: $(du -h $OUTPUT | cut -f1)"
EOF
chmod +x ~/ffmpeg-test/test1_h265.sh
cd ~/ffmpeg-test && ./test1_h265.sh
参数说明:
- -c:v libx265:使用 x265 编码器进行 H.265 编码
- -preset medium:编码预设,平衡速度和质量(可选:ultrafast, fast, medium, slow, veryslow)
- -crf 23:恒定质量模式,23 是推荐的高质量值(范围 0-51,值越小质量越高)
- -c:a copy:音频流直接复制,不重新编码
测试结果分析:
grep "frame=" output/test1_ffmpeg.log | tail -1
# 输出:frame= 9000 fps= 61 q=-0.0 Lsize= 12689kB time=00:04:59.97 bitrate= 346.5kbits/s speed=2.03x
- frame=9000 - 已处理的视频帧数:9000帧
- fps=61 - 处理速度:61帧/秒
- q=-0.0 - 视频质量参数(通常-0.0表示无损或恒定质量)
- Lsize=12689kB - 输出文件大小:12,689 KB
- time=00:04:59.97 - 已处理的视频时长:4分59.97秒
- bitrate=346.5kbits/s - 平均比特率:346.5 kbps
- speed=2.03x - 处理速度:原始速度的2.03倍

echo "原始文件: $(du -h input/test_1080p.mp4 | cut -f1)"
echo "转码文件: $(du -h output/test1_h265.mp4 | cut -f1)"
原始文件:14M,转码文件:13M

# 查询CPU平均使用率
cat output/test1_cpu.log | grep -v "CPU" | grep -v "^$" | awk '{print 100-$NF}' | awk '{sum+=$1} END {print "平均CPU使用率:", sum/NR "%"}'
平均CPU使用率:58.2139%

3.2 Test 2:4K H.264 转 H.265 性能测试
测试目的:4K 视频(3840x2160)的像素数是 1080p 的 4 倍,对 CPU 计算能力和内存带宽提出了更高要求。本测试评估系统处理高分辨率视频的能力。
cat > ~/ffmpeg-test/test2_4k_h265.sh << 'EOF'
#!/bin/bash
INPUT="input/test_4k.mp4"
OUTPUT="output/test2_4k_h265.mp4"
echo "=== Test 2: 4K H.264 to H.265 ==="
echo "开始时间: $(date)"
# 监控 CPU 和内存
mpstat 1 > output/test2_cpu.log &
MPSTAT_PID=$!
vmstat 1 > output/test2_mem.log &
VMSTAT_PID=$!
# 执行转码
time ffmpeg -i $INPUT \
-c:v libx265 \
-preset medium \
-crf 23 \
-c:a copy \
-y $OUTPUT \
2>&1 | tee output/test2_ffmpeg.log
# 停止监控
kill $MPSTAT_PID $VMSTAT_PID
echo "结束时间: $(date)"
echo "压缩比: $(echo "scale=2; $(stat -c%s input/test_4k.mp4) / $(stat -c%s $OUTPUT)" | bc)"
EOF
chmod +x ~/ffmpeg-test/test2_4k_h265.sh
cd ~/ffmpeg-test && ./test2_4k_h265.sh
参数说明:
- 4K 视频转码使用与 1080p 相同的参数配置,以便进行性能对比
- vmstat 命令用于监控内存使用情况,包括可用内存、缓存、交换分区等
测试结果分析: - frame=9000 - 已处理的视频帧数:9000帧
- fps=19 - 处理速度:19帧/秒
- q=-0.0 - 视频质量参数(通常-0.0表示无损或恒定质量)
- Lsize=19683kB - 输出文件大小:19,683 KB
- time=00:04:59.97 - 已处理的视频时长:4分59.97秒
- bitrate=537.5kbits/s - 平均比特率:537.5 kbps
- speed=0.622x - 处理速度:原始速度的0.622倍

原始文件:27M,转码文件:20M

平均CPU使用率:61.8347%

3.3 Test 3:1080p 多线程转码性能测试
测试目的:FFmpeg 支持多线程并行编码,理论上可以充分利用多核 CPU。本测试通过调整线程数(4/8/16 线程),评估多核心扩展性和最优线程配置。
cat > ~/ffmpeg-test/test3_multithread.sh << 'EOF'
#!/bin/bash
INPUT="input/test_1080p.mp4"
echo "=== Test 3: 多线程转码性能测试 ==="
for THREADS in 4 8 16; do
OUTPUT="output/test3_threads_${THREADS}.mp4"
echo ""
echo "--- 测试 ${THREADS} 线程 ---"
echo "开始时间: $(date)"
# 监控 CPU
mpstat 1 > output/test3_cpu_${THREADS}.log &
MPSTAT_PID=$!
# 执行转码
time ffmpeg -i $INPUT \
-c:v libx264 \
-preset medium \
-threads $THREADS \
-crf 23 \
-c:a copy \
-y $OUTPUT \
2>&1 | tee output/test3_ffmpeg_${THREADS}.log
# 停止监控
kill $MPSTAT_PID
# 提取转码时间
ENCODE_TIME=$(grep "time=" output/test3_ffmpeg_${THREADS}.log | tail -1 | grep -oP 'time=\K[0-9:]+')
echo "转码完成时间: $ENCODE_TIME"
# 清理输出文件(节省空间)
rm -f $OUTPUT
done
# 性能对比
echo ""
echo "=== 多线程性能对比 ==="
for THREADS in 4 8 16; do
FPS=$(grep "frame=" output/test3_ffmpeg_${THREADS}.log | tail -1 | grep -oP 'fps=\s*\K[0-9.]+')
SPEED=$(grep "speed=" output/test3_ffmpeg_${THREADS}.log | tail -1 | grep -oP 'speed=\s*\K[0-9.]+')
CPU=$(awk 'NR>3 {sum+=$3; count++} END {printf "%.1f", sum/count}' output/test3_cpu_${THREADS}.log)
echo "${THREADS} 线程: FPS=${FPS}, 倍速=${SPEED}x, CPU=${CPU}%"
done
EOF
chmod +x ~/ffmpeg-test/test3_multithread.sh
cd ~/ffmpeg-test && ./test3_multithread.sh
参数说明:
- -threads N:指定编码器使用的线程数
- -c:v libx264:使用 x264 编码器(H.264),相比 x265 编码速度更快
- 通过对比不同线程数的性能,可以找到最优的线程配置
测试结果分析:
| 线程数 | 实际耗时 | 用户时间 | FPS | 转码速度 |
|---|---|---|---|---|
| 4线程 | 1m44.209s | 6m22.940s | ~86 | 2.88x |
| 8线程 | 1m46.765s | 6m34.673s | ~84 | 2.81x |
| 16线程 | 1m15.777s | 6m51.930s | ~119 | 3.96x |
4线程

8线程

16线程

3.4 Test 4:4K 快速转码模式性能测试
测试目的:在实时转码场景(如直播转码、视频会议)中,转码速度比画质更重要。本测试使用 ultrafast 预设,评估系统的实时转码能力。
cat > ~/ffmpeg-test/test4_fast.sh << 'EOF'
#!/bin/bash
# 创建必要的目录
mkdir -p input output
INPUT="input/test_4k.mp4"
OUTPUT="output/test4_4k_fast.mp4"
echo "=== Test 4: 4K 快速转码模式 ==="
echo "开始时间: $(date)"
# 检查输入文件是否存在
if [ ! -f "$INPUT" ]; then
echo "错误: 输入文件 $INPUT 不存在"
exit 1
fi
# 监控系统资源
mpstat 1 > output/test4_cpu.log &
MPSTAT_PID=$!
echo "开始转码..."
time ffmpeg -i "$INPUT" \
-c:v libx264 \
-preset ultrafast \
-tune zerolatency \
-crf 28 \
-c:a copy \
-y "$OUTPUT" \
2>&1 | tee output/test4_ffmpeg.log
# 确保杀死后台进程
kill $MPSTAT_PID 2>/dev/null
echo "结束时间: $(date)"
# 性能分析
echo ""
echo "=== 快速模式性能指标 ==="
# 提取 FPS 和速度
FPS=$(grep "fps=" output/test4_ffmpeg.log | tail -1 | sed 's/.*fps= *\([0-9.]*\).*/\1/')
SPEED=$(grep "speed=" output/test4_ffmpeg.log | tail -1 | sed 's/.*speed= *\([0-9.]*\).*/\1/')
echo "转码速度: ${FPS} fps"
echo "转码倍速: ${SPEED}x"
# 简单字符串比较(适用于整数)
INT_SPEED=$(echo "$SPEED" | cut -d. -f1)
if [ "$INT_SPEED" -ge 1 ] 2>/dev/null; then
echo "✓ 达到实时转码要求(倍速 ≥ 1.0x)"
else
echo "✗ 未达到实时转码要求"
fi
# 检查输出文件
if [ -f "$OUTPUT" ]; then
OUTPUT_SIZE=$(du -h "$OUTPUT" | cut -f1)
echo "输出文件大小: $OUTPUT_SIZE"
else
echo "警告: 输出文件未生成"
fi
EOF
chmod +x ~/ffmpeg-test/test4_fast.sh
cd ~/ffmpeg-test && ./test4_fast.sh
参数说明:
- -preset ultrafast:最快的编码预设,牺牲压缩率换取速度
- -tune zerolatency:零延迟调优,适合实时流媒体场景
- -crf 28:较高的 CRF 值,降低画质要求以提升速度
这个4K快速转码测试取得了出色成果:以2.84倍实时速度完成转码,处理速度达85fps,仅用1分45秒就完成了5分钟的4K视频处理,远超实时转码要求,证明当前配置完全能够胜任高效的4K实时视频处理任务。

3.5 Test 5:批量并发转码性能测试
测试目的:在实际应用中,服务器往往需要同时处理多个转码任务。本测试模拟 4 个并发转码任务,评估系统的多任务处理能力和资源调度效率。
cat > ~/ffmpeg-test/test5_concurrent.sh << 'EOF'
#!/bin/bash
# 创建必要的目录
mkdir -p input output
INPUT="input/test_1080p.mp4"
echo "=== Test 5: 批量并发转码测试 ==="
echo "并发任务数: 4"
echo "开始时间: $(date)"
# 检查输入文件
if [ ! -f "$INPUT" ]; then
echo "错误: 输入文件 $INPUT 不存在"
exit 1
fi
# 清理之前的输出文件
rm -f output/test5_output_*.mp4
# 启动系统监控
mpstat 1 > output/test5_cpu.log 2>/dev/null &
MPSTAT_PID=$!
vmstat 1 > output/test5_mem.log 2>/dev/null &
VMSTAT_PID=$!
iostat -x 1 > output/test5_io.log 2>/dev/null &
IOSTAT_PID=$!
# 并发启动 4 个转码任务
START_TIME=$(date +%s)
for i in {1..4}; do
echo "启动转码任务 $i"
ffmpeg -i "$INPUT" \
-c:v libx264 \
-preset medium \
-threads 4 \
-crf 23 \
-c:a copy \
-y "output/test5_output_${i}.mp4" \
2> "output/test5_ffmpeg_${i}.log" &
done
# 等待所有后台任务完成
echo "等待所有转码任务完成..."
wait
END_TIME=$(date +%s)
TOTAL_TIME=$((END_TIME - START_TIME))
# 停止监控进程
kill $MPSTAT_PID $VMSTAT_PID $IOSTAT_PID 2>/dev/null
wait $MPSTAT_PID $VMSTAT_PID $IOSTAT_PID 2>/dev/null
echo "结束时间: $(date)"
echo "总耗时: ${TOTAL_TIME} 秒"
# 性能分析
echo ""
echo "=== 并发转码性能分析 ==="
# 检查是否安装 bc
if ! command -v bc >/dev/null 2>&1; then
echo "注意: 未安装 bc,将使用简化统计"
fi
# 计算平均转码速度
TOTAL_FPS=0
COMPLETED_TASKS=0
for i in {1..4}; do
if [ -f "output/test5_ffmpeg_${i}.log" ]; then
# 多种方式尝试提取 FPS
FPS=$(grep "fps=" "output/test5_ffmpeg_${i}.log" | tail -1 | \
sed -n 's/.*fps= *\([0-9.]*\).*/\1/p')
if [ -n "$FPS" ] && [ "$FPS" != "0" ]; then
echo "任务 ${i} 转码速度: ${FPS} fps"
if command -v bc >/dev/null 2>&1; then
TOTAL_FPS=$(echo "$TOTAL_FPS + $FPS" | bc -l 2>/dev/null || echo "$TOTAL_FPS")
else
TOTAL_FPS=$(echo "$TOTAL_FPS + $FPS" | awk '{print $1 + $2}')
fi
COMPLETED_TASKS=$((COMPLETED_TASKS + 1))
else
echo "任务 ${i} 无法获取转码速度"
fi
else
echo "任务 ${i} 日志文件不存在"
fi
done
# 计算平均 FPS
if [ $COMPLETED_TASKS -gt 0 ]; then
if command -v bc >/dev/null 2>&1; then
AVG_FPS=$(echo "scale=2; $TOTAL_FPS / $COMPLETED_TASKS" | bc -l 2>/dev/null || echo "N/A")
else
AVG_FPS=$(echo "$TOTAL_FPS $COMPLETED_TASKS" | awk '{printf "%.2f", $1/$2}')
fi
echo "平均转码速度: ${AVG_FPS} fps (基于 ${COMPLETED_TASKS} 个任务)"
else
echo "警告: 没有成功完成的任务"
fi
# CPU 利用率分析
if [ -f "output/test5_cpu.log" ]; then
AVG_CPU=$(awk 'NR>3 && $3 ~ /^[0-9.]+$/ {sum+=$3; count++} END {if(count>0) printf "%.1f", sum/count; else print "N/A"}' output/test5_cpu.log)
echo "平均 CPU 使用率: ${AVG_CPU}%"
else
echo "CPU 日志文件不存在"
fi
# 内存使用分析
if [ -f "output/test5_mem.log" ]; then
# 提取内存使用(第4列是used memory in KB)
MAX_MEM=$(awk 'NR>2 && $4 ~ /^[0-9]+$/ {used=$4; if(used>max) max=used} END {if(max) printf "%.1f", max/1024; else print "N/A"}' output/test5_mem.log)
echo "内存峰值: ${MAX_MEM} MB"
else
echo "内存日志文件不存在"
fi
# IO 统计
if [ -f "output/test5_io.log" ]; then
AVG_UTIL=$(awk '$0 ~ /^[a-z]/ {if(util) count++; util=$NF} END {if(count>0) printf "%.1f", util/count; else print "N/A"}' output/test5_io.log 2>/dev/null || echo "N/A")
echo "平均磁盘利用率: ${AVG_UTIL}%"
fi
# 验证输出文件
echo ""
echo "=== 输出文件验证 ==="
for i in {1..4}; do
if [ -f "output/test5_output_${i}.mp4" ]; then
FILE_SIZE=$(du -h "output/test5_output_${i}.mp4" | cut -f1)
echo "任务 ${i}: 输出文件大小 ${FILE_SIZE}"
else
echo "任务 ${i}: 输出文件未生成"
fi
done
echo ""
echo "=== 测试完成 ==="
EOF
chmod +x ~/ffmpeg-test/test5_concurrent.sh
cd ~/ffmpeg-test && ./test5_concurrent.sh

| 指标类别 | 任务1 | 任务2 | 任务3 | 任务4 | 平均值/总计 |
|---|---|---|---|---|---|
| 转码速度 | 52 fps | 52 fps | 52 fps | 52 fps | 52 fps |
| 转码倍速 | 1.73x | 1.73x | 1.73x | 1.73x | 1.73x |
| 处理帧数 | 9000帧 | 9000帧 | 9000帧 | 9000帧 | 36000帧 |
| 输出文件大小 | 14710kB | 14710kB | 14710kB | 14710kB | 58.84MB |
| 视频码率 | 329.6kbps | 329.6kbps | 329.6kbps | 329.6kbps | 329.6kbps |
| 质量QP | I帧:13.33 P帧:23.33 B帧:26.99 | 相同 | 相同 | 相同 | 良好质量 |
四、性能优化建议
4.1 系统层面优化
CPU 调度优化:
# 设置 CPU 性能模式
sudo cpupower frequency-set -g performance
# 禁用 CPU 节能特性
echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 验证设置
cpupower frequency-info
说明:默认情况下,Linux 系统使用 ondemand 或 powersave 调度策略以节省能源。在视频转码等计算密集型场景下,切换到 performance 模式可以确保 CPU 始终运行在最高频率,避免频率调整带来的性能波动。
内存优化:
# 调整 swappiness(降低交换分区使用)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 增加文件缓存
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
说明:视频转码需要频繁读写大文件,降低 swappiness 可以减少内存交换,保持数据在物理内存中。调整 vfs_cache_pressure 可以让系统保留更多的文件系统缓存。
4.2 FFmpeg 参数优化
编码器优化:
# 使用硬件加速
ffmpeg -hwaccels # 查看支持的硬件加速
# Intel Quick Sync Video 加速示例
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4
# 使用更快的编码预设
ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -crf 23 output.mp4
说明:硬件加速可以显著提升转码速度(通常 5-10 倍),但需要 CPU 或 GPU 支持特定的硬件编码器。在纯 CPU 环境下,选择合适的 preset 可以在质量和速度之间取得平衡。
多线程优化:
# 自动检测最优线程数
OPTIMAL_THREADS=$(nproc)
ffmpeg -i input.mp4 -c:v libx264 -threads $OPTIMAL_THREADS output.mp4
# 对于 H.265,建议使用物理核心数
PHYSICAL_CORES=$(lscpu | grep "Core(s) per socket" | awk '{print $4}')
ffmpeg -i input.mp4 -c:v libx265 -threads $PHYSICAL_CORES output.mp4
4.3 存储 I/O 优化
# 使用 RAM 磁盘加速临时文件读写
sudo mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=8G tmpfs /mnt/ramdisk
# 转码时使用 RAM 磁盘
ffmpeg -i input.mp4 -c:v libx264 -y /mnt/ramdisk/temp.mp4
mv /mnt/ramdisk/temp.mp4 output.mp4
说明:对于小文件或需要多次读写的场景,使用 RAM 磁盘可以消除磁盘 I/O 瓶颈。但需要注意内存容量限制,不适合处理超大视频文件。
五、总结
本次评测表明,openEuler 22.03 LTS 为FFmpeg提供了坚实的高性能基础。测试结果显示,在该系统上无论是处理1080p还是4K视频,均能实现高效转码,尤其在多线程并发和快速转码场景下表现卓越,充分验证了其在CPU密集型应用中的优异性能与稳定性。这彰显了openEuler作为底层平台在支撑视频处理等关键业务上的技术实力。
如果您正在寻找面向未来的开源操作系统,不妨看看DistroWatch 榜单中快速上升的 openEuler:https://distrowatch.com/table-mobile.php?distribution=openeuler,一个由开放原子开源基金会孵化、支持“超节点”场景的Linux 发行版。
openEuler官网:https://www.openeuler.openatom.cn/zh/
4861

被折叠的 条评论
为什么被折叠?



