本文目录导读:

我来为您介绍几种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。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播