#!/usr/bin/env python3
"""
生成前5句字幕的视频片段并合成（修复路径问题）
"""
import sqlite3
import os
import subprocess

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

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

# 查询前5句字幕
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 5")
    subtitles = cursor.fetchall()
    
    print(f"处理前 {len(subtitles)} 句字幕")
    
    # 生成视频片段
    video_segments = []
    for idx, start, end, cn, en in subtitles:
        duration = (end - start) / 1000
        frame_path = os.path.join(frames_dir, f"frame_{idx:03d}.jpg")
        output_path = os.path.join(temp_dir, f"segment_{idx:03d}.mp4")
        
        # 生成静态视频
        cmd = [
            'ffmpeg', '-y',
            '-loop', '1',
            '-framerate', '25',
            '-i', frame_path,
            '-c:v', 'libx264',
            '-preset', 'fast',
            '-t', f'{duration:.2f}',
            '-pix_fmt', 'yuv420p',
            output_path
        ]
        
        print(f"生成片段 {idx}: {duration:.2f}s")
        subprocess.run(cmd, check=True, capture_output=True)
        video_segments.append(output_path)
    
    # 生成片段列表文件（使用绝对路径）
    list_file = os.path.join(temp_dir, "segments.txt")
    with open(list_file, 'w', encoding='utf-8') as f:
        for segment in video_segments:
            abs_path = os.path.abspath(segment).replace('\\', '/')
            f.write(f"file '{abs_path}'\n")
    
    # 合成视频
    output_video = "shitu_test_first5.mp4"
    cmd = [
        'ffmpeg', '-y',
        '-i', mp3_path,
        '-loop', '1',
        '-framerate', '25',
        '-i', os.path.join(frames_dir, 'frame_000.jpg'),
        '-loop', '1',
        '-framerate', '25',
        '-i', os.path.join(frames_dir, 'frame_001.jpg'),
        '-loop', '1',
        '-framerate', '25',
        '-i', os.path.join(frames_dir, 'frame_002.jpg'),
        '-loop', '1',
        '-framerate', '25',
        '-i', os.path.join(frames_dir, 'frame_003.jpg'),
        '-loop', '1',
        '-framerate', '25',
        '-i', os.path.join(frames_dir, 'frame_004.jpg'),
        '-filter_complex', \
        f"[1:v]trim=0:1.26,setpts=PTS-STARTPTS[v0];" \
        f"[2:v]trim=0:6.12,setpts=PTS-STARTPTS[v1];" \
        f"[3:v]trim=0:1.72,setpts=PTS-STARTPTS[v2];" \
        f"[4:v]trim=0:3.40,setpts=PTS-STARTPTS[v3];" \
        f"[5:v]trim=0:4.21,setpts=PTS-STARTPTS[v4];" \
        f"[v0][v1][v2][v3][v4]concat=n=5:v=1:a=0[outv];" \
        f"[0:a]trim=0:16.71,setpts=PTS-STARTPTS[outa]",
        '-map', '[outv]',
        '-map', '[outa]',
        '-c:v', 'libx264',
        '-preset', 'fast',
        '-c:a', 'aac',
        '-ar', '44100',
        '-ac', '1',
        '-pix_fmt', 'yuv420p',
        output_video
    ]
    
    print("合成视频...")
    subprocess.run(cmd, check=True, capture_output=True)
    
    print(f"完成！视频保存在: {output_video}")
    print(f"时长: 约 16.71s")
    
    conn.close()
    
except Exception as e:
    print(f"错误: {e}")
