开发者
鲲鹏服务器上 FFmpeg 视频转码性能优化实录
鲲鹏服务器上 FFmpeg 视频转码性能优化实录
原创
发表于05/10
190

背景

在鲲鹏 920 服务器(64 核 / 256GB 内存)部署视频转码服务,处理 H.264 编码任务。同样参数下,x86 服务器转码 1080p 视频速度是 2x(两倍于实时),鲲鹏上只有 0.8x,无法满足业务需求。

第一次尝试:直接安装系统包

# 安装系统 FFmpeg
dnf install ffmpeg ffmpeg-devel

# 测试转码
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4

# 结果:0.8x 速度,CPU 利用率 30%
# 问题:FFmpeg 和 x264 都是通用编译,未启用 ARM NEON

perf top 显示热点在 x264_pixel_sad_16x16 等函数,都是 C 语言实现。

第二次尝试:启用 x264 NEON 优化

# 下载 x264 源码
git clone https://code.videolan.org/videolan/x264.git
cd x264

# 配置时显式启用 ARM NEON
./configure --prefix=/usr/local/x264-neon \
            --enable-shared \
            --enable-static \
            --enable-strip \
            --enable-pic \
            --enable-lto \
            --cross-prefix=aarch64-linux-gnu- \
            --host=aarch64-linux-gnu

# 关键:确保 NEON 被启用
grep -r "HAVE_ARMV8" config.h
# #define HAVE_ARMV8 1
# #define HAVE_NEON 1

make -j$(nproc)
make install
```

重新编译 FFmpeg 链接优化版 x264:

```bash
cd ffmpeg-6.0
./configure --prefix=/usr/local/ffmpeg-neon \
            --enable-gpl \
            --enable-libx264 \
            --extra-cflags="-I/usr/local/x264-neon/include" \
            --extra-ldflags="-L/usr/local/x264-neon/lib" \
            --arch=aarch64 \
            --enable-neon \
            --enable-lto

make -j$(nproc)
make install

测试结果:1.5x 速度,有提升但仍不如 x86。

突破点:发现 OpenMAX 硬件编码

鲲鹏 920 支持通过 OpenMAX 调用硬件视频编码器,绕过 CPU 软编码。

# 检查硬件编码器支持
ffmpeg -hwaccels
# 输出包含:v4l2m2m

# 使用硬件编码
ffmpeg -hwaccel v4l2m2m \
       -i input.mp4 \
       -c:v h264_v4l2m2m \
       -b:v 4M \
       output.mp4

# 结果:4.2x 速度!远超 x86 软编码

最终配置

根据场景选择编码方式:

#!/bin/bash
# transcode.sh - 自适应转码脚本

INPUT=$1
OUTPUT=$2
QUALITY=${3:-high}  # high/medium/low

if [ "$QUALITY" = "high" ]; then
    # 高质量:x264 NEON 软编码
    ffmpeg -i "$INPUT" \
           -c:v libx264 \
           -preset slow \
           -crf 18 \
           -c:a copy \
           "$OUTPUT"
elif [ "$QUALITY" = "medium" ]; then
    # 平衡:硬件编码 + 质量调整
    ffmpeg -hwaccel v4l2m2m \
           -i "$INPUT" \
           -c:v h264_v4l2m2m \
           -b:v 6M \
           -c:a copy \
           "$OUTPUT"
else
    # 快速:硬件编码最低质量
    ffmpeg -hwaccel v4l2m2m \
           -i "$INPUT" \
           -c:v h264_v4l2m2m \
           -b:v 2M \
           -c:a copy \
           "$OUTPUT"
fi

总结

方案转码速度CPU 占用适用场景
系统包(无优化)0.8x30%不推荐
x264 NEON 软编码1.8x85%高质量要求
OpenMAX 硬件编码4.2x15%快速转码

鲲鹏视频转码的关键是软硬结合:x264 NEON 优化适合质量敏感场景,OpenMAX 硬件编码适合吞吐优先场景。不要直接照搬 x86 的纯软编码思路,鲲鹏的硬件加速能力是被低估的优势。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