171 votes

conversion de webm en mp4 à l'aide de ffmpeg

Lorsque j'essaie de convertir un fichier webm en mp4, la sortie est très très hachée et il semble que de nombreuses images aient été supprimées par ffmpeg.

J'ai utilisé les commandes suivantes pour convertir

ffmpeg -i movie.webm movie.mp4
ffmpeg -i movie.webm -vcodec libx264 movie.mp4
ffmpeg -i movie.webm -vcodec libx264 -qscale 0 movie.mp4

Ils ont tous le même problème. Lorsque j'utilise ffprobe, les images semblent s'afficher plus ou moins correctement.

UPDATE :

 built on Jun 14 2013 14:31:50 with gcc 4.7 (Ubuntu/Linaro 4.7.2-2ubuntu1)
  configuration: --prefix=/home/user2/ffmpeg_build --extra-cflags=-I/home/user2/ffmpeg_build/include --extra-ldflags=-L/home/pavan4/ffmpeg_build/lib --bindir=/home/pavan4/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab
  libavutil      52. 35.101 / 52. 35.101
  libavcodec     55. 16.100 / 55. 16.100
  libavformat    55.  8.102 / 55.  8.102
  libavdevice    55.  2.100 / 55.  2.100
  libavfilter     3. 77.101 /  3. 77.101
  libswscale      2.  3.100 /  2.  3.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  3.100 / 52.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'

Input #0, matroska,webm, from '1.webm':
  Duration: 00:00:10.64, start: 0.000000, bitrate: 5024 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 1k fps, 1k tbr, 1k tbn, 1k tbc (default)
[libx264 @ 0x1d966a0] using SAR=1/1
[libx264 @ 0x1d966a0] MB rate (3600000) > level limit (2073600)
[libx264 @ 0x1d966a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0x1d966a0] profile High, level 5.2
[libx264 @ 0x1d966a0] 264 - core 133 r2 a3ac64b - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=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=25 scenecut=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 '1_conv4.mp4':
  Metadata:
    encoder         : Lavf55.8.102
    Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 16k tbn, 1k tbc (default)
Stream mapping:
Stream #0:0 -> #0:0 (vp8 -> libx264)
Press [q] to stop, [?] for help
frame=  168 fps=0.0 q=33.0 size=      62kB time=00:00:00.11 bitrate=4606.0kbits/frame=  293 fps=230 q=33.0 size=     138kB time=00:00:00.23 bitrate=4809.7kbits/

