web-dev-qa-db-fra.com

Comment convertir un MPEG2 en MP4 streamable ou fragmenté?

J'essaie de convertir des fichiers mpg (mpeg2) mythtv enregistrés en fichiers streamables mp4. La conversion en MP4 est simple, cependant, le fichier entier doit être converti avant de pouvoir être utilisé. Même en utilisant des outils de conversion qui placent "l'atome mobile" au début du fichier pour un streaming rapide, il faut que tout le mp4 soit encodé avant que cela ne se produise.

J'ai lu sur la documentation avconv que "Le multiplexeur mov/mp4/ismv prend en charge la fragmentation". qui peut placer un "faux" mov atom au début du fichier, puis en placer une nouvelle à chaque image clé dans tout le fichier afin que la vidéo puisse être diffusée en cours de transcodage ou d'interruption de la conversion .

Je crois avoir suivi les instructions avconv ( http://libav.org/avconv.html#MOV_002fMP4_002fISMV ) pour convertir un fichier, mais je continue à avoir des erreurs qui indiquent que le codeur ne comprend pas le paramètres. Ci-dessous se trouve ma commande et la sortie d'erreur générée. J'ai épuisé Google et moi-même à la recherche de réponses et je suis resté vierge, toute aide serait donc grandement appréciée.

Système sous Ubuntu 12.04x64 avec avconv version 0.8.1-4: 0.8.1-0ubuntu1.

Commander:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -c:a copy output.mp4

Erreur:

[mp4 muxer @ 0x36772e0] [Eval @ 0x7fffeddb69b0] Undefined constant or missing '(' in 'frag_keyframe'
[mp4 muxer @ 0x36772e0] Unable to parse option value "frag_keyframe+empty_moov"
[mp4 muxer @ 0x36772e0] Error setting option movflags to value frag_keyframe+empty_moov.
Output #0, mp4, to 'output.mp4':
    Stream #0.0: Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=-1--1, 90k tbn, 29.97 tbc
    Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, 384 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> libx264)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?)

J'ai essayé différents multiplexeurs (paramètres -f tels que h264, etc.) et d'autres erreurs telles que movflag n'était même pas prise en charge (logique).

Me manque-t-il un paquet, une dépendance ou juste le problème? Merci d'avance.

5
Scrubb

Il y a un bug déposé avec libav à propos de ce problème précis. Malheureusement, cela ne semble pas être abordé. Je pense qu'il est préférable de considérer avconv comme un bon outil de codage, mais pas un bon outil d'encapsulation.

La meilleure façon de s'y prendre est d'utiliser MP4Box à partir de GPAC . C'est un utilitaire qui semble être principalement concerné par l'encapsulation de flux de média dans des fichiers mp4. Il ne fait pas en/de/transcodage, par exemple. Si vous installez GPAC sur Ubuntu, vous pouvez dire:

MP4Box -add non-streamable.mp4 new-shiny-streamable.mp4

MP4Box rend par défaut les fichiers mp4 streamables:

À partir de la version 0.2.4, MP4Box stocke toujours le fichier avec un entrelacement de 0,5 seconde et des métadonnées au début, ce qui le rend approprié pour le streaming HTTP. ( source )

2
automatthias

Voir ici : c’est un guide ffmpeg, mais il s’applique également à avconv.

Je ne sais pas comment créer des fichiers pour la transmission en continu, mais l'erreur peut être due au fait qu'il manque un préréglage et éventuellement un paramètre de qualité (bien que je pense que avconv utilise -crf 23 par défaut, si aucun autre paramètre de qualité est fourni). Essayer:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -preset medium -c:a copy output.mp4

Les préréglages sont: ultra-rapide, ultra-rapide, très rapide, plus rapide, plus rapide, moyen, lent, plus lent et très lent. Les préréglages plus rapides vous donneront des codes plus rapides, mais des fichiers plus volumineux, tandis que les plus lents auront des fichiers plus petits, mais prendront plus de temps à créer. Il n'y a pas de différence de qualité entre les différents préréglages. Il existe également un préréglage "placebo", mais c'est une blague des développeurs x264, et devrait être ignoré.

Si cela ne fonctionne pas, vous pouvez essayer d'utiliser:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -crf 20 -preset medium -c:a copy output.mp4

20 est complètement arbitraire, choisissez le réglage de crf qui vous convient le mieux. Lower = meilleure qualité d'image, mais taille de fichier supérieure. Selon ce guide, vous devriez probablement utiliser entre 18 et 28 ans.

0
evilsoup