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