Video opnemen in Python en opslaan in elk gewenst formaat totdat ik op 'q' of 'Esc' druk

i have installed python3-picamera on raspberry pi and i want to record a video and store it in .avi format untill i press "Esc" or 'q'. I found below program but i don't want to use camera.wait_recording() in my program. I have tried using key = cv2.waitkey(1) & 0XFF, but didn't work. It is throwing

syntaxisfout: buiten bereik 'doorbreken'

import time
import cv2   
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    camera.start_recording('one_day.h264', quality=20, bitrate=750000)
    #camera.wait_recording(24 * 60 * 60)
    key = cv2.waitkey(1) & 0XFF
    if key == ord("q")
          break

    camera.stop_recording()
2
Je mist een dubbele punt aan het einde van de regel if key == ord ("q") - alle blokken worden geïntroduceerd door een dubbele punt in Python. Als u in .avi-indeling wilt opnemen, moet u de uitvoer transcoderen (bij voorkeur op een snellere machine); de camerafirmware van de Pi ondersteunt dit niet (waarschijnlijk omdat .avi officieel MPEG4-compressie niet ondersteunt, om nog te zwijgen van het feit dat het een oud formaat is dat grotendeels op dit punt is achterhaald).
toegevoegd de auteur JimB, de bron
Misschien wilt u het script in ook dit antwoord , wat niet afhankelijk is van OpenCV voor toetsenbordverwerking; gebruikt gewoon vloeken (wat over het algemeen is ingebouwd in Python op Unix).
toegevoegd de auteur JimB, de bron

2 antwoord

Een korte blik op de PiCamera-documentatie (En met 0% kennis in Python) Ik denk dat je misschien een syntaxisfout hebt?

syntaxisfout: buiten bereik 'doorbreken'

In principe probeer je een lus te doorbreken van een niet-lus code. Een syntaxisfout veroorzaken. Of breken is niet toegestaan ​​in die context.

Ik stel de volgende psuedo-codewijzigingen voor.

import time
import cv2   
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    camera.start_recording('one_day.h264', quality=20, bitrate=750000)
    ///Above line will start recording. I dont think you explicilty need to use wait recording as its already recording on another thread.
    #camera.wait_recording(24 * 60 * 60)

    //Psuedo code here- I dont know Python
    ///start  a never ending loop, like while stop!= true?
    ///  use pause(50) to allow recording to progress
    ///  see if the user pressed a key in the buffer
    ///  Not sure if this is correct?    key = cv2.waitkey(1) & 0XFF
    ///    if key == ord("q")
    ///      exit your loop by setting stop = true (or break, since you are in a loop)
    ///  no key pressed, start the loop again until broken or another condition is met

    /// Now only call stop
    camera.stop_recording()

In het document staat dat het gebruik van pause() geen fouten oplevert. Pas als u het stoppen met opnemen belt. Dit kan ertoe leiden dat de helft van je video niet wordt opgenomen. Misschien in plaats van pause() , gebruik je de wait_recording met een korte tijdsperiode (zoals 5 seconden?). Als er fouten optreden, zou een fout moeten genereren en zeg het je, in plaats van te doen alsof je doorgaat en je pas lang later realiseert.

Ik hoop dat dit helpt, vanuit een psuedo logisch oogpunt.

1
toegevoegd

Als het allemaal maar een syntaxisfout is, lijkt het alsof je een pauze() hebt buiten je if-statement. Het lijkt erop dat je 6 velden hebt gebruikt terwijl je er vier had moeten gebruiken. U mist ook een dubbele punt aan het einde van de instructie, waardoor het een onvolledig blok is.

Dus in plaats van dit:

    if key == ord("q")
          break

Inspringen met vier spaties en een dubbele punt gebruiken.

    if key == ord("q"):
        break
1
toegevoegd