1. 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。