Rapport d'aspect correct sans réencodage du fichier vidéo


18

J'ai un flux vidéo avec les propriétés suivantes:

Stream #0:0: Video: mpeg4 (Advanced Simple Profile) (XVID / 0x44495658), yuv420p, 720x416 [SAR 1:1 DAR 45:26], 1908 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc

Lorsque je l'exécute dans VLC, je dois appuyer sur "A" pour changer le rapport d'aspect en "4: 3" pour que la vidéo s'affiche avec le rapport d'aspect correct.

En regardant les faits vidéo, l'erreur est-elle que a) la vidéo réelle a été incorrectement étirée dans les données de pixels, ou b) il y a simplement une valeur de métadonnées qui a été incorrectement définie?

Si le premier, je sais que je peux ré-encoder la vidéo et changer la largeur et la hauteur. Mais dans ce dernier cas, quelle commande ffmpeg exécuter pour corriger les métadonnées sans réencoder la vidéo elle-même?

Réponses:


36

Il existe une différence entre le rapport d'aspect de l'échantillon (SAR) et le rapport d'aspect de l'affichage (DAR). Si vous souhaitez modifier la vidéo pour qu'elle s'affiche en 4: 3, vous devrez soit modifier les pixels réels de l'image (en redimensionnant les pixels et en modifiant SAR), soit en définissant un indicateur de métadonnées au niveau du conteneur qui indique à l'extérieur lecteurs multimédias pour étirer l'image à votre DAR souhaité.

Vous ne pourrez pas mettre à l'échelle les pixels et modifier le SAR sans appliquer de filtre vidéo. Si vous choisissez cette méthode, vous devrez transcoder le fichier - car vous ne pouvez pas "copier en continu" le flux vidéo lors de l'application d'un filtre vidéo.

Pour mettre l'image à l'échelle et modifier le SAR (pendant le transcodage), essayez:

ffmpeg -i <INPUT_FILE> -vf scale=720:540 -c:v <Video_Codec> <OUTPUT_FILE>

D'un autre côté, si vous souhaitez simplement modifier l'indicateur de métadonnées et ajuster le DAR, vous pourrez diffuser la vidéo en streaming. Pour ce faire, essayez:

ffmpeg -i <INPUT_FILE> -aspect 720:540 -c copy [OUTPUT_FILE]

Excellent! Changer d'aspect a tout de suite fonctionné!
2015

1
Vous ne pouvez pas utiliser -c copyet évoluer en même temps; toutefois, vous pouvez utiliser -aspectpour modifier le rapport hauteur / largeur au niveau du conteneur (mais pas au niveau du flux).
llogan

@LordNeckbeard, l'utilisation -aspectfonctionne pour la lecture dans ffplay, mais pas dans WMP ou MPC-HC. Il ajoute un élément SAR / DAR supplémentaire à la Stream #…ligne d'informations FFmpeg/probe/playmais ne semble pas être une solution pour la lecture générale. Étirer la vidéo avec la fenêtre semble être la solution la plus simple pour la lecture MPC-HC.
Lumi

n'a pas fonctionné pour moi pour MPEG2 sans réencodage
Mikhail V

Je ne sais pas pourquoi cela n'a pas fonctionné pour moi. Il sort juste la même vidéo!
Tina J

4

La réponse de Delgado est correcte: MP4Box peut le faire, mais l' -paroption ne fonctionne pas exactement comme décrit. Avec un -outparamètre (pour ne pas perturber votre fichier d'origine):

mp4box source.mp4 -out target.mp4 -par stream-number=width:height

Lorsque vous utilisez -par stream-number=width:height, vous définissez le rapport hauteur / largeur des pixels, c'est-à-dire le résultat de la division du rapport hauteur / largeur du périphérique par le rapport hauteur / largeur de stockage. (De manière équivalente, vous décrivez le rapport d'aspect d'un pixel source.) Par exemple, supposons que vous ayez une source DVD de 720 × 480 et que le rapport d'aspect d'affichage correct soit de 4: 3. Pour ce cas, vous avez besoin de:

mp4box source.mp4 -out target.mp4 -par 1=8:9

car (4/3) / (720/480) = 8/9.

Si la source représente de vrais pixels SD NTSC (auquel cas seuls les 704 × 480 pixels centraux sont censés correspondre à un écran 4 × 3, avec un surbalayage de 8 pixels de chaque côté), la commande correcte serait:

mp4box source.mp4 -out target.mp4 -par 1=10:11

car (4/3) / (704/480) = 10/11 - exactement le rapport d'aspect en pixels de référence pour la vidéo NTSC en définition standard.

Pour le cas donné dans la question, si c'est vraiment 4: 3, cela donne un rapport d'aspect pixel très étrange: (4/3) / (720/416) = 104/135. Il fait 720 de large, ce qui suggère une source DVD; c'est une vidéo à 25 ips, suggérant PAL, mais le PAR fonctionne à moins de 1, suggérant NTSC. Cela pourrait être 4: 5, je suppose (très proche de 104: 135), mais je ne connais rien qui produise ce rapport d'aspect en pixels; essayez peut-être d'abord, puis essayez 3: 4 s'il semble toujours un peu trop étiré horizontalement. Si vous êtes certain que c'est exactement 4: 3, bien sûr, utilisez simplement 104: 135.


3

ffmpeg ne peut pas modifier les paramètres d'un flux vidéo sans ré-encodage, MP4Box (partie de gpac ) et mkvmerge le peuvent. Dans le cas d'un flux vidéo et d'un rapport d'aspect réel / correct de 4: 3, vous pouvez essayer:

MP4Box -par 1=3:4 VideoFile.mp4

    "-par" : PixelAspectRatio (adjusts DAR + SAR with respect to the video resolution)
    "1"=   : stream number
    "3:4"  : aspect ratio (lower number 1st!)
    Changes are directly applied to "VideoFile.mp4", no copy

Pour vérifier avant et après: ffmpeg -i VideoFile.mp4


0

Modification du SAR sans réencodage aussi avec des œuvres ffmpegsur l' .mp4utilisation du h264_metadatacomme Gyan a souligné ici :

ffmpeg -i in.mp4 -c copy -bsf:v "h264_metadata=sample_aspect_ratio=4/3" out.mp4

Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
MMM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.