Potrzebuję użyć programu ffmpeg/avconv do obsługi ramek jpg do python PIL (Poduszka) Obiekt obrazu, używając gst jako pośrednika *. Szukałem wszędzie tej odpowiedzi bez powodzenia. Myślę, że jestem blisko - ale utknąłem. Używanie Pythona 2.7Jak potasować klatki wideo na żywo z ffmpeg do PIL?
Mój ideał rurociąg, wystrzelony z pytona, wygląda następująco:
- ffmpeg/avconv (jak h264 wideo)
- rurami ->
- GST -streamer (ramki podzielone na jpg)
- Piped ->
- Pil Object Obraz
Mam kilka pierwszych kroków pod kontrolą jako jedno polecenie, które zapisuje na dysku jako .jpgs wściekle szybki jak sprzęt pozwoli.
tego polecenia wygląda tak:
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"
]
To będzie z powodzeniem napisać klatek na dysk czy biegł z popen lub os.system.
Ale zamiast zapisywać klatki na dysku, chcę przechwycić dane wyjściowe w potoku podprocesu i odczytać klatki, tak jak zostały napisane, w buforze podobnym do pliku, który może zostać odczytany przez PIL.
coś takiego:
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()
Ten kod nie działa - nie jestem nawet pewien, czy mogę użyć „natomiast rura” w ten sposób. Jestem całkiem nowy w używaniu buforów i rurociągów w ten sposób.
Nie jestem pewien, skąd wiedziałbym, że obraz został zapisany w rurze lub kiedy należy przeczytać "następny" obraz.
Każda pomoc byłaby bardzo ceniona w zrozumieniu, jak odczytać obrazy z rury zamiast z dysku.
- To ostatecznie Raspberry Pi 3 rurociąg oraz w celu zwiększenia swoich klatek nie mogę (A) odczyt/zapis do/z dysku lub (b) stosowanie ramkę metodą przechwytywania klatek - jak w przeciwieństwie do uruchamiania wideo H246 bezpośrednio z układu kamery.
Dlaczego nie możesz użyć czegoś takiego jak [pyav] (https://github.com/mikeboers/PyAV)? – Priyatham
Czy na pewno chcesz przeskoczyć przez te obręcze? Można uzyskać dobrą częstość klatek z pikamera. Zobacz http://raspberrypi.stackexchange.com/questions/22040/take-images-in-a-short-time-using-the-raspberry-pi-camera-module –
Nie używam aparatu Pi - kamera jest kamera USB –