4 votes

J'obtiens un rapport d'aspect incorrect pour les images et les vidéos converties avec ffmpeg.

J'essaie de convertir d'anciens fichiers vidéo en images (et de les réencoder ensuite en h.264). Le problème est que les images résultantes sont étirées verticalement.

Voici la commande ffmpeg :

ffmpeg -i preview.mpg -filter_complex "[0:v]fps=fps=1[onepersec]; [onepersec]scale=min(200\, iw):-2[rescaled]" -map "[rescaled]" -f image2 image%4d.jpg

J'ai une idée : le scale tel que je l'utilise, le filtre ignore le rapport d'aspect de l'écran. DAR et met simplement à l'échelle les valeurs des pixels. Je veux que la largeur des images soit au maximum de 200 pixels et la hauteur peut être ce qu'elle veut tant qu'elle a l'air correcte, c'est-à-dire non étirée.

Comment dois-je convertir le fichier vidéo pour obtenir des images (et une vidéo ré-encodée) qui ne semblent pas étirées ?

Informations supplémentaires sur le fichier vidéo :

Dans VLC, la lecture semble correcte. Il ressemble à un rapport d'aspect 4:3 normal. VLC affiche ce qui suit dans Current media information > Codec :

Stream 0
Type: Video
Codec: MPEG-1/2 Video (mpgv)
Resolution: 352x576
Frame rate: 25
Decoded format: Planar 4:2:0 YUV

Voici le résultat de l'exécution de la commande ci-dessus ffmpeg commandement :

ffmpeg version git-2014-07-24-f753956 Copyright (c) 2000-2014 the FFmpeg developers
  built on Jul 24 2014 13:39:56 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
  configuration: --prefix=/home/somename/ffmpeg_build --extra-cflags=-I/home/somename/ffmpeg_build/include --extra-ldflags=-L/home/somename/ffmpeg_build/lib --bindir=/home/somename/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3la
me --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libfreetype --enable-libspeex --enable-libtheora
  libavutil      52. 92.101 / 52. 92.101
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 49.100 / 55. 49.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.102 /  4. 11.102
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mpeg, from 'preview.mpg':
  Duration: 00:14:23.59, start: 1.646067, bitrate: 2244 kb/s
    Stream #0:0[0x1bf]: Data: dvd_nav_packet
    Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 352x576 [SAR 24:11 DAR 4:3], max. 2500 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s
[swscaler @ 0x3f6fae0] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'image%4d.jpg':
  Metadata:
    encoder         : Lavf55.49.100
    Stream #0:0: Video: mjpeg, yuvj420p, 200x328 [SAR 164:75 DAR 4:3], q=2-31, 200 kb/s, 1 fps, 1 tbn, 1 tbc
    Metadata:
      encoder         : Lavc55.69.100 mjpeg
Stream mapping:
  Stream #0:1 (mpeg2video) -> fps
  scale -> Stream #0:0 (mjpeg)
Press [q] to stop, [?] for help
frame=   41 fps=0.0 q=1.6 size=N/A time=00:00:41.00 bitrate=N/A    ^Mframe=   80 fps= 79 q=1.6 size=N/A time=00:01:20.00 bitrate=N/A    ^Mframe=  125 fps= 71 q=1.6 size=N/A time=00:02:05.00 bitrate=N/A    ^Mframe=  156 fps= 69 q=1.6 size=N/A time=00:02:36.00 bitrate=N/A    ^Mframe=  203 fps= 74 q=1.6 size=N/A time=00:03:23.00 bitrate=N/A    ^Mframe=  248 fps= 76 q=1.6 size=N/A time=00:04:08.00 bitrate=N/A    ^Mframe=  295 fps= 79 q=1.6 size=N/A time=00:04:55.00 bitrate=N/A    ^Mframe=  336 fps= 79 q=1.6 size=N/A time=00:05:36.00 bitrate=N/A    ^Mframe=  377 fps= 79 q=1.6 size=N/A time=00:06:17.00 bitrate=N/A    ^Mframe=  424 fps= 81 q=1.6 size=N/A time=00:07:04.00 bitrate=N/A    ^Mframe=  465 fps= 81 q=1.6 size=N/A time=00:07:45.00 bitrate=N/A    ^Mframe=  508 fps= 81 q=1.6 size=N/A time=00:08:28.00 bitrate=N/A    ^Mframe=  547 fps= 79 q=1.6 size=N/A time=00:09:07.00 bitrate=N/A    ^Mframe=  580 fps= 78 q=1.6 size=N/A time=00:09:40.00 bitrate=N/A    ^Mframe=  621 fps= 79 q=1.6 size=N/A time=00:10:21.00 bitrate=N/A    ^Mframe=  665 fps= 79 q=1.6 size=N/A time=00:11:05.00 bitrate=N/A    ^Mframe=  709 fps= 80 q=1.6 size=N/A time=00:11:49.00 bitrate=N/A    ^Mframe=  746 fps= 79 q=1.6 size=N/A time=00:12:26.00 bitrate=N/A    ^Mframe=  794 fps= 80 q=1.6 size=N/A time=00:13:14.00 bitrate=N/A
^Mframe=  833 fps= 80 q=1.6 size=N/A time=00:13:53.00 bitrate=N/A    ^Mframe=  865 fps= 81 q=1.6 Lsize=N/A time=00:14:25.00 bitrate=N/A
video:11118kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

