[python]mp4极限压缩
import subprocess
import os
def convert_to_h266(input_file, output_file):
# 检查输入文件是否存在
if not os.path.exists(input_file):
raise FileNotFoundError(f"Input file {input_file} does not exist.")
# 调用ffmpeg命令进行转换
ffmpeg_command = [
'ffmpeg',
'-i', input_file, # 输入文件
'-c:v', 'vvc', # 视频编码器,H.266(又称为VVC)
'-strict', '-2', # 宽松模式以确保兼容性
output_file # 输出文件
]
try:
subprocess.run(ffmpeg_command, check=True)
print(f"Conversion to H.266 successful: {output_file}")
except subprocess.CalledProcessError as e:
print(f"Error during conversion: {e}")
input_mp4 = "input_video.mp4" # 替换为你的输入MP4文件路径
output_h266 = "output_video.mp4" # 替换为你的输出H.266文件路径
convert_to_h266(input_mp4, output_h266)
多线程
import subprocess
import os
def convert_to_h266(input_file, output_file, crf, threads):
"""
使用FFmpeg将MP4文件转换为H.266 (VVC)格式,并优化转换速度。
:param input_file: 输入MP4文件路径
:param output_file: 输出H.266文件路径
:param crf: 压缩质量系数 (CRF, Constant Rate Factor),值越高压缩率越高,质量越低
:param threads: 使用的线程数,可以根据CPU核心数调整
"""
# 检查输入文件是否存在
if not os.path.exists(input_file):
raise FileNotFoundError(f"Input file {input_file} does not exist.")
# 构造FFmpeg命令
ffmpeg_command = [
'ffmpeg', # 不需要提供完整路径,环境变量中已经配置
'-i', input_file, # 输入文件
'-c:v', 'vvc', # 使用VVC (H.266)编码器
'-crf', str(crf), # 设置压缩质量参数
'-threads', str(threads), # 指定使用的线程数
'-preset', 'faster', # 使用较快的预设(可选:ultrafast、superfast、fast、medium、slow、veryslow)
'-strict', '-2', # 宽松模式以确保兼容性
output_file # 输出文件
]
try:
# 使用subprocess执行FFmpeg命令
subprocess.run(ffmpeg_command, check=True)
print(f"Conversion to H.266 successful: {output_file}")
except subprocess.CalledProcessError as e:
print(f"Error during conversion: {e}")
# 示例调用
input_mp4 = "input_video.mp4" # 替换为你的输入MP4文件路径
output_h266 = "output_video.mp4" # 替换为你的输出H.266文件路径
# 必须传入 crf 和 threads 的值
convert_to_h266(input_mp4, output_h266, crf=25, threads=8)
ffmpeg下载
https://github.com/BtbN/FFmpeg-Builds