用ffmpeg连接流列表

2024-06-23 03:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写python代码,自动重新排列视频的场景。如何使用^{}连接n流/场景列表?将这些场景与音频场景合并的最简单方法是什么?
不幸的是,我不知道该怎么做

status quo

import os

import scenedetect
from scenedetect.video_manager import VideoManager
from scenedetect.scene_manager import SceneManager
from scenedetect.frame_timecode import FrameTimecode
from scenedetect.stats_manager import StatsManager
from scenedetect.detectors import ContentDetector

import ffmpeg

STATS_FILE_PATH = 'stats.csv'

def main():

    for root, dirs, files in os.walk('material'):
        for file in files:
            file = os.path.join(root, file)
            print(file)
            video_manager = VideoManager([file])
            stats_manager = StatsManager()
            scene_manager = SceneManager(stats_manager)
            scene_manager.add_detector(ContentDetector())
            base_timecode = video_manager.get_base_timecode()
            end_timecode = video_manager.get_duration()

            start_time = base_timecode
            end_time = base_timecode + 100.0
            #end_time = end_timecode[2]

            video_manager.set_duration(start_time=start_time, end_time=end_time)
            video_manager.set_downscale_factor()
            video_manager.start()
            scene_manager.detect_scenes(frame_source=video_manager)

            scene_list = scene_manager.get_scene_list(base_timecode)

            print('List of scenes obtained:')
            for i, scene in enumerate(scene_list):
                print('    Scene %2d: Start %s / Frame %d, End %s / Frame %d' % (
                    i+1,
                    scene[0].get_timecode(), scene[0].get_frames(),
                    scene[1].get_timecode(), scene[1].get_frames(),))

                start = scene[0].get_frames()
                end = scene[1].get_frames()

                print(start)
                print(end)

                (
                    ffmpeg
                    .input(file)
                    .trim(start_frame=start, end_frame=end)
                    .setpts ('PTS-STARTPTS')
                    .output('scene %d.mp4' % (i+1)) 
                    .run()
                )

            if stats_manager.is_save_required():
                with open(STATS_FILE_PATH, 'w') as stats_file:
                    stats_manager.save_to_csv(stats_file, base_timecode)

if __name__ == "__main__":
    main()

Tags: fromimportbasegettimevideostatsmanager

热门问题