视频内存太大怎么压缩变小一点?视频压缩的常用方法

发布于:2025-07-03 ⋅ 阅读:(29) ⋅ 点赞:(0)

视频传生活或者工作中很常见,如发送视频邮件、在线视频播放、视频上传下载等。未压缩的大内存视频文件传输时,不仅会消耗大量的网络带宽资源,还会使传输时间大幅增加。在网速有限的情况下,发送一个几 GB 的未压缩视频可能需要数小时甚至更长时间;而压缩后的视频,传输时间会大幅缩短,用户体验得到显著提升。对于在线视频平台,压缩视频能降低服务器压力,使更多用户可以流畅观看视频,减少卡顿现象。

下面是一个使用 FFmpeg 压缩视频文件的 Python 脚本,你可以使用它来减小视频文件的大小。

使用说明:

1. 首先需要安装FFmpeg:
   - Windows: 从浏览器中下载并添加到系统PATH
   - macOS: 使用Homebrew安装 `brew install ffmpeg`
   - Linux: 使用包管理器安装 `sudo apt-get install ffmpeg` 或 `sudo yum install ffmpeg`

2. 安装必要的Python依赖:
 

 ```
   pip install argparse
   ```

示例代码:

import os
import argparse
import subprocess
import sys
from pathlib import Path

def compress_video(input_file, output_file=None, quality=28, codec="libx264", crf_min=18, crf_max=32):
    """
    使用FFmpeg压缩视频文件
    
    参数:
        input_file: 输入视频文件路径
        output_file: 输出视频文件路径,默认为输入文件名添加_compressed后缀
        quality: 视频质量,使用CRF值(18-32),值越高文件越小,默认为28
        codec: 视频编码格式,默认为libx264(h.264)
        crf_min: 最小CRF值限制
        crf_max: 最大CRF值限制
    """
    # 确保输入文件存在
    if not os.path.isfile(input_file):
        print(f"错误: 输入文件不存在 - {input_file}")
        return False
    
    # 限制CRF值范围
    quality = max(crf_min, min(crf_max, quality))
    
    # 生成输出文件名(如果未指定)
    if not output_file:
        base_name, ext = os.path.splitext(input_file)
        output_file = f"{base_name}_compressed{ext}"
    
    # 构建FFmpeg命令
    cmd = [
        "ffmpeg",
        "-i", input_file,
        "-c:v", codec,
        "-crf", str(quality),
        "-preset", "medium",  # 编码速度与压缩比的平衡
        "-c:a", "aac",        # 音频编码
        "-b:a", "128k",       # 音频比特率
        "-y",                 # 覆盖已存在文件
        output_file
    ]
    
    try:
        # 执行FFmpeg命令
        print(f"开始压缩视频: {input_file}")
        print(f"输出文件: {output_file}")
        print(f"使用CRF: {quality}")
        
        result = subprocess.run(cmd, capture_output=True, text=True, check=True)
        
        # 检查源文件和压缩后文件的大小
        original_size = os.path.getsize(input_file)
        compressed_size = os.path.getsize(output_file)
        reduction_percentage = (1 - compressed_size / original_size) * 100
        
        print(f"压缩完成!")
        print(f"原始大小: {original_size / (1024 * 1024):.2f} MB")
        print(f"压缩后大小: {compressed_size / (1024 * 1024):.2f} MB")
        print(f"减少比例: {reduction_percentage:.2f}%")
        
        return True
    except subprocess.CalledProcessError as e:
        print(f"压缩失败: {e.stderr}")
        return False
    except Exception as e:
        print(f"发生错误: {str(e)}")
        return False

def batch_compress(directory, quality=28, codec="libx264"):
    """
    批量压缩目录中的所有视频文件
    
    参数:
        directory: 目录路径
        quality: 视频质量CRF值
        codec: 视频编码格式
    """
    if not os.path.isdir(directory):
        print(f"错误: 目录不存在 - {directory}")
        return
    
    # 支持的视频文件扩展名
    video_extensions = ['.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv']
    
    compressed_count = 0
    total_files = 0
    
    # 统计总视频文件数
    for filename in os.listdir(directory):
        if any(filename.lower().endswith(ext) for ext in video_extensions):
            total_files += 1
    
    print(f"发现 {total_files} 个视频文件")
    
    # 处理每个视频文件
    for i, filename in enumerate(os.listdir(directory)):
        if any(filename.lower().endswith(ext) for ext in video_extensions):
            input_path = os.path.join(directory, filename)
            print(f"\n({i+1}/{total_files}) 处理文件: {filename}")
            
            if compress_video(input_path, quality=quality, codec=codec):
                compressed_count += 1
    
    print(f"\n批量压缩完成! 共处理 {total_files} 个文件,成功压缩 {compressed_count} 个文件")

def main():
    """命令行入口函数"""
    parser = argparse.ArgumentParser(description='视频压缩工具 - 使用FFmpeg压缩视频文件')
    parser.add_argument('--input', '-i', help='输入视频文件路径或目录')
    parser.add_argument('--output', '-o', help='输出视频文件路径(仅当输入为单个文件时有效)')
    parser.add_argument('--quality', '-q', type=int, default=28, 
                        help='视频质量(18-32),值越高文件越小,默认28')
    parser.add_argument('--batch', '-b', action='store_true', 
                        help='批量压缩目录中的所有视频文件')
    parser.add_argument('--codec', '-c', default='libx264', 
                        help='视频编码格式,默认为libx264(h.264)')
    
    args = parser.parse_args()
    
    # 检查是否安装了FFmpeg
    try:
        subprocess.run(["ffmpeg", "-version"], capture_output=True, check=True)
    except (subprocess.SubprocessError, FileNotFoundError):
        print("错误: 未找到FFmpeg。请先安装FFmpeg并确保其在系统PATH中。")
        print("FFmpeg下载地址: https://ffmpeg.org/download.html")
        sys.exit(1)
    
    if not args.input:
        print("错误: 必须指定输入文件或目录")
        parser.print_help()
        return
    
    if args.batch:
        batch_compress(args.input, args.quality, args.codec)
    else:
        # 单文件转换
        if os.path.isfile(args.input):
            compress_video(args.input, args.output, args.quality, args.codec)
        else:
            print("错误: 输入文件不存在")

if __name__ == "__main__":
    main()    

3. 基本用法:
   - 压缩单个视频:`python video_compressor.py -i input.mp4 -o output.mp4`
   - 批量压缩目录中的所有视频:`python video_compressor.py -i /path/to/videos -b`
   - 调整压缩质量(CRF值,18-32,值越高文件越小):`python video_compressor.py -i input.mp4 -q 30`

4. 其他选项:
   - 指定视频编码格式:`-c libx265`(更高压缩率,但可能需要更长时间)
   - 查看帮助信息:`python video_compressor.py --help`

脚本会自动计算并显示压缩前后的文件大小和减少比例,方便你了解压缩效果。

如果我们觉得代码的方式比较麻烦,可以使用“汇帮超级压缩器”来压缩视频文件。小白也能操作的方法。

学习视频文件压缩方法的过程,也是提升自身数字技能和数据处理能力的过程。掌握压缩方法后,能进一步理解视频编码、格式转换等相关知识,为学习更复杂的视频编辑、特效制作等技能打下基础。这种能力的提升,在数字化时代的各个领域都能发挥作用,无论是工作中的数据处理,还是个人对数字信息的管理和利用,都能更加得心应手。