"Conversion failed" pour un mp4 contenant du vp9 et opus

Pas sûr que ce soit un bug (je poste donc ici).

J’ai un fichier vidéo avec vp9 et opus (encapuslé en mkv, testé aussi en mp4) qui provient d’un enregistrement d’une visio (avec BigBlueButton, récupéré par bbb-downloader). Pour ce fichier (et celui-ci uniquement) l’encodage de peertube (en v.2.1.1 encore, je ne peux pas tester sur la 2.4 mais je peux fournir le fichier) ne fonctionne pas.

Job: 961
Type: video-transcoding
Processed on Nov 19, 2020, 2:13:31 PM
Finished on Nov 19, 2020, 2:13:32 PM

{
  "type": "optimize",
  "videoUUID": "ca138584-6917-4220-8a10-4817bcb4866e",
  "isNewVideo": false
}

Error: ffmpeg exited with code 1: Conversion failed!

    at ChildProcess.<anonymous> (/var/www/peertube/versions/peertube-v2.1.1/node_modules/fluent-ffmpeg/lib/processor.js:182:22)
    at ChildProcess.emit (events.js:198:13)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)

J’ai essayé de relancer l’encodage par la commande CLI « create-transcoding-job » et de renvoyer le fichier.

Détails de ffmpeg -i sur le fichier :

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '....mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.45.100
  Duration: 01:10:52.00, start: 0.013000, bitrate: 234 kb/s
    Stream #0:0(und): Video: vp9 (Profile 0) (vp09 / 0x39307076), yuv420p(tv), 1280x720, 182 kb/s, SAR 1:1 DAR 16:9, 24 fps, 24 tbr, 16k tbn, 16k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: opus (Opus / 0x7375704F), 48000 Hz, stereo, fltp, 46 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Bonjour,

En utilisant le ffmpeg du serveur, vous arrivez à réencoder la vidéo ? (par exemple ffmpeg -i input.mp4 -c:v libx264 toto.mp4).

Non.

$ ffmpeg -i seminaire-strasbourg_fixall.mp4 -c:v libx264 test.mp4
ffmpeg version 4.3.1-5 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10 (Debian 10.2.0-15)
  configuration: --prefix=/usr --extra-version=5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --disable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'seminaire-strasbourg_fixall.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.45.100
  Duration: 01:10:52.00, start: 0.013000, bitrate: 234 kb/s
    Stream #0:0(und): Video: vp9 (Profile 0) (vp09 / 0x39307076), yuv420p(tv), 1280x720, 182 kb/s, SAR 1:1 DAR 16:9, 24 fps, 24 tbr, 16k tbn, 16k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: opus (Opus / 0x7375704F), 48000 Hz, stereo, fltp, 46 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
File 'test.mp4' already exists. Overwrite? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (vp9 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (opus (native) -> aac (native))
Press [q] to stop, [?] for help
Too many packets buffered for output stream 0:1.
[aac @ 0x55e1f2c77b00] Qavg: 226.718
[aac @ 0x55e1f2c77b00] 2 frames left in the queue on closing
Conversion failed!

Tentez :

ffmpeg -i input.mp4 -c:v libx264 -max_muxing_queue_size 1024 toto.mp4

En effet ça fonctionne avec -max_muxing_queue_size 1024.

Quel est le problème exactement ? L’audio commence avant la vidéo ? Est-ce qu’il est possible d’intégrer l’option à la commande de transcodage pour peertube (ci-dessous) ?

sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-transcoding-job -- -v ca138584-6917-4220-8a10-4817bcb4866e

Il semble que ce soit une régression dans ffmpeg : #6375 ([bug][regression] Too many packets buffered for output stream) – FFmpeg

Est-ce qu’il est possible d’intégrer l’option à la commande de transcodage pour peertube (ci-dessous) ?

Malheureusement non. Mais je vais voir pour ajouter cet argument dans PeerTube. Ce sera disponible dans la prochaine version.

Ok merci pour les explications.

Si j’encode manuellement en local la vidéo (avec -max_muxing_queue_size 1024), que je l’envoie sur le serveur que j’utilise ce nouveau fichier en remplacement de l’ancien, est-ce que peertube pourra générer les résolutions automatiquement ? J’essaie

Oui, si vous faites une première passe en local en convertissant en x264/aac ça devrait passer après l’upload.

en effet, ça a fonctionné. Merci pour l’aide !

Pour ce qui est de l’origine du problème, dans mon expérience le problème apparaît habituellement avec une vidéo qui a été coupée: il est facile de couper l’audio compressé plus ou moins n’importe où sans avoir besoin de réencoder le tout, par contre pour la vidéo c’est beaucoup plus difficile, vu que la majorité des images ne sont représentées que par leurs changements par rapport à une image « clé » précédente.
Donc si tu veux couper de la vidéo sans réencoder, ffmpeg doit couper là où il y a une « image clé » et il peut y passer pas mal de temps entre chaque image clé.

Dans mes scripts de coupure, j’ai résolu ça en utilisant ffmpeg -ss [START] -i [FILE] ...: le fait de placer le -ss avant le -i dit à ffmpeg (plus ou moins) de ne pas couper exactement là où je le demande mais à l’endroit le plus proche où il peut couper aussi bien l’audio que la vidéo.

Merci pour l’info. Je ne savais pas que la place de -ss dans la commande pouvait jouer.

j’avais en effet coupé la vidéo (avec ffmpeg --ss et --to)