Pourquoi la conversion de WMV en MP4 est-elle si lente?

12

J'essaie de convertir une vidéo de WMV en MP4 avec FFmpeg mais cela prend quelques heures. Si j'essaie de le convertir en AVI, cela ne prend que 10 à 15 minutes.

version ffmpeg

ffmpeg version N-43206-gf857465
built on Aug  4 2012 16:10:39 with gcc 4.7.1 (GCC)

Conversion en MP4

ffmpeg -i input.wmv -vcodec libx264 output.mp4

libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03427620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03427620] profile High, level 3.1
[libx264 @ 03427620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

Conversion en MP4 avec copy

ffmpeg -i input.wmv -c:v:1 copy output.mp4

  libavutil      51. 66.100 / 51. 66.100
  libavcodec     54. 49.100 / 54. 49.100
  libavformat    54. 22.100 / 54. 22.100
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3.  5.102 /  3.  5.102
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
[libx264 @ 03437620] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle Cac
he64
[libx264 @ 03437620] profile High, level 3.1
[libx264 @ 03437620] 264 - core 125 r2208 d9d2288 - H.264/MPEG-4 AVC codec - Cop
yleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deb
lock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 m
e_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro
ma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 i
nterlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1
b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=15 scenec
ut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=
0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--
1, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> libx264)

Conversion en AVI avec copy

ffmpeg -i input.wmv -c:v:1 copy output.avi

Input #0, asf, from 'input.wmv':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    encoder         : Lavf54.22.100
  Duration: 01:14:23.06, start: 0.000000, bitrate: 324 kb/s
    Stream #0:0: Video: msmpeg4 (MP43 / 0x3334504D), yuv420p, 1280x720, 15 tbr,
1k tbn, 1k tbc
Output #0, avi, to 'output.avi':
  Metadata:
    WMFSDKVersion   : 12.0.7601.17514
    WMFSDKNeeded    : 0.0.0.0000
    IsVBR           : 0
    ISFT            : Lavf54.22.100
    Stream #0:0: Video: mpeg4 (FMP4 / 0x34504D46), yuv420p, 1280x720, q=2-31, 20
0 kb/s, 15 tbn, 15 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (msmpeg4 -> mpeg4)

Y a-t-il des paramètres supplémentaires que je dois transmettre?

Giorgi
la source
Bien sûr, c'est plus rapide si vous copiez simplement le train de bits - avec copy, vous ne réencodez rien. De quel matériel disposez-vous, par exemple CPU? Quel est votre système d'exploitation et quelle version de FFmpeg est-ce?
slhck
@slhck: L'ordinateur n'est pas très rapide E5400 2,7 GHz mais pourquoi est-il lent pour mp4 alors qu'il est rapide pour avi?
Giorgi
Je ne vois aucune sortie AVI dans votre question. Pourriez-vous le mettre à jour avec la sortie complète?
slhck
@slhck: sortie avi ajoutée
Giorgi

Réponses:

17

Copie de flux

Lorsque vous appelez -c:v:1 copy, FFmpeg prendra le flux vidéo existant et le copiera en flux . Le flux vidéo est simplement encapsulé dans le conteneur extérieur, par exemple WMV, AVI ou MP4 - votre flux vidéo réel est msmpeg4et restera comme ça.

Si vous voulez en savoir plus sur ce dont je parle, voir ici: Qu'est-ce qu'un codec (par exemple DivX?), Et en quoi diffère-t-il d'un format de fichier (par exemple MPG)?

Lors de la copie du flux binaire, FFmpeg n'a pas besoin de réellement décoder et ré-encoder la vidéo réelle. Il suffit de fusionner le flux binaire vidéo dans un nouveau format de conteneur, ce qui est souvent une opération assez simple et ne prend donc pas longtemps.

Codage

