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?

en avant
la source

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]
occvtech
la source
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.

Bruits
la source
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

Delgado
la source
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
drake7
la source
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