2 votes

Dans FFMPEG, quelle est la méthode la plus efficace pour redimensionner une vidéo ?

J'ai une grande collection de fichiers vidéo mkv et mp4 au format 4:3. J'essaie de redimensionner le plus grand d'entre eux à une taille plus gérable de 640x480. C'est en partie pour économiser de l'espace disque, mais aussi pour les rendre plus faciles à regarder sur un écran d'ordinateur portable, et pour consommer moins de cycles de processeur pour les lire.

Mais je n'ai pas trouvé de moyen efficace pour les redimensionner. J'ai essayé de respecter scrupuleusement l'encodage utilisé pour le fichier original, tel qu'il est signalé par MediaInfo (en utilisant l'option x264opts pour reproduire les variables signalées par MediaInfo, lorsqu'elles diffèrent d'un préréglage standard). Basé sur un encodage vidéo à deux passages.

Mais cela me laisse avec une commande très complexe pour ffmpeg, montrée ci-dessous. Qu'est-ce que je néglige ? Existe-t-il une ligne de commande plus simple que je puisse utiliser avec ffmpeg et qui permette de reproduire correctement l'encodage utilisé dans le fichier d'entrée ?

::  Resize Image to 640x480 (e.g. 960x720 x 2/3)

::  Input File (WITH .ext)
SET input=video_960x720_320kbps.mkv

::  Resize from 960x720 to 640x480 (i.e. 960x720 x 2/3)

::  Resize Picture to 2/3rd
    SET multiply=2
    SET divide=3

::  Location of FFMPEG (64-bit)
SET ffmpeg="C:\Program Files\FFmpeg\ffmpeg.exe" -hide_banner -threads 1

::  *** MATCH INPUT FILE'S SETTINGS : Input file analysed by MediaInfo ***

::  **  Command Line : 2 Pass Encoding : 320 kbps x 2/3 + Headroom = 240 kbps : Input = MKV  **

::  Video - Advanced Video Codec (AVC), High@L5 - Constant Bitrate, Framerate defaults to Input file's framerate

::  Overwrite a Profile with the x264-params option
SET x264opts="ref=16:deblock=1,1,2:me_range=32:trellis=0:bframes=5:open_gop=0:min-keyint=300:keyint_min=23:bitrate=240:qpmin=12:qpmax=60:qpstep=10:threads=1"

SET mapping=-i "%input%" -itsoffset 0 -i "%input%"  -map 0:v -map 1:a  -copyts
SET options=-preset veryslow  -profile:v high -level 5 -x264-params %x264opts%  -pix_fmt yuv420p
SET command=%ffmpeg% %mapping% -c:v libx264 %options% -vf "scale=iw*%multiply%/%divide%:-1" -c:a copy  -sn  -map_metadata 0
%command% -y -pass 1 -flags global_header -f matroska nul  &&  %command% -pass 2 -flags global_header -movflags faststart "output_640x480_240kbps.mkv"

2voto

Gyan Points 29437

Il n'y a aucun intérêt " la reproduction de l'encodage utilisé ". Ce ne sont que des informations historiques, et l'utilisation des mêmes paramètres n'entraînera pas un réencodage plus efficace. Si vous voulez réduire la charge du processeur, utilisez un profil inférieur. refs=16 y bframes=5 fera exactement le contraire de consomment moins de cycles de processeur . Un seul passage CRF suffira, pas besoin de deux passages en mode débit moyen.

Vous avez également ingéré l'entrée deux fois et appliqué un décalage TS de 0 ( !). Pourquoi ?

ffmpeg -i in -vf scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p -c:v libx264 -crf 22 -profile:v main -c:a copy -sn -map_metadata 0 out.mkv

Vous pouvez omettre le filtre tampon si l'entrée est exactement 4:3.

Si la taille résultante est trop importante, augmentez la valeur du CRF.

0voto

Bilal Ahmed Points 26

Vous pouvez utiliser l'artefact ci-dessous pour gérer le redimensionnement de la vidéo et de l'image.

URL pour la dépendance du projet (disponible pour Maven, Gradle, Scala etc.) : Cliquez ici

Il est construit sur la base de FFMPEG. Vous n'avez pas à gérer manuellement la logique.

Cet artefact permet de réaliser la solution sans trop de code passe-partout dans notre logique.

Utilisation de l'échantillon: :

IVCompressor compress=new IVCompressor();
byte[] Imageoutput=compress.resizeImage(data, fileFormat, resolution); //for image compression
byte[] VideoOutput=compress.reduceVideoSize(videoData, fileFormat, resolution);//for video compression

Plus de détails @ IVCompressor

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X