#!/usr/bin/env python3
"""
生成前10句字幕的视频（在间隔中间切换图片）
策略：图片切换点 = (前一句end + 后一句start) / 2
"""
import sqlite3
import os
import subprocess

# 数据库路径
db_path = "\\\\ll\\D\\xtrssvjj\\dpd.db"

# 输入输出
mp3_path = "\\\\ll\\D\\wxvddata\\师徒一场_张雪峰走好_上.mp3"
frames_dir = os.path.abspath("shitu_frames")
temp_dir = "shitu_temp"
if not os.path.exists(temp_dir):
    os.makedirs(temp_dir)

# 查询前10句字幕
try:
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()

    cursor.execute("SELECT idx, start, end, cn, en FROM srts WHERE adid = 8281 ORDER BY idx ASC LIMIT 10")
    subtitles = cursor.fetchall()

    print(f"处理前 {len(subtitles)} 句字幕")
    print("\n字幕时间:")
    for idx, start, end, cn, en in subtitles:
        print(f"  {idx}: {start}ms - {end}ms ({cn[:20]}...)")

    # 计算切换时间点（在间隔中间）
    switch_times = []  # 每张图片开始显示的时间点（秒）
    durations = []  # 每张图片显示的时长

    for i in range(len(subtitles)):
        idx = subtitles[i][0]
        start_ms = subtitles[i][1]
        end_ms = subtitles[i][2]

        # 当前图片开始时间
        if i == 0:
            switch_time = start_ms / 1000  # 第一句从start开始
        else:
            # 非第一句：从前一句和当前句的间隔中间开始
            prev_end_ms = subtitles[i-1][2]
            switch_time = (prev_end_ms + start_ms) / 2000

        switch_times.append(switch_time)

        # 当前图片结束时间
        if i < len(subtitles) - 1:
            next_start_ms = subtitles[i+1][1]
            end_time = (end_ms + next_start_ms) / 2000  # 间隔中间
        else:
            # 最后一句：显示到结束
            end_time = end_ms / 1000

        duration = end_time - switch_time
        durations.append(duration)

        print(f"\n图片{idx}: {switch_time:.2f}s - {end_time:.2f}s, 持续 {duration:.2f}s")

    # 创建图片列表文件
    list_file = os.path.join(temp_dir, "image_list_v3.txt")

    with open(list_file, 'w', encoding='utf-8') as f:
        for i, (idx, duration) in enumerate(zip([s[0] for s in subtitles], durations)):
            frame_path = os.path.join(frames_dir, f"frame_{idx:03d}.jpg")
            frame_path = frame_path.replace('\\', '/')
            f.write(f"file '{frame_path}'\nduration {duration:.2f}\n")

        # 最后一帧重复一次
        last_idx = subtitles[-1][0]
        last_frame = os.path.join(frames_dir, f"frame_{last_idx:03d}.jpg")
        last_frame = last_frame.replace('\\', '/')
        f.write(f"file '{last_frame}'\nduration {durations[-1]:.2f}\n")

    total_duration = sum(durations)
    print(f"\n总时长: {total_duration:.2f}s")

    # 生成视频
    output_video = "shitu_test_first10_v3.mp4"
    cmd = [
        'ffmpeg', '-y',
        '-f', 'concat',
        '-safe', '0',
        '-i', list_file,
        '-i', mp3_path,
        '-shortest',
        '-c:v', 'libx264',
        '-preset', 'fast',
        '-c:a', 'aac',
        '-ar', '44100',
        '-ac', '1',
        '-pix_fmt', 'yuv420p',
        output_video
    ]

    print("\n合成视频...")
    result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='ignore')

    if result.returncode == 0:
        print(f"完成！视频保存在: {output_video}")
    else:
        print(f"错误: {result.stderr[-800:] if result.stderr else '无错误信息'}")

    conn.close()

except Exception as e:
    print(f"错误: {e}")
