Создание MJPEG из множества файлов JPEG

#python #video #mjpeg

#python #Видео #mjpeg

Вопрос:

Я программирую это на Python. У меня есть куча файлов JPEG и их временные метки в базе данных. Они не совсем периодические (частота кадров немного нестабильна, /- несколько миллисекунд на кадр). Я хочу запросить базу данных и создать файл MJPEG, который я могу сохранить на диск и ffmpeg при желании перекодировать. Как мне это сделать (не нужен код, просто несколько комментариев высокого уровня, если это возможно, какие модули, если таковые имеются, использовать и т.д.)?

Комментарии:

1. Я сам не использую Python, но посмотрите, поможет ли логика моего ответа вам найти решение.

Ответ №1:

Вы можете динамически создавать видеокадры в FFmpeg, отправляя данные RGB из Python.

Почему бы просто не прочитать файлы JPEG и не отправить их декодированные данные RGB в FFmpeg для создания видеофайла H264? Видеокадры H264 позже могут быть помещены в контейнер MP4 вместе с любым звуком, субтитрами и т. Д.

Вам нужно запустить FFmpeg как процесс на Python, а затем записать массив байтов RGB в стандартный идентификатор процесса. Каждая запись создает кадр, поэтому, если вам нужно отобразить изображение в течение стольких миллисекунд, вы просто вычисляете, сколько раз отправлять один и тот же массив RGB.

Например, если вы настроили FFmpeg на вывод видео со скоростью 30 кадров в секунду и хотите, чтобы JPEG отображался в течение 2 секунд, вы записываете одни и те же декодированные данные RGB в формате JPEG 60 раз (используя a for-loop ).

Идеальная функция выглядит так writeFrame (rgbData, numTimesToWrite); , где numTimesToWrite было бы 60. Затем для использования вы просто декодируете JPEG в RGB, а затем вводите в эту функцию количество кадров для записи. Поскольку скорость составляет 1000 мс в секунду, любой 1 кадр представляет около 33 миллисекунд выходного видео.

  • Смотрите Этот учебник по Python, чтобы получить представление о написании фреймов. Вам нужно ввести pipe.proc.stdin.write функцию, которая вызывается всякий раз, когда вы хотите записать фрейм.
  • Вот как я это сделал (см. function makeVideoFrame() Идеи), используя язык ActionScript-3 (это может сделать любой язык со стандартными функциями ввода / вывода).