Ich würde gerne mit einem Program (bevorzugt Python) Bilder von der Webcam lesen, während die in Benutzung ist. Also ich habe z.B. guvcview laufen, das ein Bild von der Kamera anzeigt, und möchte nebenher mit Python ein Bild abzweigen. Mit openCV geht es nicht, da sagt die Library die Cam wäre busy. vlc kann auch nicht auf /dev/video0 zugreifen, wenn die Cam in Benutzung ist.
Webcam-Bild lesen, während ein anderes Pgm die Cam benutzt?
Anmeldungsdatum: Beiträge: 800 Wohnort: Schwetzingen |
|
Ehemalige
Anmeldungsdatum: Beiträge: 4403 Wohnort: Sachsen |
Das ist in der Tat nicht so einfach möglich. Wenn du Lust und Muse hast, kannst du dich mal hiermit beschäftigen. Das ist ein Kernel-Modul, welches es erlaubt aus einem physischen Gerät mehrere virtuelle Geräte zu machen, auf die man dann zugreifen kann. Out-of-the-box ist es AFAIK nicht möglich mehrere Programme auf den Stream zugreifen zu lassen. Eine mögliche Alternative könnte zwar auch ffmpeg mit mehreren Outputs darstellen, allerdings habe ich das noch nicht versucht. Performance-technisch ist das Kernel-Modul sicherlich besser. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 800 Wohnort: Schwetzingen |
Mit v4l2loopback kann man zwar 2 virtuelle Cams definieren, aber dann bräuchte man ja wieder ein Modul, dass den Stream der echten Cam auf die 2 virtuellen füttert. ffmpeg kann wohl einen Video-Stream splitten in 2, aber die Beispiele kapier ich nicht, die sind zu kryptisch: https://ffmpeg.org/ffmpeg-formats.html#tee |
Ehemalige
Anmeldungsdatum: Beiträge: 4403 Wohnort: Sachsen |
Stimmt, das hätte ich da falsch verstanden. Dennoch könntest du versuchen damit die Devices zu erstellen und sie mit ffmpeg "befüllen".
Ich bin grade unterwegs, aber ich würde es so versuchen: ffmpeg ... -f tee ... "/dev/loopdevice1|/dev/loopdevice2" Keine Ahnung, wie die Devices dann heißen, aber das Prinzip wird klar. Ich bin da allerdings kein Experte, vielleicht gibt's da auch noch einen ganz anderen Ansatz. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 800 Wohnort: Schwetzingen |
Ich hab jetzt so probiert: sudo modprobe v4l2loopback devices=2 Damit habe ich /dev/video1 und /dev/video2 zusätzlich zur Webcam auf /dev/video0. Dann: ffmpeg -i /dev/video0 -vcodec rawvideo -f tee -map 0:v -map 0:v "[f=rawvideo]/dev/video1|[f=rawvideo]/dev/video2" Dann meckert er: Input #0, video4linux2,v4l2, from '/dev/video0': Duration: N/A, start: 71591.507703, bitrate: 165888 kb/s Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 960x720, 165888 kb/s, 15 fps, 15 tbr, 1000k tbn, 1000k tbc Output #0, tee, to '[f=rawvideo]/dev/video1|[f=rawvideo]/dev/video2': Metadata: encoder : Lavf57.56.101 Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 960x720, q=2-31, 200 kb/s, 15 fps, 15 tbn, 15 tbc Metadata: encoder : Lavc57.64.101 rawvideo Stream #0:1: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 960x720, q=2-31, 200 kb/s, 15 fps, 15 tbn, 15 tbc Metadata: encoder : Lavc57.64.101 rawvideo Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native)) Stream #0:0 -> #0:1 (rawvideo (native) -> rawvideo (native)) Press [q] to stop, [?] for help [tee @ 0x557e83cd1480] Slave muxer #0 failed, aborting. [tee @ 0x557e83cd1480] All tee outputs failed. av_interleaved_write_frame(): Invalid argument frame= 2 fps=0.0 q=-0.0 Lq=-0.0 size=N/A time=00:00:00.13 bitrate=N/A speed=1.79x video:4050kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown Conversion failed! Der Fehler "av_interleaved_write_frame(): Invalid argument" klingt interessant, aber so wie ich das sehe sagt der rein gar nichts. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 800 Wohnort: Schwetzingen |
Die Lösung ist viel einfacher: sudo modprobe v4l2loopback ffmpeg -f v4l2 -i /dev/video0 -f v4l2 /dev/video1 Jetzt kann man mehrfach aus /dev/video1 lesen! Leider geht damit aber die Möglichkeit verloren, aus verschiedenen Auflösungen zu wählen. Danke für die Tips. |