Contrairement à cela, si vous appelez -vcodec libx264(ou -c:v libx264, la syntaxe que vous devez utiliser car elle vcodecest obsolète), FFmpeg sera obligé de décoder le flux binaire vidéo d' msmpeg4un format brut, puis de le diriger vers x264un encodeur H.264.

Le x264 est rapide, mais l'encodage de la vidéo prend du temps - en particulier lorsqu'il s'agit d'un contenu 720p. Et cela peut prendre plus d'une heure, surtout si votre saisie dépasse déjà une heure. De plus, votre processeur n'est peut-être pas le plus rapide. C'est la principale raison pour laquelle les anciens encodeurs visuels MPEG-4 comme XviD sont toujours là et très populaires: ils prennent moins de temps à encoder que les codecs H.264. Ils peuvent ne pas vous donner les meilleures performances en termes de qualité par rapport à la taille du fichier, mais ils sont rapides.

Cela étant dit: vous pouvez accélérer l'encodage x264 en forçant un preset. Les préréglages sont des paramètres d'optimisation de l'encodeur et vont de: ultra-rapide, ultra-rapide, très rapide, plus rapide, rapide, moyen, lent, plus lent, très lent. Votre commande pourrait alors ressembler à ceci:

ffmpeg -i input.wmv -c:v libx264 -preset fast out.mp4

Il devrait fonctionner plus rapidement que sans préréglage. Le seul inconvénient est qu'il n'obtient pas une qualité aussi bonne pour les mêmes taux de compression que, par exemple -preset veryslow,.

En dehors de cela, vous ne pouvez pas faire grand-chose à part investir dans un processeur rapide et vous assurer que vous exécutez une version récente de FFmpeg avec prise en charge x264.

Pour plus d'informations, voir Wiki FFmpeg: Guide d'encodage H.264 .

slhck
la source
Merci d'avoir répondu. Je ne sais pas si j'ai été clair ou pas, mais si j'utilise la copie, c'est toujours très lent. J'ai essayé votre commande et elle n'a traité que 4 secondes après 5 minutes. Ma vidéo dure environ 75 minutes et la conversion en avi ne prend que 15 minutes, mais mp4 prend plusieurs heures.
Giorgi
alors lequel est le meilleur pour l'encodage, libx264 ou h264?
Yohanes AI
@NPE Il n'y a pas de différence car ffmpeg utilise par défaut libx264lorsque vous spécifiez «h264» comme encodeur.
slhck
1
@PeterCordes Je l'ai changé en fast. Quelques statistiques intéressantes (si VMAF peut faire confiance ici): streaminglearningcenter.com/blogs/…
slhck
1
@PeterCordes Il existe certaines optimisations RC que VMAF ne gère pas bien, comme AQ: github.com/Netflix/vmaf/issues/21 . Je suis d'accord avec la partie UHD 1080p de haute qualité vs merdique. L'auteur du blog est très ouvert aux suggestions sur la façon d'améliorer ses tests; J'ai déjà commenté une mauvaise configuration de x265 il y a quelque temps.
slhck
3

Comme je jouais (des heures interminables) avec la conversion WMV-> MP4, j'ai trouvé un moyen ultra-rapide de le faire. Mais il a un prix: un prix de stockage. Si vous convertissez WMV en sans perte, puis de sans perte en MP4, il effectue la conversion complète en un rien de temps. Mais vous avez besoin de 100 fois d'espace disque dur pour stocker la version sans perte, ce qui est douloureux.

Il s'avère donc que vous pouvez choisir parmi des versions très lentes ou très intensives en disque dur de la conversion WMV-> MP4 et vous n'avez pas d'autre choix.

Conversion d'un WMV en AVI sans perte: ffmpeg.exe -i screen.wmv -vcodec ffv1 screen.avi Puis conversion d'AVI sans perte en MP4 (ou WebM, peu importe) ffmpeg.exe -i screen.avi screen.mp4

Super rapide!

Marcell Foti
la source