Разделить видео при изменении разрешения с помощью ffmpeg.

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

Видеофайл изменяет разрешение 6 раз.
Как разделить его на разные сегменты, когда разрешение изменяется?
Так, чтобы каждый сегмент содержал только 1 разрешение.
Эта команда не сработает, получится только 1 файл.

ffprobe -skip_frame nokey -i sample2.ts -show_frames -select_streams v -show_entries frame=pts_time,width,height -of csv

ffmpeg -i sample2.ts -map 0 -c copy -segment_times 7271.704989,7481.593989,8577.330989,8631.877989,9723.348989,9934.060989 -reset_timestamps 1 -f segment output_%05d.ts

Вот файл:
https://www.mediafire.com/file/esawjkv05hpe9qg/sample2.rar/file

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

Разделение видео на сегменты при изменении разрешения с использованием ffmpeg

При анализе вашей задачи и предоставленного описания можно выделить несколько ключевых этапов для успешного разбиения видео на сегменты, каждый из которых соответствует отдельному разрешению. Ваше текущее решение не работает из-за неправильного подхода к выбору точек разбиения. Давайте рассмотрим, как можно решить эту задачу.

Шаги для решения:

  1. Анализ видеофайла: Нам необходимо определить моменты времени, когда происходит изменение разрешения. Для этого можно использовать ffprobe, который позволяет извлечь информацию о каждом кадре, включая его временную метку (PTS), ширину и высоту.

    ffprobe -v error -select_streams v:0 -show_entries frame=pkt_pts_time,width,height -of csv=p=0 sample2.ts > frames_data.csv

    Результирующий файл frames_data.csv будет содержать время и разрешение каждого кадра. На основе этого файла можно выявить моменты, когда разрешение меняется.

  2. Обработка данных: После получения данных из ffprobe, вам нужно определить все временные метки, где происходит изменение разрешения. Вы можете написать скрипт на Python или другом языке, чтобы автоматизировать этот процесс.

    Пример на Python:

    import csv
    
    with open('frames_data.csv', newline='') as csvfile:
       reader = csv.reader(csvfile)
       last_resolution = None
       segment_times = []
    
       for row in reader:
           pts_time, width, height = row[0], row[1], row[2]
           current_resolution = (width, height)
    
           if current_resolution != last_resolution:
               segment_times.append(float(pts_time))
               last_resolution = current_resolution
    
    # Преобразуем в строку для ffmpeg
    segment_times_string = ','.join(map(str, segment_times))
    print(f"Сегменты: {segment_times_string}")
  3. Разделение видео: Теперь, когда у вас есть строки сегментов segment_times, вы можете использовать ffmpeg для разбиения видео:

    ffmpeg -i sample2.ts -c copy -f segment -segment_times [ваши_временные_метки] -reset_timestamps 1 output_%03d.ts

Заключение:

Этот подход позволит вам создать отдельные файлы для каждого изменения разрешения. Убедитесь, что пути к файлам корректны и что у вас установлены необходимые зависимости для работы с видео. Возможно, вам придется настроить дополнительные параметры ffmpeg, в зависимости от сложности вашего видео и особенностей исходного материала.

Решение задачи требует точного подхода и внимательности при работе с временными метками. Использование скриптов и автоматизация помогают избежать ошибок, часто возникающих при выполнении таких задач вручную.

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

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