Вопрос или проблема
Видеофайл изменяет разрешение 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
При анализе вашей задачи и предоставленного описания можно выделить несколько ключевых этапов для успешного разбиения видео на сегменты, каждый из которых соответствует отдельному разрешению. Ваше текущее решение не работает из-за неправильного подхода к выбору точек разбиения. Давайте рассмотрим, как можно решить эту задачу.
Шаги для решения:
-
Анализ видеофайла: Нам необходимо определить моменты времени, когда происходит изменение разрешения. Для этого можно использовать
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
будет содержать время и разрешение каждого кадра. На основе этого файла можно выявить моменты, когда разрешение меняется. -
Обработка данных: После получения данных из
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}")
-
Разделение видео: Теперь, когда у вас есть строки сегментов
segment_times
, вы можете использоватьffmpeg
для разбиения видео:ffmpeg -i sample2.ts -c copy -f segment -segment_times [ваши_временные_метки] -reset_timestamps 1 output_%03d.ts
Заключение:
Этот подход позволит вам создать отдельные файлы для каждого изменения разрешения. Убедитесь, что пути к файлам корректны и что у вас установлены необходимые зависимости для работы с видео. Возможно, вам придется настроить дополнительные параметры ffmpeg
, в зависимости от сложности вашего видео и особенностей исходного материала.
Решение задачи требует точного подхода и внимательности при работе с временными метками. Использование скриптов и автоматизация помогают избежать ошибок, часто возникающих при выполнении таких задач вручную.