Peut-être que je dois faire quelque chose à propos [swscaler @ 0x3f6fae0] format de pixel déprécié utilisé, assurez-vous que vous avez défini la plage correctement. ?

Voici le résultat de mediainfo :

$ mediainfo preview.mpg
General
Complete name                            : /[...]/preview.mpg
Format                                   : MPEG-PS
File size                                : 231 MiB
Duration                                 : 14mn 23s
Overall bit rate mode                    : Variable
Overall bit rate                         : 2 244 Kbps

Video
ID                                       : 224 (0xE0)
Format                                   : MPEG Video
Format version                           : Version 2
Format profile                           : Main@Main
Format settings, BVOP                    : Yes
Format settings, Matrix                  : Custom
Format settings, GOP                     : M=2, N=12
Duration                                 : 14mn 23s
Bit rate mode                            : Variable
Bit rate                                 : 1 943 Kbps
Maximum bit rate                         : 2 500 Kbps
Width                                    : 352 pixels
Height                                   : 576 pixels
Display aspect ratio                     : 4:3
Frame rate                               : 25.000 fps
Standard                                 : PAL
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Interlaced
Scan order                               : Top Field First
Compression mode                         : Lossy
Bits/(Pixel*Frame)                       : 0.383
Time code of first frame                 : 00:00:00:12
Time code source                         : Group of pictures header
Stream size                              : 200 MiB (87%)

Audio
ID                                       : 189 (0xBD)-128 (0x80)
Format                                   : AC-3
Format/Info                              : Audio Coding 3
Mode extension                           : CM (complete main)
Format settings, Endianness              : Big
Muxing mode                              : DVD-Video
Duration                                 : 14mn 23s
Bit rate mode                            : Constant
Bit rate                                 : 256 Kbps
Channel(s)                               : 2 channels
Channel positions                        : Front: L R
Sampling rate                            : 48.0 KHz
Bit depth                                : 16 bits
Compression mode                         : Lossy
Delay relative to video                  : -31ms
Stream size                              : 26.3 MiB (11%)

Menu

Voici le résultat de ffprobe :

$ ffprobe preview.mpg
ffprobe version git-2014-07-24-f753956 Copyright (c) 2007-2014 the FFmpeg developers
  built on Jul 24 2014 13:39:56 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
  configuration: --prefix=/home/sadmin/ffmpeg_build --extra-cflags=-I/home/somename/ffmpeg_build/include --extra-ldflags=-L/home/somename/ffmpeg_build/lib --bindir=/home/somename/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libfreetype --enable-libspeex --enable-libtheora
  libavutil      52. 92.101 / 52. 92.101
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 49.100 / 55. 49.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.102 /  4. 11.102
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mpeg, from 'preview.mpg':
  Duration: 00:14:23.59, start: 1.646067, bitrate: 2244 kb/s
    Stream #0:0[0x1bf]: Data: dvd_nav_packet
    Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 352x576 [SAR 24:11 DAR 4:3], max. 2500 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s
Unsupported codec with id 1145979222 for input stream 0
$

Voici le texte Codec non supporté avec id 1145979222 pour le flux d'entrée 0 est mis en évidence. Je suppose qu'il s'agit de Stream #0.0 ( ?) dont je n'ai pas besoin.

Voici ce que j'obtiens pour l'une des images :

$ ffprobe image0001.jpg
ffprobe version git-2014-07-24-f753956 Copyright (c) 2007-2014 the FFmpeg developers
  built on Jul 24 2014 13:39:56 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)
  configuration: --prefix=/home/somename/ffmpeg_build --extra-cflags=-I/home/somename/ffmpeg_build/include --extra-ldflags=-L/home/somename/ffmpeg_build/lib --bindir=/home/somename/bin --extra-libs=-ldl --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libfreetype --enable-libspeex --enable-libtheora
  libavutil      52. 92.101 / 52. 92.101
  libavcodec     55. 69.100 / 55. 69.100
  libavformat    55. 49.100 / 55. 49.100
  libavdevice    55. 13.102 / 55. 13.102
  libavfilter     4. 11.102 /  4. 11.102
  libswscale      2.  6.100 /  2.  6.100
  libswresample   0. 19.100 /  0. 19.100
  libpostproc    52.  3.100 / 52.  3.100
