Question Comment puis-je utiliser ffmpeg pour diviser une vidéo en images, puis la remonter exactement?


J'ai un MP4 qui a un flux audio et vidéo et j'ai besoin de modifier chaque image de la vidéo. Le pipeline que j'utilise est:

Diviser le son de la vidéo:

ffmpeg -i in.mp4 -vn -acodec copy out.m4a

Ensuite, divisez la vidéo en un fichier image par image:

ffmpeg -i in.mp4 img%04d.png

Ensuite, je fais un traitement sur les fichiers img% 04d.png (supposons une opération nulle pour le moment) et je veux réassembler la vidéo.

ffmpeg -i img%04d.png -i out.m4a -c:v libx264 -r 25 -pix_fmt yuv420p -c:a copy -shortest out.mp4

Cela fonctionne essentiellement mais mon problème est que je dois faire correspondre le format mp4 d'entrée aussi étroitement que possible et j'ai du mal à trouver comment le faire.

Exemple:

Entrée MP4:

Duration: 00:00:10.01, start: 0.010000, bitrate: 24589 kb/s
  Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 4096x2048 [SAR 1:1 DAR 2:1], 27736 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc
  Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s

Sortie MP4 après traitement:

Duration: 00:00:10.00, start: 0.000000, bitrate: 4458 kb/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 4096x2048 [SAR 1:1 DAR 2:1], 4272 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc
  Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s

Comme j'ai divisé l'audio, cela correspond exactement. J'ai utilisé les options -r et -pix_fmt pour forcer les formats de fréquence d'images et de pixels à correspondre.

Cependant, la durée, le début, le débit, la langue du flux vidéo et le tbn ont tous changé.

J'ai essayé de corriger le bitrate en utilisant les arguments:

-b:v 27736k -minrate 27736k -maxrate 27736k

mais j'ai fini avec un débit de 41 Mb / s au lieu de 27 Mb / s.

Je ne m'attends pas à ce que le bitrate corresponde exactement, mais j'ai besoin de qualité pour être pratiquement inchangée et j'ai besoin des autres éléments pour rester les mêmes.

Quelqu'un peut-il me dire si je peux en quelque sorte utiliser un mp4 existant pour contrôler la configuration de celle que je génère, ou quels arguments je dois utiliser pour garantir manuellement que le résultat est proche.

Mise à jour 1 - mise à jour

Essayé commande suggéré par Mulvya:

ffmpeg -i img%04d.png -i out.m4a \
-c:v libx264 -b:v 27736k -bufsize 30000k \
-r 25 -video_track_timescale 25000 -output_ts_offset 0.01 -pix_fmt yuv420p \
-c:a copy -metadata:s:v:0 language=eng -metadata:s:a:0 language=eng -shortest out.mp4

Le débit résultant était de 24502 ​​kb / s, ce qui est beaucoup plus proche et le langage du flux # 0.0 était correctement défini sur anglais. tbn et start sont corrects, mais la longueur est courte.

Je me demande si le problème est lié à la génération initiale. La sortie d'origine a produit 251 images, en supposant un début, une extrémité correspond exactement à 10 secondes à 25 ips. J'ai créé cette vidéo en prenant une vidéo existante et en la réduisant à 10 secondes en utilisant:

ffmpeg -i in.mp4 -ss 0 -c copy -t 10 out.mp4

et cette commande donne une vidéo d'une longueur de 10,01. 0,01 est beaucoup moins que les 0,04 secondes par image d'une vidéo à 25 ips.

J'utilise la version ffmpeg N-78636-g45d3af9 du site de construction de Zeranoe.

Mise à jour 2

Ajout de la sortie de la commande ffmpeg

E:\ImageTest\video>c:\ffmpeg\bin\ffmpeg -thread_queue_size 512 -i img%04d.png -i out.m4a -c:v libx264 -r 25 -pix_fmt yuv420p -c:a copy -shortest out.mp4
ffmpeg version N-78636-g45d3af9 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 18.100 / 55. 18.100
  libavcodec     57. 24.105 / 57. 24.105
  libavformat    57. 26.100 / 57. 26.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 35.100 /  6. 35.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, image2, from 'img%04d.png':
  Duration: 00:00:10.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24(pc), 4096x2048 [SAR 1:1 DAR 2:1], 25 tbr, 25 tbn, 25 tbc
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'out.m4a':
  Metadata:
    major_brand     : M4A
    minor_version   : 512
    compatible_brands: isomiso2
    encoder         : Lavf55.0.100
  Duration: 00:00:10.00, start: 0.000000, bitrate: 191 kb/s
    Stream #1:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 189 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
