python3.6版本代码:

import subprocess
import re
from threading import Thread

def print_ffmpeg_progress(process):
    """
    从ffmpeg进程中读取并打印进度信息
    """
    pattern = re.compile(r'frame=\s+(\d+)')  # 正则表达式,用于匹配帧数
    for line in iter(process.stderr.readline, ''):
        if 'progress' in line:
            match = pattern.search(line)
            if match:
                frame = int(match.group(1))
                print(f"Processing frame: {frame}")

def rotate_video_with_ffmpeg(input_path, output_path):
    # 构建ffmpeg命令
    command = [
        'ffmpeg',
        '-i', input_path,
        '-vf', 'transpose=2',  # 顺时针旋转90度
        '-c:a', 'copy',
        output_path,
        '-loglevel', 'error'  # 设置日志级别为error以获取更多错误信息
    ]

    # 启动ffmpeg进程
    with subprocess.Popen(command, stderr=subprocess.PIPE, universal_newlines=True) as process:
        # 创建并启动一个新线程来打印进度
        progress_thread = Thread(target=print_ffmpeg_progress, args=(process,))
        progress_thread.daemon = True
        progress_thread.start()

        # 等待ffmpeg进程结束
        process.wait()

        # 读取 FFmpeg 进程的错误输出
        error_output, _ = process.communicate()

        # 确保进度线程结束
        progress_thread.join()

        # 检查ffmpeg进程的状态
        if process.returncode != 0:
            print("FFmpeg process failed with error code:", process.returncode)
            print("Error output:\n", error_output)
        else:
            print("Video rotation completed successfully.")

# 使用示例
input_video_path = "E:\\pian\\fanchang.mp4"
output_video_path = "E:\\pian\\fanchang_旋转90.mp4"
rotate_video_with_ffmpeg(input_video_path, output_video_path)


# """
#
# ffmpeg中的transpose过滤器接受的参数值与旋转角度的表示方式不同。在ffmpeg中,transpose过滤器的参数值用来指定旋转的方向,而不是旋转的角度。参数值与旋转方向的对应关系如下:
#
# 0:不旋转(默认)
# 1:逆时针旋转90度
# 2:顺时针旋转90度
# 3:旋转180度
# 所以,如果你想要顺时针旋转90度(将竖屏视频转换为横屏),应该使用transpose=2。逆时针旋转90度则使用transpose=1。
#
# 根据你提供的错误信息,你已经尝试使用transpose=90,这不是一个有效的参数值,因为transpose过滤器不接受角度值,只接受上述的旋转方向值。
# """

 

posted on 2024-05-14 17:12  大话人生  阅读(90)  评论(0编辑  收藏  举报