web-dev-qa-db-fra.com

Commande ffmpeg pour un encodage plus rapide à un débit binaire décent avec une taille de fichier plus petite

J'utilise actuellement une implémentation de ffmpeg sur mon Android. J'autorise les utilisateurs à prendre de courtes vidéos dans mon application, puis lorsqu'ils les téléchargent sur le serveur, je les croque vers le bas avec ffmpeg pour réduire la taille du fichier afin qu'ils ne transmettent pas d'énormes quantités de données sur le fil.

le problème est qu'il faut une éternité pour encoder les vidéos sur le Android. Ces vidéos ne durent généralement pas plus de 45 secondes et peuvent prendre 20 minutes pour encoder. J'ai joué un peu avec différents commutateurs/paramètres sur la ligne de commande ffmpeg et je l'ai maintenant à un moment plus confortable, mais les tailles de fichier sont beaucoup plus grandes. Je ne suis simplement pas sûr du codec que je devrais utiliser (encodage le plus rapide mais avec une sortie de qualité décente), comment ffmpeg gère le changement de taille (format d'image) en termes de vitesse d'encodage, etc.

Voici les deux commandes que j'utilise. Ce premier produit la taille/qualité de fichier que je veux, mais cela prend beaucoup trop de temps à encoder, sans parler du fait que mon appareil devient vraiment chaud alors qu'il encode depuis si longtemps:

ffmpeg -i input.mp4 -b:v 1024k -c:a copy -vf scale=960:540 output.mp4

