1. H.264 与 H.265 编码器命令行工具初探

H.264 与 H.265 编码器命令行工具初探 学习卡片

任务说明

用 FFmpeg 分别调用 libx264 与 libx265,对同一段 YUV 原始视频编码,比较输出文件大小、编码耗时和基本参数。核心是建立可复现的对比流程,而不是追求画质调优。

环境与输入

  • FFmpeg 需包含 libx264、libx265:ffmpeg -encoders | grep -E "libx264|libx265"
  • 准备一段 YUV420p 原始视频,例如 1280x720、25fps、250 帧:ffmpeg -f lavfi -i testsrc=size=1280x720:rate=25 -frames:v 250 -pix_fmt yuv420p input.yuv
  • YUV 无帧率/分辨率元数据,编码时必须显式指定 -s 1280x720 -r 25 -pix_fmt yuv420p。

对比脚本

下面脚本对同一输入分别编码,记录耗时、文件大小,并打印关键参数。使用 /usr/bin/time 或 shell 内建 time 均可,这里用 date +%s.%N 计算秒数,避免依赖外部工具。

#!/usr/bin/env bash
set -euo pipefail

IN=input.yuv
W=1280; H=720; FPS=25; FRAMES=250
COMMON="-f rawvideo -pix_fmt yuv420p -s ${W}x${H} -r ${FPS} -i ${IN} -frames:v ${FRAMES} -y"

run() {
  local name=$1; shift
  local out="${name}.mp4"
  local t0=$(date +%s.%N)
  ffmpeg -hide_banner -loglevel error $COMMON "$@" "$out"
  local t1=$(date +%s.%N)
  local size=$(stat -c %s "$out")
  local secs=$(awk "BEGIN{printf \"%.2f\", $t1-$t0}")
  echo "== $name =="
  echo "time(s): $secs"
  echo "size(B): $size"
  ffprobe -v error -select_streams v:0 \
    -show_entries stream=codec_name,profile,level,width,height,pix_fmt,bit_rate \
    -of default=noprint_wrappers=1 "$out"
  echo
}

run x264 -c:v libx264 -preset medium -crf 23
run x265 -c:v libx265 -preset medium -crf 23

运行与验证

chmod +x compare.sh
./compare.sh

通过条件:两个 mp4 均生成且可被 ffprobe 读取;codec_name 分别为 h264 与 hevc;分辨率、帧率、像素格式与输入一致。脚本会打印各自的耗时与字节数,据此比较大小与速度差异。注意:具体数值取决于输入内容与机器,本页不预设结果。

参数差异要点

  • libx264 输出 h264,libx265 输出 hevc,容器同为 mp4。
  • 相同 CRF 数值下两者码率控制语义不同,不能直接等同画质,仅作大小/耗时对比。
  • 如需更公平对比,可固定目标码率:把 -crf 23 换成 -b:v 2M。
input.yuv libx264 (CRF23) libx265 (CRF23) x264.mp4 x265.mp4 大小/ 耗时对比