File size: 3,985 Bytes
09eaf7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import os
from PySide6.QtWidgets import (QWidget, QVBoxLayout, QLabel, QLineEdit,
                               QScrollArea, QCheckBox, QPushButton, QMessageBox)

from ui_components import (FloatSlider, CustomSlider, RadioButtonGroup,
                           AudioSelector, VideoPlayer)

# 尝试导入实际的功能模块
try:
    from tools.step050_synthesize_video import synthesize_all_video_under_folder
except ImportError:
    pass


class SynthesizeVideoTab(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout(self)

        # 创建一个滚动区域
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_widget = QWidget()
        self.scroll_layout = QVBoxLayout(self.scroll_widget)

        # 视频文件夹
        self.video_folder = QLineEdit("videos")
        self.scroll_layout.addWidget(QLabel("视频文件夹"))
        self.scroll_layout.addWidget(self.video_folder)

        # 添加字幕
        self.add_subtitles = QCheckBox("添加字幕")
        self.add_subtitles.setChecked(True)
        self.scroll_layout.addWidget(self.add_subtitles)

        # 加速倍数
        self.speed_factor = FloatSlider(0.5, 2, 0.05, "加速倍数", 1.00)
        self.scroll_layout.addWidget(self.speed_factor)

        # 帧率
        self.frame_rate = CustomSlider(1, 60, 1, "帧率", 30)
        self.scroll_layout.addWidget(self.frame_rate)

        # 背景音乐
        self.background_music = AudioSelector("背景音乐")
        self.scroll_layout.addWidget(self.background_music)

        # 背景音乐音量
        self.bg_music_volume = FloatSlider(0, 1, 0.05, "背景音乐音量", 0.5)
        self.scroll_layout.addWidget(self.bg_music_volume)

        # 视频音量
        self.video_volume = FloatSlider(0, 1, 0.05, "视频音量", 1.0)
        self.scroll_layout.addWidget(self.video_volume)

        # 分辨率
        self.resolution = RadioButtonGroup(
            ['4320p', '2160p', '1440p', '1080p', '720p', '480p', '360p', '240p', '144p'],
            "分辨率",
            '1080p'
        )
        self.scroll_layout.addWidget(self.resolution)

        # 执行按钮
        self.run_button = QPushButton("开始合成视频")
        self.run_button.clicked.connect(self.run_synthesis)
        self.scroll_layout.addWidget(self.run_button)

        # 状态显示
        self.status_label = QLabel("准备就绪")
        self.scroll_layout.addWidget(QLabel("合成状态:"))
        self.scroll_layout.addWidget(self.status_label)

        # 视频播放器
        self.video_player = VideoPlayer("合成视频")
        self.scroll_layout.addWidget(self.video_player)

        # 设置滚动区域
        self.scroll_area.setWidget(self.scroll_widget)
        self.layout.addWidget(self.scroll_area)
        self.setLayout(self.layout)

    def run_synthesis(self):
        # 这里应该调用原始的synthesize_all_video_under_folder函数
        # 临时实现,实际应用中需要替换为真实的调用
        self.status_label.setText("合成中...")
        QMessageBox.information(self, "功能提示", "视频合成功能正在实现中...")

        # 实际应用中解除以下注释

        try:
            status, video_path = synthesize_all_video_under_folder(
                self.video_folder.text(),
                self.add_subtitles.isChecked(),
                self.speed_factor.value(),
                self.frame_rate.value(),
                self.background_music.value(),
                self.bg_music_volume.value(),
                self.video_volume.value(),
                self.resolution.value()
            )
            self.status_label.setText(status)
            if video_path and os.path.exists(video_path):
                self.video_player.set_video(video_path)
        except Exception as e:
            self.status_label.setText(f"合成失败: {str(e)}")