J'ai ajusté le bitrate sur cela ainsi que changé l'échelle à une taille plus petite, mais je ne veux pas avoir à rendre les vidéos vraiment petites (en termes d'échelle) pour accomplir un encodage plus rapide. cette deuxième commande va beaucoup plus vite mais augmente considérablement la taille du fichier:

ffmpeg -i input.mp4 -vcodec libx264 -preset fast -c:a copy -s 960x540 output.mp4

J'aimerais trouver un moyen satisfaisant (taille de fichier plus petite mais encodage plus rapide) en gardant la taille de l'échelle vidéo proche de l'original. ffmpeg a tellement de paramètres/commutateurs différents qu'il est difficile de comprendre ce que je dois faire.

EDIT: ajout d'une sortie ffmpeg.

ffmpeg -i input.mp4 -vcodec libx264 -crf 30 -preset veryfast -c: une copie -s 960x540 output.mp4

    09-13 11:06:28.330 10881-10881/someapp D/home: ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
09-13 11:06:28.330 10881-10881/someapp D/home:   built with gcc 4.8 (GCC)
09-13 11:06:28.331 10881-10881/someapp D/home:   configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-Android/toolchain-Android/bin/arm-linux-androideabi- --Arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-Android/toolchain-Android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-Android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-Android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-Android/toolchain-Android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-Android/toolchain-Android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
09-13 11:06:28.331 10881-10881/someapp D/home:   libavutil      55. 17.103 / 55. 17.103
09-13 11:06:28.331 10881-10881/someapp D/home:   libavcodec     57. 24.102 / 57. 24.102
09-13 11:06:28.331 10881-10881/someapp D/home:   libavformat    57. 25.100 / 57. 25.100
09-13 11:06:28.331 10881-10881/someapp D/home:   libavdevice    57.  0.101 / 57.  0.101
09-13 11:06:28.331 10881-10881/someapp D/home:   libavfilter     6. 31.100 /  6. 31.100
09-13 11:06:28.331 10881-10881/someapp D/home:   libswscale      4.  0.100 /  4.  0.100
09-13 11:06:28.331 10881-10881/someapp D/home:   libswresample   2.  0.101 /  2.  0.101
09-13 11:06:28.331 10881-10881/someapp D/home:   libpostproc    54.  0.100 / 54.  0.100
09-13 11:06:28.430 10881-10881/someapp D/home: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/storage/emulated/0/ExpeditionSpot/Videos/20160913110411.mp4':
09-13 11:06:28.430 10881-10881/someapp D/home:   Metadata:
09-13 11:06:28.430 10881-10881/someapp D/home:     major_brand     : mp42
09-13 11:06:28.430 10881-10881/someapp D/home:     minor_version   : 0
09-13 11:06:28.430 10881-10881/someapp D/home:     compatible_brands: isommp42
09-13 11:06:28.430 10881-10881/someapp D/home:     creation_time   : 2016-09-13 17:04:33
09-13 11:06:28.430 10881-10881/someapp D/home:     com.Android.version: 6.0.1
09-13 11:06:28.430 10881-10881/someapp D/home:   Duration: 00:00:19.41, start: 0.000000, bitrate: 20222 kb/s
09-13 11:06:28.430 10881-10881/someapp D/home:     Stream #0:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080, 19963 kb/s, SAR 1:1 DAR 16:9, 30.03 fps, 30 tbr, 90k tbn, 180k tbc (default)
09-13 11:06:28.430 10881-10881/someapp D/home:     Metadata:
09-13 11:06:28.430 10881-10881/someapp D/home:       creation_time   : 2016-09-13 17:04:33
09-13 11:06:28.430 10881-10881/someapp D/home:       handler_name    : VideoHandle
09-13 11:06:28.431 10881-10881/someapp D/home:     Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 96 kb/s (default)
09-13 11:06:28.431 10881-10881/someapp D/home:     Metadata:
09-13 11:06:28.431 10881-10881/someapp D/home:       creation_time   : 2016-09-13 17:04:33
09-13 11:06:28.431 10881-10881/someapp D/home:       handler_name    : SoundHandle
09-13 11:06:28.448 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] using SAR=1/1
09-13 11:06:28.448 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] using cpu capabilities: none!
09-13 11:06:28.516 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] profile High, level 3.1
09-13 11:06:28.516 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=12 lookahead_threads=4 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=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=27.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
09-13 11:06:28.532 10881-10881/someapp D/home: Output #0, mp4, to '/storage/emulated/0/ExpeditionSpot/.tmp/small-20160913110411.mp4':
09-13 11:06:28.532 10881-10881/someapp D/home:   Metadata:
09-13 11:06:28.532 10881-10881/someapp D/home:     major_brand     : mp42
09-13 11:06:28.533 10881-10881/someapp D/home:     minor_version   : 0
09-13 11:06:28.533 10881-10881/someapp D/home:     compatible_brands: isommp42
09-13 11:06:28.533 10881-10881/someapp D/home:     com.Android.version: 6.0.1
09-13 11:06:28.533 10881-10881/someapp D/home:     encoder         : Lavf57.25.100
09-13 11:06:28.533 10881-10881/someapp D/home:     Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 960x540 [SAR 1:1 DAR 16:9], q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
09-13 11:06:28.533 10881-10881/someapp D/home:     Metadata:
09-13 11:06:28.533 10881-10881/someapp D/home:       creation_time   : 2016-09-13 17:04:33
09-13 11:06:28.533 10881-10881/someapp D/home:       handler_name    : VideoHandle
09-13 11:06:28.533 10881-10881/someapp D/home:       encoder         : Lavc57.24.102 libx264
09-13 11:06:28.533 10881-10881/someapp D/home:     Side data:
09-13 11:06:28.533 10881-10881/someapp D/home:       unknown side data type 10 (24 bytes)
09-13 11:06:28.533 10881-10881/someapp D/home:     Stream #0:1(eng): Audio: aac (LC) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 96 kb/s (default)
09-13 11:06:28.533 10881-10881/someapp D/home:     Metadata:
09-13 11:06:28.533 10881-10881/someapp D/home:       creation_time   : 2016-09-13 17:04:33
09-13 11:06:28.533 10881-10881/someapp D/home:       handler_name    : SoundHandle
09-13 11:06:28.533 10881-10881/someapp D/home: Stream mapping:
09-13 11:06:28.533 10881-10881/someapp D/home:   Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
09-13 11:06:28.533 10881-10881/someapp D/home:   Stream #0:1 -> #0:1 (copy)
09-13 11:06:28.533 10881-10881/someapp D/home: Press [q] to stop, [?] for help
09-13 11:06:29.102 10881-10881/someapp D/home: frame=    7 fps=0.0 q=0.0 size=       0kB time=00:00:01.04 bitrate=   0.4kbits/s speed=2.08x    
09-13 11:06:29.699 10881-10881/someapp D/home: frame=   16 fps= 15 q=0.0 size=       0kB time=00:00:01.04 bitrate=   0.4kbits/s speed=0.998x    
....
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] frame I:3     Avg QP:26.83  size: 21896
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] frame P:279   Avg QP:28.76  size:  5859
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] frame B:296   Avg QP:29.93  size:   863
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] consecutive B-frames: 18.3% 32.2% 23.9% 25.6%
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] mb I  I16..4: 16.9% 54.2% 28.9%
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] mb P  I16..4:  7.7%  9.1%  0.4%  P16..4: 27.5% 11.1%  4.0%  0.0%  0.0%    skip:40.1%
09-13 11:07:12.674 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] mb B  I16..4:  0.8%  0.6%  0.0%  B16..8: 10.9%  2.4%  0.1%  direct: 1.8%  skip:83.5%  L0:35.8% L1:54.2% BI:10.0%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] 8x8 transform intra:52.0% inter:41.3%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] coded y,uvDC,uvAC intra: 28.9% 26.0% 2.1% inter: 6.4% 5.0% 0.0%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] i16 v,h,dc,p: 57% 20% 17%  6%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 33% 23% 34%  1%  2%  1%  3%  2%  2%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 36% 21% 17%  2%  7%  4%  6%  4%  4%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] i8c dc,h,v,p: 59% 16% 23%  2%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] Weighted P-Frames: Y:16.8% UV:4.7%
09-13 11:07:12.675 10881-10881/someapp D/home: [libx264 @ 0xf71c4400] kb/s:812.09
12
Blair Holmes

Essayer

ffmpeg -i input.mp4 -vcodec libx264 -crf 27 -preset veryfast -c:a copy -s 960x540 output.mp4

En mode CRF, x264 code la vidéo pour maintenir une certaine qualité tout au long. Des valeurs inférieures produisent des fichiers de meilleure qualité mais plus volumineux. Combiné avec veryfast preset, il devrait fournir un compromis acceptable entre vitesse et taille.

20
Gyan