Odpowiedz

16

Z pewnością można używać klasy VideoWriter, ale trzeba użyć the correct FourCC code, która reprezentuje standard H264. FourCC oznacza Four Character Code, który jest identyfikatorem kodeka wideo, formatu kompresji, koloru lub formatu pikseli używanych w plikach multimedialnych.

W szczególności, podczas tworzenia obiektu VideoWriter, podczas tworzenia go należy podać kod FourCC. Skonsultować docs OpenCV więcej szczegółów: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

jestem przy założeniu, że używasz C++, a więc definicja konstruktora VideoWriter jest:

VideoWriter::VideoWriter(const String& filename, int fourcc, 
         double fps, Size frameSize, bool isColor=true) 

filename jest wyjście z pliku wideo, fourcc to kod FourCC dla kodu, którego chcesz użyć, fps to żądana liczba klatek na sekundę, frameSize to żądane wymiary wideo, a isColor określa, czy chcesz, aby wideo było kolorowe. Mimo że FourCC używa czterech znaków, OpenCV ma narzędzie, które analizuje FourCC i wypisuje pojedynczy identyfikator integer, który jest używany jako odnośnik, aby móc zapisać poprawny format wideo do pliku. Korzystasz z funkcji CV_FOURCC i określasz cztery pojedyncze znaki - każdy odpowiadający pojedynczemu znakowi w kodzie FourCC żądanego kodeka.

Konkretnie, można nazwać to tak:

int fourcc = CV_FOURCC('X', 'X', 'X', 'X'); 

Wymień X z każdego znaku, który należy do FourCC (w tej kolejności). Ponieważ chcesz standard H264, by utworzyć VideoWriter obiekt tak:

#include <iostream> // for standard I/O 
#include <string> // for strings 

#include <opencv2/core/core.hpp>  // Basic OpenCV structures (cv::Mat) 
#include <opencv2/highgui/highgui.hpp> // Video write 

using namespace std; 
using namespace cv; 

int main() 
{ 
    VideoWriter outputVideo; // For writing the video 

    int width = ...; // Declare width here 
    int height = ...; // Declare height here 
    Size S = Size(width, height); // Declare Size structure 

    // Open up the video for writing 
    const string filename = ...; // Declare name of file here 

    // Declare FourCC code 
    int fourcc = CV_FOURCC('H','2','6','4'); 

    // Declare FPS here 
    int fps = ...; 
    outputVideo.open(filename, fourcc, fps, S); 

    // Put your processing code here 
    // ... 

    // Logic to write frames here... see below for more details 
    // ... 

    return 0; 
} 

Alternatywnie, można po prostu to zrobić podczas deklarowania Twojego VideoWriter obiektu:

VideoWriter outputVideo(filename, fourcc, fps, S); 

Jeśli używasz powyżej, to nie jest wymagane, aby zadzwonić pod numer open, ponieważ spowoduje to automatyczne otwarcie programu zapisującego do zapisywania klatek do pliku.


Jeśli nie jesteś pewien, czy H.264 jest obsługiwany na komputerze, należy określić -1 jak kod fourcc, a okno powinno pojawić się podczas uruchamiania kodu, który wyświetla wszystkie dostępne kodeki wideo, które są na twoim komputerze. Chciałbym wspomnieć, że działa to tylko w systemie Windows. System Linux lub Mac OS nie wyświetla tego okna po określeniu -1. Innymi słowy:

VideoWriter outputVideo(filename, -1, fps, S); 

Możesz wybrać, który z nich jest najbardziej odpowiedni, jeśli H.264 nie istnieje na twoim komputerze. Gdy to zrobisz, OpenCV utworzy odpowiedni kod FourCC, który zostanie wprowadzony do konstruktora VideoWriter, dzięki czemu otrzymasz instancję VideoWriter reprezentującą VideoWriter, która zapisze ten typ wideo do pliku.

Gdy masz ramkę gotową, przechowywana w frm do zapisu do pliku, można to zrobić albo:

LUB

outputVideo.write(frm); 

Jako bonus, oto poradnik jak czytać/pisać wideo w OpenCV: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html - Jednak jest napisany dla Pythona, ale dobrze wiedzieć, że znajduje się u dołu łącza, jest lista kodów FourCC, które są znane k dla każdego systemu operacyjnego. BTW, kod FourCC, który określają dla standardu H264, w rzeczywistości jest 'X','2','6','4', więc jeśli 'H','2','6','4' nie działa, zastąp H przez X.

Kolejna mała uwaga. Jeśli korzystasz z systemu Mac OS, musisz użyć opcji 'A','V','C','1' lub 'M','P','4','V'. Z doświadczenia, 'H','2','6','4' lub 'X','2','6','4' przy próbie określenia kodu FourCC wydaje się nie działać.

+0

Próbowałem programu. Najpierw, gdy próbowałem użyć parametru Fourcc jako -1, nie pojawiło się żadne okno. Kiedy próbowałem używać x264, jak wspomniałeś, pojawił się błąd "nie można otworzyć błędu kodera: libx264" i kilka innych błędów, takich jak "wykryto złamane domyślne ustawienia ffmpeg". Co powinienem zrobić BTW Używam ubuntu 14.04 –

+1

To znaczy, że nie masz biblioteki H264 .... To jest kolejny post razem. Kiedy dostanę się do pracy, dam ci link. Przy tym -1 działa tylko w systemie Windows. Zapomniałem o tym wspomnieć. Ups! – rayryeng

+0

Dziękuję .. daj mi znać, kiedy pracujesz nad instalacją lib h264. . Muszę wiedzieć, że deperately: –

Powiązane problemy