video:5620kB audio:0kB subtitle:0 global headers:0kB muxing overhead 2.212461%
[libx264 @ 0x1d966a0] frame I:46    Avg QP:18.50  size: 39849
[libx264 @ 0x1d966a0] frame P:2940  Avg QP:18.27  size:  1222
[libx264 @ 0x1d966a0] frame B:7651  Avg QP:17.68  size:    43
[libx264 @ 0x1d966a0] consecutive B-frames:  4.0%  0.2%  0.3% 95.5%
[libx264 @ 0x1d966a0] mb I  I16..4: 19.9% 63.2% 16.9%
[libx264 @ 0x1d966a0] mb P  I16..4:  0.2%  0.5%  0.1%  P16..4:  3.9%  1.1%  0.6%  0.0%  0.0%    skip:93.6%
[libx264 @ 0x1d966a0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.2%  0.0%  0.0%  direct: 0.0%  skip:99.8%  L0:25.1% L1:74.9% BI: 0.0%
[libx264 @ 0x1d966a0] 8x8 transform intra:63.6% inter:75.9%
[libx264 @ 0x1d966a0] coded y,uvDC,uvAC intra: 61.5% 53.4% 24.4% inter: 0.5% 0.5% 0.0%
[libx264 @ 0x1d966a0] i16 v,h,dc,p: 52% 19% 19% 11%
[libx264 @ 0x1d966a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 32% 17% 13%  4%  6%  9%  5%  8%  6%
[libx264 @ 0x1d966a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 18% 14%  5%  8% 10%  6%  6%  3%
[libx264 @ 0x1d966a0] i8c dc,h,v,p: 55% 17% 24%  4%
[libx264 @ 0x1d966a0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x1d966a0] ref P L0: 82.5% 13.2%  4.0%  0.3%
[libx264 @ 0x1d966a0] ref B L0: 60.2% 39.2%  0.6%
[libx264 @ 0x1d966a0] ref B L1: 98.5%  1.5%
[libx264 @ 0x1d966a0] kb/s:4327.77

0 votes

Un commentaire général sur "comment demander", veuillez ajouter au moins une sortie de la ligne de commande de ffmpeg pour voir la version de ffmpeg et toutes les informations restantes sur votre flux de fichiers d'entrée à votre mapping de flux de fichiers de sortie.

0 votes

@alexbuisson J'ai mis à jour le post :) Je pensais faire quelque chose de trivial donc je n'ai pas ajouté la sortie.

0 votes

Cela ne devrait pas être si trivial, je viens de faire le même genre de conversion avec ffmpeg ` build on Jun 4 2013 01:41:53 with gcc 4.7.3 (GCC)` sans problème, les mp4 en sortie ont une qualité correcte. Je ne sais pas comment vous aider :(

194voto

alexbuisson Points 2511

Comme votre fichier d'entrée rapporte une valeur de frame rate étrange 1k fps provenant de la valeur tbs et tbr (regardez ici pour leur définition )

le codeur génère un résultat différent, 16k tbn, 1k tbc (default)

Donc, en appelant :

ffmpeg -fflags +genpts -i 1.webm -r 24 1.mp4

Vous configurez ffmpeg pour qu'il génère de nouveaux pts (a.k.a Presentation TimeStamp) pour chaque image et vous définissez la fréquence d'images cible à 24.

Ainsi, les informations de votre fichier mp4 de sortie ( ffmpeg -i .... ) passent de

Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 4327 kb/s, 1000.09 fps, 1k tbr, 16k tbn, 2k tbc

à

Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1670 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc

0 votes

Je viens de remarquer que pour le mp4 ffmpeg change automatiquement le bitrate à 2M alors que la source est à 5M. Est-ce que je peux régler automatiquement le bitrate pour qu'il soit choisi à partir de la source ?

0 votes

Aucune idée, c'est une question récurrente sur SOF et SuperUser, mais demandez encore quelqu'un peut avoir une solution, de mon côté je mettrais chaque ligne dans un script, pour d'abord lancer un ffmpeg -i sur l'entrée, en attrapant&parsant la sortie de la ligne de commande pour trouver le bitrate, et après avoir réutilisé cette valeur pour définir le paramètre -b:v valeur à transcoder...

1 votes

Ce fichier mp4 n'est pas lisible sur le navigateur, pourquoi ?

82voto

LordNeckbeard Points 9321

Re-muxer WebM en MP4

Si vous voulez copie du flux (re-mux) et éviter le ré-encodage :

ffmpeg -i input.webm -c copy output.mp4

Cela copiera la vidéo VP9/VP8 et l'audio Opus/Vorbis de WebM vers MP4. C'est comme un "copier-coller". Il n'y a pas de réencodage, donc aucune perte de qualité et le processus est très rapide.

Si vous obtenez l'erreur : "le support des opus en MP4 est expérimental"

Si vous obtenez cette erreur :

opus in MP4 support is experimental, add '-strict -2' if you want to use it.
Could not write header for output file #0 (incorrect codec parameters ?): Experimental feature

Alors soit :

  • Utilisez une version plus récente ffmpeg car l'Opus en MP4 n'est plus expérimental dans les versions plus récentes ffmpeg versions.
  • Ou ajouter -strict experimental (ou l'alias -strict -2 ) si vous êtes coincé avec des ffmpeg .

1 votes

C'est la réponse qui devrait être acceptée, selon l'IMHO. Le recodage doit être évité à moins qu'il ne soit absolument nécessaire.

29 votes

Cela ne fonctionne pas, j'obtiens toujours cette erreur : [mp4 @ 0x5608e2b2ca00] Could not find tag for codec vp8 in stream #0, codec not currently supported in container. Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

39voto

Calaf Points 1406

Je résume ici les résultats de la conversion de webm en mp4 en utilisant les nombreuses options de ligne de commande proposées.

Nous supposons ici que si vous posez cette question, c'est que vous êtes obligé d'utiliser webm parce que l'émulateur d'appareil Android au sein de Android Studio l'a généré pour vous, et vous êtes sur un Mac donc vous aimeriez vraiment utiliser iMovie pour éditer la vidéo.

1 ffmpeg -i vid.webm vid-1.mp4 Réf. Prend 17,8 secondes. Le fichier de sortie est de 1,5 Mo.

2 ffmpeg -i vid.webm -crf 1 -c:v libx264 vid-2.mp4 Prend 18 secondes. Le fichier de sortie est de 7,6 Mo.

3 ffmpeg -i vid.webm -crf 0 -c:v libx264 vid-3.mp4 Réf. Il faut 21 secondes. Le fichier de sortie est de 11,9 Mo.

4 ffmpeg -fflags +genpts -i vid.webm -r 24 vid-4.mp4 Réf. Cela prend 0,16 seconde. Le fichier de sortie est de 1,5 Mo.

5 ffmpeg -i vid.webm -c copy vid-5.mp4 Réf. Prend 2,8 secondes. Le fichier de sortie est de 64,6 Mo.

6 ffmpeg -i vid.webm -strict experimental vid-6.mp4 Réf. Prend 18 secondes. Le fichier de sortie est de 1,5 Mo.

7 ffmpeg -i vid.webm -c copy -strict experimental vid-7.mp4 Réf. Il faut 0,16 seconde. Le fichier de sortie est de 64,6 Mo.

8 ffmpeg -i vid.webm -c:v copy -strict experimental vid-8.mp4 Aussi Réf. Prend 0,69 seconde. Le fichier de sortie est de 64,5 Mo.

Seuls les numéros 1, 2, 3, 4 et 6 peuvent être importés sur le site. iMovie (10.2).

La version de ffmpeg utilisé est de 4,3.

C'est un premier pas. Je laisse de côté la comparaison de qualité plus compliquée.

Le pire piège qui vous attend est peut-être que iMovie veut vraiment produire un film en 1920x1080, et il se peut donc que vous ayez deux grandes barres noires sur le côté. Si vous montez une démo de votre application en mode portrait, vous perdrez beaucoup d'espace. Si vous le pouvez, l'idéal serait de produire une vidéo dans cette résolution.

La question qui suit immédiatement est la suivante : en supposant que vous n'ayez vraiment pas besoin de la poussée lourdement Final Cut Pro (parce que vous êtes un programmeur, pas un éditeur vidéo), FCP vous permettra-t-il de définir votre propre résolution ?

0 votes

Je ne vois pas en quoi cette comparaison est utile si l'on ne précise pas la taille du fichier INPUT.

0 votes

Mon option préférée numéro 4 - résultat rapide et petit : ffmpeg -fflags +genpts -i vid.webm -strict experimental -r 24 vid-4.mp4

0 votes

Quelle est la partie " -crf 1 " ? J'ai fait un "man ffmpeg" et cette option n'était pas listée. Mon ffmpeg est sur debian - "ffmpeg version 4.3.3-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers".

17voto

Cloud Cho Points 129

J'ai pu convertir en ffmpeg -i video.webm -strict experimental video.mp4 .

3 votes

-strict experimental n'est pas nécessaire lors du réencodage en MP4, comme dans votre exemple. Cependant, il est nécessaire si vous voulez re-muxer VP8/VP9 en MP4 en ajoutant -c copy .

0 votes

@Ilogn, j'ai essayé hier sans strict mais je n'ai pas réussi à la convertir. Essayez la vidéo à l'adresse suivante Voiture électrique ...c'est un webm format vidéo.

2 votes

Pour moi, cela fonctionne très bien sans -strict . Je suppose que vous obtenez l'erreur suivante The encoder 'aac' is experimental but experimental codecs are not enabled . Cela indique que votre ffmpeg est très ancien : les versions récentes n'ont pas besoin de -strict pour encoder avec l'encodeur AAC natif de FFmpeg.

4voto

Après quelques heures de test, j'ai réussi à convertir une entrée matroska/webm (Input #0, matroska,webm, from 'testit1.webm') en une sortie mp4 (Output #0, mp4, to 'testit1.mp4'). La vidéo a été enregistrée avec le mediarecorder de chrome.

ffmpeg -i testit1.webm -c copy -strict experimental testit1.mp4

Cependant, en faisant cela, nous avons conservé la petite taille de la vidéo webm. Mais nous n'avions pas d'audio. Pour faire fonctionner l'audio, nous avons utilisé :

ffmpeg -i testit1.webm -c:v copy -strict experimental testit1.mp4

J'espère que cela vous aidera si vous êtes dans la même situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X