[mjpeg @ 0x24c7e40] ignoring invalid SAR: 164/75
Input #0, image2, from 'mov0001.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg), 200x328, 25 tbr, 25 tbn, 25 tbc

Intéressant ici pourrait être [mjpeg @ 0x24c7e40] ignorant les SAR invalides : 164/75 mais qu'est-ce que ça veut dire ?

7voto

QuickPrototype Points 161

7 ans plus tard, je suis confronté à un problème similaire. Je vais déposer une solution ici pour les personnes qui nous rendront visite dans les 7 prochaines années.

Essayez d'abord de mieux comprendre ce que signifient les valeurs SAR/PAR et DAR. De belles vidéos youtube sur le sujet.

Lors de la conversion de vidéos dont la valeur du DAS est différente de 1, il est important de normaliser d'abord la vidéo (c'est-à-dire d'élever au carré les pixels) pour qu'elle soit conforme à un DAS de 1/1.

La cause principale de l'étirement de l'image est apparemment que la plupart des logiciels de visualisation d'images ne se soucient pas de lire/comprendre les valeurs SAR. Ils s'attendent à ce que le DAS soit de 1/1.

Une méthode pour y parvenir est le filtre à écailles :

scale=iw*sar:ih

un exemple générique de ffmpeg :

ffmpeg -i somefile.avi -vf 'scale=iw*sar:ih' someoutput%04d.jpg

Cela met à l'échelle la largeur tout en conservant la hauteur pour que le SAR soit maintenant de 1/1.

vous pourriez alors ajouter une autre étape d'échelle pour obtenir les dimensions souhaitées :

scale=iw*sar:ih,scale=200:-2

ou en utilisant l'ancienne notation des filtres comme indiqué dans la question :

-filter_complex "[0:v]fps=fps=1[onepersec]; [onepersec]scale=iw*sar:ih[onepersecondnorm]; [onepersecnorm]scale=min(200\, iw):-2[rescaled]"

J'espère que ça a aidé quelqu'un.

1voto

Michael Wells Points 1

@QuickPrototype - J'ai trouvé votre réponse un peu frustrante car pour comprendre les solutions d'une manière qui permette de les appliquer à des situations similaires, il faut souvent comprendre le problème, et votre message ne décrivait pas vraiment bien le problème SAR/PAR/DAR. Vous nous avez simplement dit de le rechercher sur Youtube.

N'ayant trouvé aucune vidéo YouTube utile, j'ai trouvé l'article suivant de wikipedia très instructif : Rapport d'aspect des pixels

L'idée d'image pixels (c'est-à-dire le plus petit point des données d'image) et leur rapport d'aspect (c'est-à-dire le rapport entre la taille de l'image/du pixel/de l'écran en termes de largeur/hauteur parfois exprimé par largeur:hauteur ) est né de la production de versions numériques d'enregistrements vidéo analogiques. Les enregistrements vidéo analogiques avaient ' lignes et un point central Cela fonctionnait bien avec les anciens téléviseurs à tube cathodique de format 4:3 qui étaient utilisés à l'époque. Il n'y avait pas de pixels dans les enregistrements vidéo analogiques, qui étaient conçus pour guider un faisceau de photons à travers l'écran afin d'éclairer le phosphore sur l'écran, en balayant de gauche à droite, puis en descendant d'une ligne à la suivante jusqu'à ce que les 525 lignes d'un téléviseur NTSC (US) (ou 635 lignes pour le PAL ou le SECAM européen) soient dessinées, puis le processus recommençait pour produire une série de 25 ou 30 images vacillantes par seconde, ce qui crée l'illusion de mouvement pour l'œil humain. Les enregistrements numériques, au contraire, utilisent une grille de ' pixels pour faire correspondre les images analogiques à la technologie des écrans LCD ou à toute autre technologie de télévision moderne à écran plat.

Problèmes de transcodage se produit lorsqu'un enregistrement vidéo analogique pour un vieil écran de télévision à tube cathodique avec une largeur par hauteur de 4:3 (DAR) ' rapport d'aspect de l'affichage est numérisée puis affichée sur un téléviseur à écran plat avec une résolution de 16:9. rapport d'aspect de l'affichage '. L'image résultante peut présenter une bande noire sur les côtés gauche et droit pour compenser les différents rapports DAR (4:3 contre 16:9) ou l'image 4:3 peut être étirée pour remplir toute la largeur, ce qui implique soit de recadrer le haut et le bas de l'image, soit de comprimer la hauteur de l'image. Que l'on parle d'étirer la hauteur ou la largeur d'une image n'a pas vraiment d'importance car le résultat est fondamentalement le même dans la pratique. Cependant, le résultat produit peut être une image 4:3 qui semble bizarrement étirée pour s'adapter à un écran DAR 16:9 et n'est généralement pas la solution recommandée. La bande noire ou le recadrage minimal donnent un meilleur résultat car les visages des personnes ne sont pas comprimés ou étirés.

