it-swarm.com.de

Ein mp4-Video mit Python opencv schreiben

Ich möchte Videos von einer Webcam aufnehmen und mit opencv in einer mp4-Datei speichern. Ich habe Beispielcode auf stackoverflow (unten) gefunden, der hervorragend funktioniert. Das einzige Problem ist, dass ich versuche, es als mp4 zu speichern, nicht als avi. Was ich nicht verstehe, ist, dass das an den FOURCC-Writer übergebene 'XVID'-Argument ein mp4-Codec (von dieser Link ) sein sollte. Wenn ich den Dateinamen in 'output.mp4' ändere, wird mir mitgeteilt, dass das Tag ungültig ist. Daher muss ich glauben, dass der XVID-Codec tatsächlich eine Avi-Datei erstellt. Ist das eine dumme Frage? Wie schreibe ich in ein mp4? 

Ich habe Links gefunden, die zeigen, wie man ein avi nach der Tatsache in ein mp4-Format umwandelt, aber das scheint ineffizient zu sein. Anscheinend sollte ich es während des ersten Schreibens tun können.

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

Das hat bei mir funktioniert.

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

Es gibt einige Dinge, die Sie in Ihrem Code ändern müssen:

  1. Ändern Sie den Namen Ihrer Ausgabe in 'output.mp4' (ändern Sie sie in .mp4)
  2. Ich hatte die gleichen Probleme wie die Leute in den Kommentaren, also änderte ich das fourcc in 0x7634706d: out = cv2.VideoWriter('output.mp4',0x7634706d , 20.0, (640,480))
2
Alan Soder

Was für mich funktionierte, war sicherzustellen, dass die Größe des Eingangsrahmens der Größe des Ausgabevideos entspricht (in diesem Fall (680, 480)).

http://answers.opencv.org/question/27902/how-to-record-video-using-opencv-and-python/

Hier ist mein Arbeitscode (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()

Hinweis: Ich habe openh264 wie von @ 10SecTom vorgeschlagen installiert. Ich bin mir jedoch nicht sicher, ob dies für das Problem relevant war.

Nur für den Fall:

brew install openh264
0
ling

Für jemanden, der immer noch mit dem Problem zu kämpfen hat. Nach diesem Artikel habe ich dieses Beispiel verwendet und es funktioniert für mich:

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

Also musste ich cv2.VideoWriter_fourcc(*'X264') codec verwenden. Getestet mit OpenCV 3.4.3 aus Quellen. 

0
Ivan Talalaev

Das Problem wie 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/' ???' ist möglicherweise, dass die Größe des Ausgabevideos nicht mit dem Originalvideo übereinstimmt. Sie können zuerst die Bildgröße des Videos betrachten.

0
TanLingxiao