Llego un poco tarde, pero mi poderoso VidGear
La biblioteca de Python automatiza el proceso de canalización de marcos OpenCV en FFmpeg en cualquier plataforma . Aquí hay un ejemplo básico de 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
Fuente:https://abhitronix.github.io/vidgear/latest/gears/writegear/compression/usage/#using-compression-mode-with-opencv
Puede consultar VidGear Docs para obtener aplicaciones y funciones más avanzadas.
¡Espero que eso ayude!
Tomó un montón de manipulación, pero lo descubrí usando el demuxer FFmpeg rawvideo:
python capture.py | ffmpeg -f rawvideo -pixel_format bgr24 -video_size 640x480 -framerate 30 -i - foo.avi
Dado que no hay un encabezado en el video sin procesar que especifique los parámetros de video asumidos, el usuario debe especificarlos para poder decodificar los datos correctamente:
-framerate
Establezca la velocidad de fotogramas del video de entrada. El valor predeterminado es 25.-pixel_format
Configure el formato de píxel de video de entrada. El valor predeterminado es yuv420p.-video_size
Establezca el tamaño del video de entrada. No existe un valor predeterminado, por lo que este valor debe especificarse explícitamente.
Y aquí hay algo extra para los usuarios avanzados. Lo mismo pero usando VLC para transmitir la salida en vivo a la 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}"
Editar:Cree una transmisión webm usando ffmpeg y ffserver
python capture.py | ffmpeg -f rawvideo -pixel_format rgb24 -video_size 640x480 -framerate 25 -i - http://localhost:8090/feed1.ffm