Je veux capturer une vidéo à partir d'une webcam et l'enregistrer dans un fichier MP4 en utilisant opencv. J'ai trouvé un exemple de code sur stackoverflow (ci-dessous) qui fonctionne très bien. Le seul problème, c’est que j’essaie de l’enregistrer en mp4, pas en avi Une partie de ce que je ne comprends pas, c'est que l'argument 'XVID' transmis à l'auteur de FOURCC est censé être, je pense, un codec MP4 (de ce lien ). Si je change le nom du fichier en 'output.mp4', cela m'indique que la balise n'est pas valide. Je dois donc croire que le codec XVID est en train de créer un fichier avi. Est-ce une question stupide? Comment puis-je écrire à un MP4?
J'ai trouvé des liens montrant comment convertir un fichier AVI en fichier MP4 après coup, mais cela semble inefficace. On dirait que je devrais être capable de le faire lors de l'écriture initiale.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.cv.CV_FOURCC(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
Cela a fonctionné pour moi.
self._name = name + '.mp4'
self._cap = VideoCapture(0)
self._fourcc = VideoWriter_fourcc(*'MP4V')
self._out = VideoWriter(self._name, self._fourcc, 20.0, (640,480))
Il y a des choses à changer dans votre code:
0x7634706d
: out = cv2.VideoWriter('output.mp4',0x7634706d , 20.0, (640,480))
Ce qui a fonctionné pour moi a été de m'assurer que la taille de la «trame» d'entrée est égale à la taille de la vidéo de sortie (dans ce cas, (680, 480)).
http://answers.opencv.org/question/27902/how-to-record-video-using-opencv-and-python/
Voici mon code de travail (Mac OSX Sierra 10.12.6):
cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))
while(True):
ret, frame = cap.read()
out.write(frame)
cv2.imshow('frame', frame)
c = cv2.waitKey(1)
if c & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()
Remarque: J'ai installé openh264 comme suggéré par @ 10SecTom mais je ne suis pas sûr que cela soit lié au problème.
Au cas où:
brew install openh264
Pour quelqu'un qui lutte encore avec le problème. D'après cet article J'ai utilisé cet exemple et cela fonctionne pour moi:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'X264')
out = cv2.VideoWriter('output.mp4',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
Je devais donc utiliser le codec cv2.VideoWriter_fourcc(*'X264')
. Testé avec OpenCV 3.4.3 compilé à partir de sources.
Le problème tel que OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: fallback to use tag 0x00000020/' ???'
est peut-être que la taille de votre vidéo de sortie n’est pas identique à celle de la vidéo originale. Vous pouvez commencer par regarder la taille d'image de la vidéo.