本文目录导读:

我来为您介绍几种Python转换视频格式的方法,从简单到专业。
使用 moviepy(推荐)
安装
pip install moviepy
基本转换示例
from moviepy.editor import VideoFileClip
import os
def convert_video(input_path, output_path, codec='libx264'):
"""
转换视频格式
:param input_path: 输入文件路径
:param output_path: 输出文件路径
:param codec: 视频编码器
"""
try:
# 加载视频
video = VideoFileClip(input_path)
# 导出为指定格式
video.write_videofile(
output_path,
codec=codec,
audio_codec='aac',
temp_audiofile='temp-audio.m4a',
remove_temp=True
)
# 释放资源
video.close()
print(f"转换完成: {output_path}")
except Exception as e:
print(f"转换失败: {e}")
# 使用示例
convert_video('input.mp4', 'output.avi')
convert_video('input.mp4', 'output.webm', codec='libvpx')
convert_video('input.mp4', 'output.mkv', codec='libx264')
批量转换
import glob
def batch_convert(input_dir, output_dir, output_format='.mp4'):
"""
批量转换视频格式
"""
# 获取所有视频文件
video_files = glob.glob(os.path.join(input_dir, '*.*'))
for video_file in video_files:
if video_file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.flv')):
# 生成输出文件名
base_name = os.path.basename(video_file)
file_name = os.path.splitext(base_name)[0]
output_path = os.path.join(output_dir, f"{file_name}{output_format}")
convert_video(video_file, output_path)
# 使用示例
batch_convert('./input_videos', './output_videos', '.webm')
使用 OpenCV
安装
pip install opencv-python
OpenCV转换示例
import cv2
import numpy as np
import os
def convert_with_opencv(input_path, output_path, output_fps=None):
"""
使用OpenCV转换视频格式
"""
# 读取视频
cap = cv2.VideoCapture(input_path)
# 获取视频属性
fps = output_fps or cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'XVID') # AVI格式
# fourcc = cv2.VideoWriter_fourcc(*'mp4v') # MP4格式
# 创建写入器
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
frame_count = 0
while True:
ret, frame = cap.read()
if not ret:
break
# 写入帧
out.write(frame)
frame_count += 1
# 显示进度
if frame_count % 100 == 0:
progress = (frame_count / total_frames) * 100
print(f"进度: {progress:.1f}%")
# 释放资源
cap.release()
out.release()
print(f"转换完成: {output_path}")
# 使用示例
convert_with_opencv('input.mp4', 'output.avi')
使用 ffmpeg-python
安装
pip install ffmpeg-python
使用ffmpeg转换
import ffmpeg
def convert_with_ffmpeg(input_path, output_path, preset='medium'):
"""
使用ffmpeg转换视频格式
"""
try:
# 执行转换
ffmpeg.input(input_path).output(
output_path,
vcodec='libx264',
acodec='aac',
preset=preset,
crf=23 # 质量参数,18-28,越小质量越好
).run(overwrite_output=True)
print(f"转换完成: {output_path}")
except ffmpeg.Error as e:
print(f"转换失败: {e.stderr.decode()}")
# 使用示例
convert_with_ffmpeg('input.mp4', 'output.webm')
完整的高级转换工具
import argparse
import os
from moviepy.editor import VideoFileClip
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class VideoConverter:
"""视频转换器"""
SUPPORTED_FORMATS = {
'.mp4': {'codec': 'libx264', 'audio_codec': 'aac'},
'.avi': {'codec': 'libx264', 'audio_codec': 'mp3'},
'.mkv': {'codec': 'libx264', 'audio_codec': 'aac'},
'.webm': {'codec': 'libvpx', 'audio_codec': 'libvorbis'},
'.mov': {'codec': 'libx264', 'audio_codec': 'aac'},
'.flv': {'codec': 'libx264', 'audio_codec': 'aac'}
}
def __init__(self, input_path, output_path, custom_codec=None):
self.input_path = input_path
self.output_path = output_path
self.custom_codec = custom_codec
def get_codec_config(self):
"""获取编码器配置"""
if self.custom_codec:
return {'codec': self.custom_codec, 'audio_codec': 'aac'}
ext = os.path.splitext(self.output_path)[1].lower()
return self.SUPPORTED_FORMATS.get(ext, {'codec': 'libx264', 'audio_codec': 'aac'})
def convert(self):
"""执行转换"""
if not os.path.exists(self.input_path):
raise FileNotFoundError(f"输入文件不存在: {self.input_path}")
config = self.get_codec_config()
logger.info(f"开始转换: {self.input_path}")
logger.info(f"输出格式: {self.output_path}")
logger.info(f"编码器: {config['codec']}")
try:
video = VideoFileClip(self.input_path)
video.write_videofile(
self.output_path,
codec=config['codec'],
audio_codec=config['audio_codec'],
logger=logger
)
video.close()
# 检查输出文件
output_size = os.path.getsize(self.output_path)
logger.info(f"转换完成! 输出大小: {output_size / (1024*1024):.2f} MB")
except Exception as e:
logger.error(f"转换失败: {str(e)}")
raise
@staticmethod
def batch_convert(input_dir, output_dir, output_format='.mp4'):
"""批量转换"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
video_files = [f for f in os.listdir(input_dir)
if f.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.flv', '.webm'))]
logger.info(f"找到 {len(video_files)} 个视频文件")
for video_file in video_files:
input_path = os.path.join(input_dir, video_file)
file_name = os.path.splitext(video_file)[0]
output_path = os.path.join(output_dir, f"{file_name}{output_format}")
converter = VideoConverter(input_path, output_path)
converter.convert()
def main():
"""命令行接口"""
parser = argparse.ArgumentParser(description='视频格式转换工具')
parser.add_argument('input', help='输入文件路径或目录')
parser.add_argument('output', help='输出文件路径或目录')
parser.add_argument('--batch', action='store_true', help='批量转换模式')
parser.add_argument('--format', default='.mp4', help='输出格式 (默认: .mp4)')
parser.add_argument('--codec', help='自定义视频编码器')
args = parser.parse_args()
if args.batch:
# 批量转换
VideoConverter.batch_convert(args.input, args.output, args.format)
else:
# 单个文件转换
converter = VideoConverter(args.input, args.output, args.codec)
converter.convert()
if __name__ == "__main__":
main()
使用示例
# 单个文件转换 python video_converter.py input.mp4 output.avi # 指定编码器 python video_converter.py input.mp4 output.webm --codec libvpx # 批量转换 python video_converter.py ./input_videos ./output_videos --batch --format .mp4
优缺点对比
| 方法 | 优缺点 | 适用场景 |
|---|---|---|
| moviepy | 简单易用,功能丰富;依赖较大 | 日常转换 |
| OpenCV | 轻量级,处理速度快;功能有限 | 批量处理 |
| ffmpeg-python | 功能强大,控制精细;需要安装ffmpeg | 专业转换 |
建议优先使用moviepy,它是最简单且功能完整的选择,如果需要更多控制,可以使用ffmpeg-python。