FFmpeg压缩视频
FFmpeg尽可能保持画质的同时有效地压缩视频文件大小
使用 ffmpeg 压缩视频时,可以通过调整各种参数来在保持画质的同时减少文件大小。以下是一些技巧和示例命令,帮助你实现这一点:
使用CRF(Constant Rate Factor): CRF 是一个非常方便的选项,用于在压缩视频时权衡文件大小和画质。CRF 的值范围是 0 到 51,其中 0 表示无损压缩,23 是默认值,51 表示最差质量。一般来说,18 到 23 是一个很好的范围,数值越小,画质越好,文件也会越大。
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4
调整比特率: 手动设置目标比特率可以直接控制视频的输出大小和质量。你可以使用 -b:v 参数来设置视频比特率。
ffmpeg -i input.mp4 -b:v 1000k -bufsize 2000k output.mp4
使用预设(Presets): FFmpeg 提供了一些预设,这些预设会影响编码速度和压缩效率。常见的预设有 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow 和 placebo。预设越慢,压缩效率越高,文件越小,但编码时间也会更长。
ffmpeg -i input.mp4 -vcodec libx264 -preset slow -crf 23 output.mp4
调整分辨率: 如果你愿意降低视频的分辨率,这也会显著减少文件大小,同时对画质的影响相对较小。
ffmpeg -i input.mp4 -vf "scale=1280:720" -crf 23 output.mp4
音频压缩: 同时压缩音频也能减少文件大小。你可以使用 AAC 编码器并设置比特率。
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -acodec aac -b:a 128k output.mp4
结合使用上述方法:
你可以结合上述所有方法来最大化压缩效果,同时尽可能保持较好的画质。
ffmpeg -i input.mp4 -vcodec libx264 -preset slow -crf 22 -vf "scale=1280:720" -acodec aac -b:a 128k output.mp4
通过这些方法,你可以找到一个适合你需求的平衡点,在尽可能保持画质的同时有效地压缩视频文件大小。
ffmpeg -y -i "{input_file}" -c:a copy -c:v libx264 -profile:v high -crf 48 "{output_file}"
这条命令会将 {input_file} 转换为 {output_file}:
音频部分直接复制,不进行重新编码。
视频部分使用 H.264 编码器(libx264)进行压缩。
编码配置档次为 high。
使用 CRF 48(非常低的画质)进行视频压缩。
如果输出文件已存在,则自动覆盖。
需要注意的是,CRF 值为 48 通常会导致非常差的画质,建议根据实际需求调整这个值以在文件大小和画质之间找到合适的平衡点。
Python调用FFmpeg命令压缩视频
import argparse
import os
import subprocess
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="compress video")
parser.add_argument('--input', type=str, help='input dir path')
args = parser.parse_args()
if args.input is None:
args.input = input("input dir path: ")
input_dir_path = args.input
file_path_list = [file for file in os.listdir(input_dir_path) if file.endswith('.mp4')]
for file_path in file_path_list:
output_dir = os.path.join(input_dir_path, 'out')
print(output_dir)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
input_file = os.path.join(input_dir_path, file_path)
output_file = os.path.join(output_dir, file_path)
if os.path.exists(output_file):
continue
# 构造FFmpeg命令
command = f"/usr/bin/ffmpeg -y -i '{input_file}' -crf 36 '{output_file}'"
subprocess.call(command, shell=True)
FFmpeg从视频中提取音频
ffmpeg -i input.m4a -f segment -segment_time 600 -c:a pcm_s16le -ar 44100 -ac 1 output.wav
sox从视频中提取音频
#Linux音频转换工具包
yum -y install sox
sox -t raw -c 1 -e signed-integer -b 16 -r 16000 input.m4a output.wav
-b, --bits BITS 每个编码样本占用的数据位数
-c, --channels CHANNELS 音频文件包含的通道数
-e, --encoding ENCODING 音频文件的编码类型
-r, --rate RATE 音频文件的采样率
-t, --type FILE-TYPE 音频文件的文件类型