Comment utiliser ffmpeg pour diviser une vidéo en images, puis réassembler exactement la même chose?

2

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

Divisez l'audio de la vidéo:

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

Divisez ensuite la vidéo en un fichier image par image:

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

Ensuite, je traite certains fichiers img% 04d.png (en supposant que l'opération soit nulle pour le moment) et je souhaite remonter 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 fondamentalement, mais mon problème est que je dois faire correspondre le format d'entrée mp4 aussi fidèlement que possible et j'ai du mal à comprendre 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 la fréquence d'images et les formats de pixels à correspondre.

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

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

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

mais je me suis retrouvé avec un débit de 41 Mb / s au lieu de 27 Mb / s.

Je ne m'attends pas à ce que le débit binaire corresponde exactement, mais la qualité doit rester pratiquement inchangée et les autres éléments doivent rester identiques.

Quelqu'un peut-il me dire si je peux d'une manière ou d'une autre utiliser un mp4 existant pour contrôler la configuration de celle que je suis en train de générer, ou quels arguments je dois utiliser pour m'assurer manuellement que le résultat est proche.

Mise à jour 1 - mise à jour

Commande essayée suggérée 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 en anglais. tbn et start sont corrects, mais la longueur est courte.

Je me demande si le problème a quelque chose à voir avec la génération initiale. La sortie originale produisait 251 images par trame qui supposent un début, une fin 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 copie -t 10 sorties.mp4

et cette commande génère 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 du résultat 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
Jules
la source
Veuillez inclure la commande et la sortie de votre conversion complète et non coupée en ligne de commande.
Slhck
Ajout du journal comme demandé
Jules

Réponses:

2

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)

Gyan
la source
J'ai reçu les messages suivants:
Jules
Les messages ne sont pas passés. 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 s'est élevé à 14502 kb / s, ce qui est beaucoup plus proche et la langue a été correctement définie. Le début et la durée sont restés inchangés sans les options supplémentaires. J'utilise une version que j'ai téléchargée le 23/02/16 depuis ffmpeg.zeranoe.com/builds
Jules
Revérifier la syntaxe, s'il vous plaît. J'utilise également une version de Feb Zeranoe et les deux options fonctionnent.
Gyan
J'ai encore essayé avec ces options et cette fois, ils ont travaillé. Je ne sais pas quelle erreur j'ai commise la première fois. tbn correspond maintenant. Heure de début correcte, mais la durée est maintenant courte de 0,01. Je me demandais si le problème était lié à l'extraction. Ai-je besoin d'un cadre pour le début et la fin? Peut-être qu'il en manque un?
Jules