You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将视频压缩至目标大小(如50MB)?

Python优雅压缩视频至指定大小的实现方案

当然有!在Python里处理视频压缩,最优雅且灵活的方式就是借助ffmpeg-python库——它是FFmpeg的Python封装,能让你用简洁的代码实现精准的大小控制,完全满足你“压缩到目标大小(如50MB)且允许适度质量损耗”的需求。

核心思路

视频文件的大小主要由码率(单位:bps,比特每秒)决定,我们可以通过反向计算目标码率,再用FFmpeg转码来实现精准压缩。公式大概是这样的:

目标总码率 = (目标大小(字节)× 8) / 视频时长(秒)
目标视频码率 = 目标总码率 - 音频码率

这里要预留出音频的码率(比如常见的128kbps),避免把音频压得太惨,影响体验。

具体实现步骤

1. 安装依赖

首先得安装ffmpeg-python库,同时确保你的系统已经安装了FFmpeg(Windows/macOS可以直接从官网下载,Linux用包管理器安装即可):

pip install ffmpeg-python

2. 编写压缩代码

下面是一个完整的示例,能自动计算目标码率并压缩视频到指定大小:

import ffmpeg
import math

def compress_video(input_path, output_path, target_size_mb=50):
    # 转换目标大小为字节
    target_size = target_size_mb * 1024 * 1024
    
    # 获取原视频的时长和音频码率
    probe = ffmpeg.probe(input_path)
    video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
    audio_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'audio'), None)
    
    if not video_stream:
        raise ValueError("输入文件不是有效的视频文件")
    
    # 计算视频时长(秒)
    duration = float(probe['format']['duration'])
    
    # 音频码率默认用128kbps,如果原音频码率更低就用原码率
    audio_bitrate = int(audio_stream['bit_rate']) if audio_stream else 128000
    audio_bitrate = min(audio_bitrate, 128000)
    
    # 计算目标总码率(bps)
    total_target_bitrate = (target_size * 8) / duration
    # 计算视频目标码率,预留音频的部分
    video_target_bitrate = total_target_bitrate - audio_bitrate
    
    if video_target_bitrate <= 0:
        raise ValueError("目标大小过小,无法在保证音频质量的前提下压缩视频")
    
    # 转换为FFmpeg接受的格式(比如'1000k')
    video_target_bitrate_str = f"{math.floor(video_target_bitrate / 1000)}k"
    audio_bitrate_str = f"{audio_bitrate // 1000}k"
    
    # 执行压缩:用H.264编码,调整视频码率,保持音频码率
    try:
        (
            ffmpeg
            .input(input_path)
            .output(
                output_path,
                vcodec='libx264',
                b=video_target_bitrate_str,
                acodec='aac',
                ab=audio_bitrate_str,
                preset='medium'  # preset控制压缩速度和质量,medium是平衡选项
            )
            .overwrite_output()
            .run(capture_stdout=True, capture_stderr=True)
        )
        print(f"视频已成功压缩至约{target_size_mb}MB,保存为{output_path}")
    except ffmpeg.Error as e:
        print(f"压缩失败:{e.stderr.decode('utf-8')}")
        raise

# 使用示例
compress_video("input_video.mp4", "compressed_video.mp4", target_size_mb=50)

优化建议

  • 调整编码格式:如果目标平台支持H.265(libx265),可以把vcodec改成libx265,能在相同质量下获得更小的体积。
  • 调整分辨率:如果原视频分辨率很高,可以添加vf='scale=1280:-1'参数(保持宽高比缩到1080P),进一步减小体积。
  • 调整preset:FFmpeg的preset参数从ultrafast到veryslow,速度越慢压缩率越高,你可以根据需求选择。
  • 批量处理:如果需要批量压缩视频,只需要遍历文件列表调用这个函数即可。

这样的实现既灵活又可控,你可以根据实际场景调整参数,平衡文件大小和视频音频质量。

内容的提问来源于stack exchange,提问作者武状元 Woa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:33:02