2017-05-12 4 views
1

Auf OSX kann ich von meiner Webcam aufnehmen und eine Videodatei mit dem folgenden einfachen Skript schreiben:Wie mp4 Videodatei mit H264 Codec schreiben?

import cv2 
camera = cv2.VideoCapture(0) 

# Define the codec and create VideoWriter object to save the video 
fourcc = cv2.VideoWriter_fourcc(*'XVID') 
video_writer = cv2.VideoWriter('output.avi', fourcc, 25.0, (640, 480)) 

while True: 
    try: 
     (grabbed, frame) = camera.read() # grab the current frame 
     frame = cv2.resize(frame, (640, 480)) # resize the frame 
     video_writer.write(frame) # Write the video to the file system 

    except KeyboardInterrupt: 
     camera.release() 
     break 

Die resultierende AVI-Datei allerdings recht groß ist. Ich möchte eine kleinere Datei, vorzugsweise ein mp4. Also änderte ich den Dateinamen auf output.mp4 und den fourcc Codec zu H264. Das schreibt eine Videodatei, die funktioniert, aber gibt mir die folgende Fehlermeldung:

$ python write_video_file.py 
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 28 and format 'mp4/MP4 (MPEG-4 Part 14)' 
OpenCV: FFMPEG: fallback to use tag 0x00000021/'!???' 

Da ich dachte, ich vermisse den H264-Codec in ffmpeg entschied ich mich ffmpeg und opencv zu deinstallieren und neu installieren sie wieder mit H264 Unterstützung. Dazu habe ich die folgenden Befehle:

# First ffmpeg 
brew install ffmpeg --with-fdk-aac --with-libvidstab --with-openh264 \ 
     --with-openjpeg --with-openssl --with-tools --with-webp --with-x265 --with-zeromq 
# then opencv3 
brew tap homebrew/science 
brew install opencv3 --with-contrib --with-ffmpeg --with-tbb 

Danach ich das Drehbuch wieder lief, die folgenden Kombinationen verwendet: Leider

  • output.mp4 mit H264
  • output.mp4 mit X264

Ich bekomme immer noch die OpenCV Warnungen/Fehler. Die Datei ist lesbar, aber es ärgert mich immer noch, dass ich diese Fehler erhalte. Hat jemand eine Idee, wie ich OpenCV mp4 Videodatei mit dem H264 Codec schreiben kann?

Alle Tipps sind willkommen!

+0

Haben Sie einen Neustart versucht? –

+0

@StavrosAvramidis - Nein, das Neustarten hat nicht geholfen – kramer65

+0

Stellen Sie sicher, dass Sie ffdshow haben (sowohl x32 als auch x64) –

Antwort

0

Ich habe schon versucht, auf macOS die Arbeit Codecs und das Auffinden eine Liste von Video-Codecs zu finden, mit denen Container, und dann, wenn Quicktime tatsächlich die resultierenden Dateien lesen kann.

kann ich meine Ergebnisse wie folgt zusammenfassen:

.mov container and fourcc('m','p','4','v') work and QuickTime can read it 
.mov container and fourcc('a','v','c','1') work and QuickTime can read it 
.avi container and fourcc('F','M','P','4') works but QuickTime cannot read it without conversion 

I h264 Video in einem mp4 Container schreiben kam an, wie man wollte, mit nur nicht VideoWriter Moduls OpenCV.Stattdessen änderte ich den Code (Mine passiert C++ sein) nur raw bgr24 Formatdaten - das ist, wie OpenCV mag sowieso Pixel speichern:

So ist die Ausgabe eines Rahmens von Video in einem Frame wird genannt Mat gespeichert:

cout.write(reinterpret_cast<const char *>(Frame.data),width*height*3); 

und dann Rohr Sie die Ausgabe Ihres Programms in ffmpeg wie folgt aus:

./yourProgram | ffmpeg -y -f rawvideo -pixel_format bgr24 -video_size 1024x768 -i - -c:v h264 -pix_fmt yuv420p video.mp4 

Ja, ich weiß, ich habe einige Annahmen gemacht:

  • , dass die Daten CV8_UC3,
  • , dass die Größen in OpenCV und ffmpeg und
  • überein, dass es keine Polsterung oder verrückt schreiten in den OpenCV Daten,

aber die grundlegende Technik funktioniert, und Sie können es auch für andere Größen und Situationen anpassen.

Verwandte Themen