web-dev-qa-db-fra.com

Écriture de x264 à partir d'OpenCV 3 avec FFmpeg sous Linux

J'ai des problèmes pour écrire une vidéo h264 avec OpenCV 3 via FFmpeg ("'X', '2', '6', '4'" FOURCC). J'ai déjà vu tous les billets sur SO, mais rien n'y fait. Code:

cv::VideoWriter writer(output_path.string(),    CV_FOURCC('X','2','6','4'), 60, frame_size);

Sortie:

OpenCV: FFMPEG: la balise 0x34363258/'X264' n'est pas prise en charge avec l'ID de codec 28 et format 'mp4/MP4 (MPEG-4, partie 14)' OpenCV: FFMPEG: repli sur utilisez la balise 0x00000021/'! ???'

La vidéo résultante est extrêmement petite (octets) et illisible. Définir le paramètre four_cc sur -1 entraîne la création d'une "balise inconnue" dans FFmpeg. Je ne reçois pas d'invite pour choisir le codec comme d'autres l'ont suggéré.

Le document OpenCV 3 indique: 

Le backend FFMPEG avec le conteneur MP4 utilise nativement d'autres valeurs telles que fourcc code: see ObjectType , vous pouvez donc recevoir un message d'avertissement de OpenCV à propos de la conversion de code fourcc.

H264/x264 ne figure pas dans cette page et je ne sais pas comment interpréter cette affirmation, car plus tôt SO posts semblent tous lister X.2.6.4 comme code . L'utilisation de H.2.6.4 donne en réalité une sortie identique.

Des suggestions/solutions de contournement?

P.S. le ffmpeg est le plus récent des mainteneurs Ubuntu, il indique qu'il a été configuré avec --enable-libx264

EDIT: J'ai essayé d'utiliser le conteneur mkv à la place de mp4. L'avertissement concernant la non-prise en charge de la balise a disparu, mais la vidéo résultante est toujours illisible.

12
Greg Kramida

Le problème n'avait rien à voir avec l'avertissement affiché. J'essayais d'écrire des images sur un seul canal, alors que VideoWriter attendait une image couleur à 3 canaux (la valeur par défaut de isColor, le cinquième argument du constructeur de VideoWriter est "true"). La solution a été de définir isColor sur false.

4
Greg Kramida

Je pense que votre conclusion ici est la clé:

Le backend FFMPEG avec le conteneur MP4 utilise nativement d'autres valeurs sous forme de code fourcc: voir ObjectType, vous pouvez donc recevoir un message d'avertissement d'OpenCV concernant la conversion de code fourcc.

Les valeurs de balise mp4 implémentées pour ffmpeg le confirment et figurent dans le ff_mp4_obj_type[], dans isom.c . Le code dans cap_ffmpeg_impl.hpp de OpenCV doit probablement être mis à jour pour prendre en charge cette opération. Je me suis promené pendant une heure ou deux, j'ai réalisé que ce n'était pas anodin et j'ai été libéré sous caution.

Une solution consiste à sortir dans un fichier .avi. Il existe de nombreux exemples de personnes qui rencontrent des problèmes avec OpenCV et mp4 et se voient demander d'utiliser .mov ou .avi. ( En voici un .)

@Greg Kramida: la définition de isColor = false ne m'a pas aidé: le message est resté et mon fichier de sortie n'a plus que ~ 48 octets. Selon la documentation, il s'agit d'un drapeau Windows - quoi que ce soit pour moi sous Linux, ce n'est pas bon.

Avez-vous confirmé que vous pourriez générer x264 avec ffmpeg, seul?

Après avoir confirmé que libx264 a la valeur 0x21 lorsque je l’appelle sur la ligne de commande:

ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4

J'ai décidé d'utiliser 0x21 directement dans VideoWriter.open() . Cela génère un fichier vidéo valide et interprétable.

Pour référence, mon logiciel est ffmpeg 3.0:

ffmpeg -version
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame
libavutil      55. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

Et OpenCV 3.1.0 configuré avec:

cmake \
    -D WITH_IPP=ON \
    -D INSTALL_CREATE_DISTRIB=ON \
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local ..

x264 est la version libx264-142:AMD64 pour Debian Jessie.

6
Jameson

Le problème sur OpenCV quel message est:

OpenCV: FFMPEG: la balise 0x34363248/'H264' n'est pas prise en charge avec l'ID de codec 28 et le format 'MP4/MP4 (MPEG-4 Part 14)'. OpenCV: FFMPEG: solution de secours pour utiliser la balise 0x00000021/'! ???'

Elle est produite par les définitions de CV_FOURCC ('H', '2', '6', '4') cette valeur ne correspond pas à la valeur définie sur isom.c 

{AV_CODEC_ID_H264, 0x21}

Définir ensuite fourcc comme étant 0x21 cv :: VideoWriter fonctionne correctement, 

cv::VideoWriter VF;
VF.open(filename,0x21,fps,frameSize,true);

comme Jameson commente ci-dessus, 

"J'ai décidé d'utiliser 0x21 directement dans VideoWriter.open (). Cela génère un fichier vidéo valide et interprétable."