web-dev-qa-db-fra.com

Écriture d'un fichier vidéo à l'aide de la compression H.264 dans OpenCV

Comment écrire une vidéo en utilisant la compression H.264 avec la classe VideoWriter dans OpenCV? Je veux essentiellement obtenir une vidéo de la webcam et l'enregistrer après avoir appuyé sur un caractère. Le fichier vidéo de sortie est énorme lorsque vous utilisez la compression MPEG4 Partie 2.

12
Kausic Gunasekkar

Vous pouvez certainement utiliser la classe VideoWriter, mais vous devez utiliser le code FourCC correct qui représente la norme H264. FourCC signifie Four Character Code, qui est un identifiant pour un codec vidéo, un format de compression, une couleur ou un format de pixel utilisé dans les fichiers multimédias.

Plus précisément, lorsque vous créez un objet VideoWriter, vous spécifiez le code FourCC lors de sa construction. Consultez les documents OpenCV pour plus de détails: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

Je suppose que vous utilisez C++, et donc la définition du constructeur VideoWriter est:

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

filename est la sortie du fichier vidéo, fourcc est le code FourCC pour le code que vous souhaitez utiliser, fps est la fréquence d'images souhaitée, frameSize correspond aux dimensions souhaitées de la vidéo et isColor spécifie si vous souhaitez ou non que la vidéo soit en couleur. Même si FourCC utilise quatre caractères, OpenCV a un utilitaire qui analyse FourCC et génère un ID entier unique qui est utilisé comme une recherche pour pouvoir écrire le format vidéo correct dans un fichier. Vous utilisez le CV_FOURCC, et spécifiez quatre caractères simples - chacun correspondant à un seul caractère dans le code FourCC du codec souhaité.

Plus précisément, vous l'appeleriez comme ceci:

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

Remplacez X par chaque caractère appartenant au FourCC (dans l'ordre). Parce que vous voulez la norme H264, vous devez créer un objet VideoWriter comme ceci:

#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;
}

Alternativement, vous pouvez simplement le faire lors de la déclaration de votre objet VideoWriter:

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

Si vous utilisez ce qui précède, il n'est pas nécessaire d'appeler open car cela ouvrira automatiquement le programme d'écriture pour écrire des images dans un fichier.


Si vous n'êtes pas sûr que H.264 soit pris en charge sur votre ordinateur, spécifiez -1 comme code FourCC, et une fenêtre devrait apparaître lorsque vous exécutez le code qui affiche tous les codecs vidéo disponibles sur votre ordinateur. Je voudrais mentionner que cela ne fonctionne que pour Windows. Linux ou Mac OS ne fait pas apparaître cette fenêtre lorsque vous spécifiez -1. En d'autres termes:

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

Vous pouvez choisir celui qui convient le mieux si H.264 n'existe pas sur votre ordinateur. Une fois cela fait, OpenCV créera le bon code FourCC à saisir dans le constructeur VideoWriter afin que vous obteniez une instance de VideoWriter qui représente un VideoWriter qui écrira ce type de vidéo dans un fichier .

Une fois que vous avez un cadre prêt, stocké dans frm pour l'écriture dans le fichier, vous pouvez faire soit:

outputVideo << frm; 

OR

outputVideo.write(frm);

En bonus, voici un tutoriel sur la façon de lire/écrire des vidéos dans OpenCV: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html - Cependant, il est écrit pour Python, mais ce qui est bon à savoir est près du bas du lien, il y a une liste de codes FourCC qui sont connus pour fonctionner pour chaque système d'exploitation. BTW, le code FourCC qu'ils spécifient pour la norme H264 est en fait 'X','2','6','4', donc si 'H','2','6','4' ne fonctionne pas, remplacez H par X.

Une autre petite note. Si vous utilisez Mac OS, ce que vous devez utiliser est 'A','V','C','1' ou 'M','P','4','V'. Par expérience, 'H','2','6','4'ou 'X','2','6','4'en essayant de spécifier le code FourCC ne semble pas fonctionner.

19
rayryeng