Python案例怎么转换视频格式?

wen python案例 38

本文目录导读:

Python案例怎么转换视频格式?

  1. 方法一:使用 moviepy(推荐)
  2. 方法二:使用 OpenCV
  3. 方法三:使用 ffmpeg-python
  4. 完整的高级转换工具
  5. 使用示例
  6. 优缺点对比

我来为您介绍几种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。

抱歉,评论功能暂时关闭!