如何用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
相关产品推荐
相关产品推荐

