#!/usr/bin/env python3
"""
使用带字幕的图片和TTS音频生成静态视频
先生成前5句的视频
"""
import os
import subprocess

# 导入编码处理模块
from console_helper import (
    safe_print, print_header, print_step, print_info,
    print_success, print_fail, print_done
)


def get_audio_duration(audio_path):
    """获取音频时长"""
    args = [
        'ffprobe',
        '-v', 'quiet',
        '-print_format', 'json',
        '-show_format',
        audio_path
    ]
    
    try:
        result = subprocess.run(args, check=True, capture_output=True, text=True)
        import json
        data = json.loads(result.stdout)
        return float(data['format']['duration'])
    except Exception as e:
        safe_print(f"      获取音频时长失败: {e}")
        return 0


def create_static_video(image_path, audio_path, output_path, ffmpeg_path="ffmpeg"):
    """使用图片和音频生成静态视频"""
    # 获取音频时长
    duration = get_audio_duration(audio_path)
    if duration == 0:
        safe_print(f"      无法获取音频时长")
        return False
    
    # 使用ffmpeg生成视频
    # -loop 1: 循环图片
    # -i image: 输入图片
    # -i audio: 输入音频
    # -c:v libx264: 视频编码
    # -t duration: 设置时长
    # -pix_fmt yuv420p: 像素格式
    # -shortest: 以最短的输入为准
    args = [
        ffmpeg_path,
        '-y',
        '-loop', '1',
        '-i', image_path,
        '-i', audio_path,
        '-c:v', 'libx264',
        '-c:a', 'aac',
        '-ar', '44100',
        '-ac', '1',
        '-t', str(duration),
        '-pix_fmt', 'yuv420p',
        '-shortest',
        output_path
    ]
    
    try:
        subprocess.run(args, check=True, capture_output=True)
        return True
    except subprocess.CalledProcessError as e:
        safe_print(f"      生成视频失败: {e}")
        return False


def main():
    frames_dir = "frames_with_subtitle"
    audio_dir = "tts_audio_all"
    output_dir = "static_videos"
    max_lines = 5  # 先生成前5句
    
    print_header("生成静态视频 (前5句)")
    safe_print(f"图片目录: {frames_dir}")
    safe_print(f"音频目录: {audio_dir}")
    safe_print(f"输出目录: {output_dir}")
    safe_print("")
    
    # 检查目录是否存在
    if not os.path.exists(frames_dir):
        safe_print(f"错误: 图片目录 {frames_dir} 不存在")
        return
    
    if not os.path.exists(audio_dir):
        safe_print(f"错误: 音频目录 {audio_dir} 不存在")
        return
    
    # 创建输出目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # 生成前5句的视频
    print_step(1, 1, "生成静态视频...")
    generated_count = 0
    total_duration = 0
    
    for line_number in range(1, max_lines + 1):
        image_path = os.path.join(frames_dir, f"frame_{line_number:03d}_with_subtitle.jpg")
        audio_path = os.path.join(audio_dir, f"tts_line_{line_number}.wav")
        output_path = os.path.join(output_dir, f"static_video_{line_number:03d}.mp4")
        
        # 检查文件是否存在
        if not os.path.exists(image_path):
            safe_print(f"      警告: 图片文件 {image_path} 不存在，跳过第{line_number}句")
            continue
        
        if not os.path.exists(audio_path):
            safe_print(f"      警告: 音频文件 {audio_path} 不存在，跳过第{line_number}句")
            continue
        
        safe_print(f"      生成第{line_number}句视频...")
        
        if create_static_video(image_path, audio_path, output_path):
            duration = get_audio_duration(output_path)
            total_duration += duration
            print_info(f"      已生成", f"{output_path} ({duration:.2f}秒)")
            generated_count += 1
        else:
            safe_print(f"      生成第{line_number}句视频失败")
    
    safe_print("")
    print_info("成功生成", f"{generated_count}/{max_lines} 个视频")
    print_info("总时长", f"{total_duration:.2f}秒 ({total_duration/60:.2f}分钟)")
    print_info("输出目录", output_dir)
    
    print_done()


if __name__ == '__main__':
    main()