File 'out.mp4' already exists. Overwrite ? [y/N] y
[libx264 @ 0000015f02f52b40] using SAR=1/1
[libx264 @ 0000015f02f52b40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
[libx264 @ 0000015f02f52b40] profile High, level 5.1
[libx264 @ 0000015f02f52b40] 264 - core 148 r2665 a01e339 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - 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=18 lookahead_threads=3 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 'out.mp4':
  Metadata:
    encoder         : Lavf57.26.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 4096x2048 [SAR 1:1 DAR 2:1], q=-1--1, 25 fps, 12800 tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.24.105 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(eng): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 189 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> h264 (libx264))
  Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame=  251 fps= 10 q=28.0 Lsize=    4746kB time=00:00:10.00 bitrate=3885.8kbits/s speed=0.416x
video:4507kB audio:231kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.155678%
[libx264 @ 0000015f02f52b40] frame I:2     Avg QP:17.80  size:304307
[libx264 @ 0000015f02f52b40] frame P:82    Avg QP:19.93  size: 44228
[libx264 @ 0000015f02f52b40] frame B:167   Avg QP:21.34  size: 12982
[libx264 @ 0000015f02f52b40] consecutive B-frames:  0.8% 15.9% 46.6% 36.7%
[libx264 @ 0000015f02f52b40] mb I  I16..4: 28.9% 55.3% 15.8%
[libx264 @ 0000015f02f52b40] mb P  I16..4:  5.8%  7.6%  0.1%  P16..4: 24.5%  2.9%  2.9%  0.0%  0.0%    skip:56.3%
[libx264 @ 0000015f02f52b40] mb B  I16..4:  1.1%  1.2%  0.0%  B16..8: 17.1%  0.6%  0.0%  direct: 1.7%  skip:78.2%  L0:48.7% L1:50.7% BI: 0.6%
[libx264 @ 0000015f02f52b40] 8x8 transform intra:55.5% inter:88.7%
[libx264 @ 0000015f02f52b40] coded y,uvDC,uvAC intra: 20.3% 28.0% 3.4% inter: 4.1% 10.1% 0.0%
[libx264 @ 0000015f02f52b40] i16 v,h,dc,p: 33% 43% 13% 12%
[libx264 @ 0000015f02f52b40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 13% 22% 60%  1%  1%  0%  2%  0%  2%
[libx264 @ 0000015f02f52b40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 53% 11%  3%  4%  2%  6%  2%  5%
[libx264 @ 0000015f02f52b40] i8c dc,h,v,p: 57% 30% 10%  3%
[libx264 @ 0000015f02f52b40] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0000015f02f52b40] ref P L0: 62.4%  4.7% 20.4% 12.5%
[libx264 @ 0000015f02f52b40] ref B L0: 66.2% 25.9%  7.9%
[libx264 @ 0000015f02f52b40] ref B L1: 86.0% 14.0%
[libx264 @ 0000015f02f52b40] kb/s:5102.21

3
2018-02-23 13:35


origine


Veuillez inclure la commande et la sortie de ligne de commande complète et non coupée de votre conversion. - slhck
Ajout du journal comme demandé - Jules


Réponses:


Essayer

ffmpeg -i img%04d.png -i out.m4a \
-c:v libx264 -b:v 27736k -bufsize 30000k \
-r 25 -video_track_timescale 25000 -output_ts_offset 0.01 -pix_fmt yuv420p \
-c:a copy -metadata:s:v:0 language=eng -metadata:s:a:0 language=eng -shortest out.mp4

(Selon que l'image ou le flux audio est plus court, la durée peut ne pas correspondre)


2
2018-02-23 14:03



J'ai reçu les messages suivants: - Jules
Les messages ne sont pas sortis. Collez-les dans la question (en utilisant le formatage du code). - Gyan
J'ai eu l'option non reconnue pour 'video_track_timescale' et 'output_ts_offset'. En supprimant ces options pour le moment, le débit binaire a atteint 14502 kb / s, ce qui est beaucoup plus proche et le langage a été défini correctement. Le début et la durée sont restés inchangés sans les options supplémentaires. J'utilise une version téléchargée le 23/02/16 de ffmpeg.zeranoe.com/builds - Jules
Revérifiez la syntaxe, s'il vous plaît. J'utilise également une version de février Zeranoe et les deux options fonctionnent. - Gyan
Essayé à nouveau avec ces options et cette fois ils ont fonctionné. Je ne sais pas quelle erreur j'ai fait la première fois. tbn correspond maintenant. Heure de début correcte, mais durée maintenant courte de 0,01. Je me demandais si le problème était lié à mon extraction. Ai-je besoin d'un cadre pour le début et la fin, l'un de ces éléments pourrait-il être manquant? - Jules