Быстрое деление видео на фрагменты по ‘x’ кадров.

Вопрос или проблема

Я пытаюсь разделить видео на части по 1000 кадров каждая (это должно выполняться на уровне кадров). В настоящее время я использую библиотеку opencv, но она очень медленная. У меня уходит полчаса, чтобы разделить 1-часовое видео на эти равные по размеру части.

Это функция, которую я сейчас использую:

def split_video(video_path, output_dir, frames_per_chunk=1000):
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = 0
    chunk_count = 0
    frames = []
    
    # Создать выходной каталог, если его не существует
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    frame_idx = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        frames.append(frame)
        frame_count += 1
        # Сохранить часть после каждых 'frames_per_chunk' кадров
        if frame_count % frames_per_chunk == 0:
            chunk_filename = f'video_chunk_{chunk_count}.mp4'
            chunk_path = os.path.join(output_dir, chunk_filename)
            save_frames_to_video(frames, chunk_path, fps)
            frames = []
            chunk_count += 1
        frame_idx +=1

    # Сохранить любые оставшиеся кадры
    if frames:
        chunk_filename = f'video_chunk_{chunk_count}.mp4'
        chunk_path = os.path.join(output_dir, chunk_filename)
        save_frames_to_video(frames, chunk_path, fps)

    print(f'видео разделено на {chunk_count + 1} частей')
    cap.release()
    return

Есть ли другие методы или библиотеки в Python, которые я могу использовать, которые более эффективны в этом? Я смотрел в библиотеку ffmpeg, но она, похоже, хорошо справляется только с разделением по времени, а не по количеству кадров.

Ответ или решение

Для решения задачи быстрой нарезки видео на фрагменты по 1000 кадров, важно рассмотреть использование более эффективных подходов и инструментов, чем OpenCV. Несмотря на его популярность для обработки изображений и видео, OpenCV может быть недостаточно оптимизирован в вашем случае. Одним из наиболее эффективных решений может стать использование библиотеки FFmpeg, которая известна своей высокой производительностью и гибкостью при работе с видеофайлами.

Основные шаги реализации с использованием FFmpeg:

  1. Установка FFmpeg: Убедитесь, что FFmpeg установлен на вашем компьютере. Для установки можно использовать пакетный менеджер, такой как Homebrew для macOS или apt для Linux:

    sudo apt update
    sudo apt install ffmpeg
  2. Формирование команды для нарезки видео: Вместо написания кода на Python, можно воспользоваться командой FFmpeg для разделения видео на фрагменты. Команда может выглядеть следующим образом:

    ffmpeg -i input_video.mp4 -vf "select='not(mod(n,1000))'" -vsync vfr output_chunk_%03d.mp4

    Здесь:

    • -i input_video.mp4: указывает входное видео.
    • -vf "select='not(mod(n,1000))'": фильтр, который выбирает каждый 1000-й кадр.
    • -vsync vfr: помогает избежать проблем с синхронизацией видео.
    • output_chunk_%03d.mp4: имя выходных файлов с автоинкрементом.
  3. Запуск команды в Python: Вы можете запустить эту команду из Python, используя модуль subprocess, что позволит избежать необходимости писать собственный код для нарезки видео.

    import subprocess
    
    def split_video_ffmpeg(video_path, output_dir, frames_per_chunk=1000):
       command = [
           'ffmpeg', '-i', video_path,
           '-vf', f"select='not(mod(n,{frames_per_chunk}))'", 
           '-vsync', 'vfr',
           f"{output_dir}/output_chunk_%03d.mp4"
       ]
       subprocess.run(command, check=True)
    
    split_video_ffmpeg('input_video.mp4', 'output_directory')
  4. Преимущества использования FFmpeg:

    • Скорость: FFmpeg написан с учетом высокой производительности, и его использование значительно ускорит процесс нарезки видео.
    • Гибкость: FFmpeg поддерживает множество форматов и кодеков, что делает его универсальным инструментом для работы с видео.
    • Минимум кода: Вам не нужно беспокоиться о создании функций для сохранения кадров, так как FFmpeg обрабатывает все в одной команде.
  5. Обработка больших видеофайлов: Убедитесь, что у вас достаточно ресурсов для работы с большими видеофайлами, и учитывайте необходимость обработки файлов на высокопроизводительных машинах для минимизации времени выполнения задачи.

Таким образом, использование FFmpeg для нарезки видео на фрагменты по 1000 кадров является более эффективным методом, чем использование OpenCV. Он не только ускоряет процесс, но и позволяет минимизировать написание кода, сосредоточившись на самой задаче обработки видео.

Если у вас будут дополнительные вопросы или потребуются дальнейшие разъяснения по использованию FFmpeg или другим библиотекам, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...