D'un point de vue technique, le numérique ' étirement ou pressage est le résultat de l'absence d'un carré En revanche, un pixel hypothétique peut être étiré ou comprimé pour obtenir un pixel rectangulaire de 1,33 sur 1 unité ou de 1 sur 0,75 unité. A chaque fois que le (PAR) ' rapport hauteur/largeur des pixels n'est pas carrée, mais rectangulaire, l'image résultante peut sembler étirée ou comprimée.

Mathématiquement cela peut être exprimé par les formules suivantes :

' SAR x PAR = DAR ..et PAR = DAR/SAR ' (c'est-à-dire que si PAR = 1, alors SAR = DAR) où :

SAR = Rapport d'aspect du stockage ' est la largeur et la hauteur d'une image en pixels, souvent stockée dans un format de fichier numérique.

PAR = Rapport d'aspect des pixels ' est le rapport entre la largeur et la hauteur d'un pixel, qui devrait normalement être 1:1 (c'est-à-dire carré) ou bien ' étirement et pressage Les effets se produisent .

DAR = ' Rapport d'aspect de l'écran est le rapport entre la largeur et la hauteur d'un écran, qui est intégré dans le matériel de l'écran lui-même.

Maintenant, pour décrire Le problème que j'ai rencontré : ' Extensibilité ou son opposé ' pressage est un problème que j'ai rencontré avec le transcodage vidéo numérique. En essayant de 'standardiser' des résolutions non standard qui provenaient d'enregistrements d'écrans d'ordinateurs portables avec des résolutions bizarres telles que 1197x989 que j'ai ensuite essayé de mettre à l'échelle pour obtenir un rapport d'aspect plus 'standard' à l'aide du filtre ffmpeg ". -vf scale=960:720 ou -vf scale=1440:1080 par exemple, je trouverais le fichier de sortie avec la hauteur mise à l'échelle (c'est-à-dire pressé à 720 pixels ou étiré ' à 1080 pixels) correctement mais la largeur incorrectement ' pressé à 871 pixels au lieu de 960 pixels ou incorrectement ' étiré ' à seulement 1307 pixels au lieu de 1440 pixels, ce qui ne permet pas d'atteindre le rapport d'aspect 4:3 souhaité pour l'affichage DAR. En effet, au lieu d'appliquer un DAR 4:3, ffmpeg utilisait l'ancien SAR de 1197:989 pour définir le DAR et le filtre -vf scale=value:value ne mettait à l'échelle l'image qu'à la hauteur souhaitée correctement, mais pas à la largeur.

Frustrée, d'autres recherches m'ont conduite à l'adresse suivante ffmpeg FAQ page, 3.18 J'ai une vidéo étirée, pourquoi la mise à l'échelle ne la répare-t-elle pas ? Ici, on m'a présenté le filtre ffmpeg : -aspect 4:3 ou -aspect 16:9 qui affectait la largeur mais pas la hauteur de l'image produite. En appliquant ce filtre, la hauteur restait de 989 pixels, mais la largeur passait à 1318 ou 1758 pixels respectivement. Cette situation est d'autant plus grave que la largeur ' étirement était encore plus perceptible.

Ma solution en l'absence d'un filtre spécifique de ffmpeg PAR était de combiner les deux filtres ci-dessus (i.e. ' ffmpeg -i <fichier d'entrée> -vf scale=960:720 -aspect 4:3 <fichier de sortie> ... et... ffmpeg -i <fichier d'entrée> -vf scale=1440:1080 -aspect 4:3 <fichier de sortie> ) qui ont produit respectivement les fichiers vidéo désirés de 960x720 et 1440x1080 pixels. Les fichiers ' -vf scale=valeur:valeur ' définit effectivement la hauteur souhaitée pour le fichier de sortie en pixels, tandis que l'option ' -aspect valeur:valeur Le filtre ' définit la largeur souhaitée du fichier de sortie en pixels.

Avis de non-responsabilité : Bien sûr, lors de la conversion de rapports d'aspect non standard en tailles standard, il doit y avoir une certaine ' étirement et/ou pressage ' de l'image lorsqu'elle n'est pas utilisée culture ou alternativement bandaiding comme on appelle parfois les bandes noires. L'essentiel est de s'assurer que les images résultantes n'ont pas un aspect anormalement bizarre, ce qui relève de l'appréciation de chaque spectateur. Si la taille non standard est assez proche de la taille standard, les résultats que j'ai trouvés sont acceptables.

J'espère que cette longue description du problème et de la solution pourra être utile à d'autres personnes qui sont aux prises avec l'image ". extensibilité '

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