3

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

ffmpg -re -loop 1 -i image.jpg -c:v libx264 -pix_fmt yuv420p out.mp4

Я бы просто перезаписал свой код image.jpg всякий раз, когда он создавал новое изображение. Тем не менее, я хотел бы иметь возможность просто передать напрямую команду ffmpeg, чтобы мне не приходилось иметь дело с сохранением файла.

Я знаю, что могу использовать что-то вроде

ffmpeg -re -y -f image2pipe -vcodec mjpeg -r 24 -i - ...

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

Немного больше информации: я запускаю все это в Windows через команду подпроцесса Python и отправляю изображения через подпроцесс.ТРУБА к stdin. Я думаю, что моя проблема связана с получением правильной команды ffmpeg, а не с Python, поэтому я публикую ее здесь.

2 ответа2

2

Я обнаружил, что лучшим решением было просто перезаписать изображение локально. Я много играл с конвейерами и процессами в Python, но ничего не получалось, кроме запуска ffmpeg из командной строки и перезаписи изображения. Я закончил тем, что делал это на Linux, но это должно работать на Windows.

команда ffmpeg:

ffmpeg -re -loop 1 -i out.jpg -re -f lavfi -i aevalsrc=0 -codec:v libx264 -video_size 1280x720 -f flv -strict experimental rtmp://...

ffmpeg направляет поток по URL-адресу rtmp, но его легко изменить, чтобы сохранить локально. Просто измените флаг -f на желаемый формат, а URL-адрес - на имя файла.

Код Python:

import cv2
import os
import threading

class ffmpegHelper(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.image_queue = queue
        self.timer = 1


    def tick(self):
        threading.Timer(self.timer,self.tick).start()
        temp = None
        if not self.image_queue.empty():
            temp = self.image_queue.get()
        try:
            cv2.imwrite("temp.jpg",temp)
            os.rename("temp.jpg","out.jpg")
        except:
            print "Temp didn't get fully written"
            print "Skipping this frame"


    def run(self):
        self.tick()

Код Python не самый чистый в мире, но он должен работать. Сначала он пишет в «temp.jpg», поэтому ffmpeg не заканчивает чтение изображения, когда Python пишет его.

0

когда файл out.jpg открывается в программе, создающей файлы jpg, он должен быть установлен как "общий" доступ для чтения / записи, поскольку 2 процесса (ffmpeg и программа, создающая файл) могут одновременно обращаться к нему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .