之前下载的一些电影,剧集,在手机上观看不是很友好(体积占用太大了),就萌发出了压缩一下的想法,就去搜了一下FFmpeg的简单用法:
首先输入
lspci -k | grep -EA3 'VGA|3D|Display'
确认一下显卡(uhd6630)驱动安装与否
如果输出有“Kernel driver in use: i915” 那么说明Intel的i915驱driver(支持UHD 630)正在使用。
安装FFmpeg:
sudo apt update
sudo apt install ffmpeg
然后,为了利用你的UHD 630显卡进行硬件加速编码,你需要确保你的ffmpeg支持VA-API(Video Acceleration API)。这是Intel图形硬件所使用的API。
#检查ffmpeg是否支持VA-API:
如果输出中包含"vaapi",那么你的ffmpeg就支持VA-API。
使用以下命令来进行硬件加速编码:
ffmpeg -vaapi_device /dev/dri/renderD129 -i input.mp4 -vf 'format=nv12,hwupload' -c:v h264_vaapi output.mp4
我最终想要实现的是自动压缩某个目录下的所有的mp4文件,并且输入到这个目录下的720p文件夹内,最终写好的批量代码为:
#!/bin/bash
input_dir="/data/other/001"
output_dir="${input_dir}/720p"
mkdir -p "${output_dir}"
find "${input_dir}" -type f -name "*.mp4" | while read file; do
filename=$(basename "$file")
ffmpeg -vaapi_device /dev/dri/renderD128 -i "${file}" \
-vf 'format=nv12,hwupload' \
-f mp4 -movflags faststart \
-c:v h264_vaapi -preset veryfast -tune:v ssim -crf 20 -qmin 15 -qmax 25 -keyint_min 10 \
-c:a copy \
-sn -timestamp now -map_metadata -1 -map_chapters -1 -vsync cfr \
"${output_dir}/${filename}"
done
该脚本的作用是将位于指定目录(/data/other/001)下的所有 .mp4 格式视频文件转换为 H.264 编码、720p 分辨率(1280x720)、音频编码不变的新视频文件,输出到与原始文件相同的目录下。具体实现方式如下:
创建一个存储输出文件的目录 720p,并确保它在输入文件所在目录的路径下。
使用 find 命令查找所有 .mp4 格式的文件,并将它们传递给 while 循环进行处理。
对于每个输入文件,使用 ffmpeg 命令将其转换为 H.264 编码的 .mp4 格式视频文件,输出到先前创建的存储目录中。
:使用 VA-API 加速进行视频编码。-vaapi_device /dev/dri/renderD129
:将输入文件转换为 YUV420p 格式,并启用硬件加速上传。-vf 'format=nv12,hwupload'
:将输出格式设置为 MP4,并启用快速启动标志以使文件可以流式传输。-f mp4 -movflags faststart
:设置 H.264 视频编码器和 VA-API 加速。-c:v h264_vaapi
:设置视频编码器参数,以达到较高的视频质量和压缩率。 -preset veryfast -tune:v ssim -crf 20 -qmin 15 -qmax 25 -keyint_min 10
:将音频轨道复制到输出文件中,不进行重新编码。 -c:a copy
:设置一些常规选项,如禁用字幕、设置时间戳、禁用元数据和章节信息等。 -sn -timestamp now -map_metadata -1 -map_chapters -1 -vsync cfr
:禁用所有字幕流。这意味着在输出文件中不会包含任何字幕。-sn
:设置输出文件中视频和音频流的时间戳为当前时间。这样做可以确保输出文件中的时间戳与输入文件中的时间戳不同,以避免一些播放器可能会出现的问题。 -timestamp now
:从输出文件中删除所有元数据。这将删除输入文件中可能存在的所有元数据(如作者、标题、描述等)。 -map_metadata -1
:从输出文件中删除所有章节信息。 -map_chapters -1
:指定帧率控制模式。cfr 表示“恒定帧率”,它将输出视频的帧率设置为输入的帧率。 -vsync cfr
:选择预设编码速度和质量的选项。veryfast 表示编码器将快速处理视频,但输出质量可能会稍微降低。 -preset veryfast
:根据 SSIM(结构相似性)算法进行编码,以提高视频质量。SSIM 算法是一种衡量两个图像之间结构相似性的方法。 -tune:v ssim
:使用 Constant Rate Factor(CRF)方法进行视频压缩。20 是 CRF 值,表示编码器将尝试以较高的质量进行编码。CRF 值越低,输出视频的质量越好,但文件大小也越大。-crf 20
:设置视频质量的最小和最大值。这个参数与 CRF 值一起使用,可以使编码器尽可能地接近输入质量,但又不会产生过大的输出文件大小。 -qmin 15 -qmax 25
:设置关键帧之间的最小时间间隔。关键帧是视频中的一个完整帧,可以作为可独立解码的单元。在编码期间,编码器会在某些帧中插入关键帧,以确保视频可以按照正确的顺序播放。 -keyint_min 10