Мне нужно использовать ffmpeg/avconv для подключения кадров jpg к python PIL (Pillow) Объект изображения, используя gst как посредник *. Я везде искал этот ответ без большой удачи. Я думаю, что я рядом, но я застрял. Использование Python 2.7Как подключить живые видеокадры от ffmpeg до PIL?
Мой идеальный трубопроводный, запущенная из питона, выглядит следующим образом:
- FFmpeg/avconv (как h264 видео)
- Водопроводной ->
- GST -отвод (рамы разделены на jpg)
- Трубы ->
- Пил Объект Image
У меня есть несколько первых шагов под контролем как одну команду, которая записывает .jpgs на диск, как неистово быстро, как аппаратное обеспечение позволит.
Эта команда выглядит примерно так:
command = [
"ffmpeg",
"-f video4linux2",
"-r 30",
"-video_size 1280x720",
"-pixel_format 'uyvy422'",
"-i /dev/video0",
"-vf fps=30",
"-f H264",
"-vcodec libx264",
"-preset ultrafast",
"pipe:1 -",
"|", # Pipe to GST
"gst-launch-1.0 fdsrc !",
"video/x-h264,framerate=30/1,stream-format=byte-stream !",
"decodebin ! videorate ! video/x-raw,framerate=30/1 !",
"videoconvert !",
"jpegenc quality=55 !",
"multifilesink location=" + Utils.live_sync_path + "live_%04d.jpg"
]
Это успешно писать кадры на диск, если бегала с POPEN или os.system.
Но вместо того, чтобы записывать кадры на диск, я хочу захватить вывод в моем субпроцессном канале и прочитать кадры, как они написаны, в файловом буфере, который затем может быть прочитан PIL.
Что-то вроде этого:
import subprocess as sp
import shlex
import StringIO
clean_cmd = shlex.split(" ".join(command))
pipe = sp.Popen(clean_cmd, stdout = sp.PIPE, bufsize=10**8)
while pipe:
raw = pipe.stdout.read()
buff = StringIO.StringIO()
buff.write(raw)
buff.seek(0)
# Open or do something clever...
im = Image.open(buff)
im.show()
pipe.flush()
Этот код не работает - я даже не уверен, что я могу использовать «в то время как труба» таким образом. Я довольно новичок в использовании буферов и трубопроводов таким образом.
Я не уверен, как бы я знал, что изображение было записано в трубу или когда было прочитано «следующее» изображение.
Любая помощь будет принята с благодарностью при понимании того, как читать изображения из трубы, а не на диск.
- Это в конечном счете, трубопровод Малина Pi 3 и для того, чтобы увеличить свои частоты кадров я не могу (А) чтения/записи на/с диска или (В) используют кадр методом захвата кадра - в качестве против прямого запуска видео H246 непосредственно с чипа камеры.
Почему вы не можете использовать что-то вроде [pyav] (https://github.com/mikeboers/PyAV)? – Priyatham
Вы уверены, что вам нужно перепрыгнуть через эти обручи? Можно получить хорошую частоту кадров от пикамера. См. Http://raspberrypi.stackexchange.com/questions/22040/take-images-in-a-short-time-using-the-raspberry-pi-camera-module –
Я не пользуюсь камерой Pi - камера USB-камера –