GNU/Linux >> Linux Esercitazione >  >> Linux

Invia immagini OpenCV non elaborate a FFmpeg

Sono un po' in ritardo, ma il mio potente VidGear La libreria Python automatizza il processo di pipelining dei frame OpenCV in FFmpeg su qualsiasi piattaforma . Ecco un esempio base di Python:

# import libraries
from vidgear.gears import WriteGear
import cv2

output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer

stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device

writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4' 

# infinite loop
while True:
    
    (grabbed, frame) = stream.read()
    # read frames

    # check if frame empty
    if not is grabbed:
        #if True break the infinite loop
        break
    

    # {do something with frame here}
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # write a modified frame to writer
    writer.write(gray) 
       
    # Show output window
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

cv2.destroyAllWindows()
# close output window

stream.release()
# safely close video stream
writer.close()
# safely close writer

Fonte:https://abhitronix.github.io/vidgear/latest/gears/writegear/compression/usage/#using-compression-mode-with-opencv

Puoi dare un'occhiata a VidGear Docs per applicazioni e funzionalità più avanzate.

Spero di esserti stato d'aiuto!


Ci sono voluti un po' di tentativi, ma l'ho capito usando il demuxer rawvideo di FFmpeg:

python capture.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - foo.avi

Poiché non esiste un'intestazione nel video non elaborato che specifichi i parametri video assunti, l'utente deve specificarli per poter decodificare correttamente i dati:

  • -framerate Imposta la frequenza dei fotogrammi del video in ingresso. Il valore predefinito è 25.
  • -pixel_format Imposta il formato dei pixel del video di input. Il valore predefinito è yuv420p.
  • -video_size Imposta la dimensione del video in ingresso. Non esiste un valore predefinito, quindi questo valore deve essere specificato in modo esplicito.

Ed ecco qualcosa in più per gli utenti esperti. Stessa cosa ma utilizzo di VLC per lo streaming dell'output live sul Web, formato Flash:

python capture.py | cvlc --demux=rawvideo --rawvid-fps=30 --rawvid-width=320 --rawvid-height=240  --rawvid-chroma=RV24 - --sout "#transcode{vcodec=h264,vb=200,fps=30,width=320,height=240}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=:8081/stream.flv}"

Modifica:crea uno stream webm usando ffmpeg e ffserver

python capture.py | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 640x480 -framerate 25 -i - http://localhost:8090/feed1.ffm

Linux
  1. Come installare FFmpeg in Linux

  2. Le mie 5 immagini di container Linux preferite

  3. Linux – Modalità tastiera grezza?

  4. Fai uscire Tail -f su un tubo rotto?

  5. Qual è il modo di usare Xargs attraverso un tubo?

Come installare FFmpeg su Linux

PiShrink:riduci le immagini di Raspberry Pi

Scarica Manjaro 17 – Immagini ISO DVD

Come inviare comandi a qualsiasi terminale?

Tubo da B a D? – A&&B || C | D?

Come installare OpenCV su Ubuntu 20.04