web-dev-qa-db-fra.com

Écrire une vidéo mp4 en utilisant pencon

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()
13
Gadzooks34

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))
24
10SecTom

Il y a des choses à changer dans votre code:

  1. Changez le nom de votre sortie en 'output.mp4' (changez en .mp4)
  2. J'ai eu les mêmes problèmes que les gens ont dans les commentaires, donc j'ai changé le fourcc à 0x7634706d: out = cv2.VideoWriter('output.mp4',0x7634706d , 20.0, (640,480))
2
Alan Soder

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
0
ling

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. 

0
Ivan Talalaev

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.

0
TanLingxiao