Conversion d'images RVB en vidéo sans perte avec avconv / ffmpeg

2

J'essaie de convertir une série d'images PNG24 contenant une animation d'écran en une vidéo sans perte, afin que chaque pixel soit reproduit exactement comme il était dans l'original. Mais avconv (et ffmpeg) produisent tous les deux les mêmes résultats insatisfaisants, qui semblent résulter d’une erreur de conversion du colospace.

Ceci est la version de avconv que j'utilise:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3

Chacune des images a une taille de 1280 × 800 pixels. Ils ne contiennent aucun motif photographique, mais des motifs spécialement tramés.

J'ai utilisé le qtrle codec car apparemment, il s’agit d’un codec sans perte qui fonctionne comme un GIF animé ou un fichier PNG animé. Cependant, lors de la conversion en vidéo, il semble qu'une conversion de l'espace colorimétrique ("filtre") perturbe les pixels.

Voici la sortie avconv:

$ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov
avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Apr  2 2013 17:02:36 with gcc 4.6.3
Input #0, image2, from 'frames.png/wth-%08d.png':
  Duration: 00:11:17.96, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc
File 'qtrle-30fps-rgb.mov' already exists. Overwrite ? [y/N] y
[buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra
[avsink @ 0x742ac0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
[scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4
Output #0, mov, to 'qtrle-30fps-rgb.mov':
  Metadata:
    encoder         : Lavf53.21.1
    Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (png -> qtrle)
Press ctrl-c to stop encoding
frame=  450 fps= 22 q=0.0 Lsize=  126056kB time=15.00 bitrate=68843.4kbits/s    
video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441%

Ceci est un fichier image PNG original:

enter image description here

Voici une capture d'écran de la vidéo en train d'être rejouée:

Screenshot of the video being replayed

Veuillez noter que vous devez voir ces images dans leur résolution d'origine 1280 × 800 pour constater les différences.

Voici une comparaison côte à côte , l'image de gauche étant l'original et celle de droite le résultat après le codage vidéo

enter image description here

Existe-t-il un moyen de produire un fichier vidéo parfaitement sans perte et parfaitement parfait à partir d'une série de fichiers PNG?

despens
la source
Intéressant. Votre fichier d'entrée montre comme bgra, alors que pour moi (en ffmpeg ) il montre comme rgba. Quoi qu’il en soit, pouvez-vous essayer de régler la sortie sur -pix_fmt argb au lieu?
slhck
J'ai essayé argb, le résultat est exactement le même qu'avant.
Bonjour @slhck, à partir de votre commentaire, j'ai essayé de modifier le format des fichiers PNG afin qu'aucun filtre automatique ne soit nécessaire. J'ai utilisé le -flatten +matte option dans ImageMagick pour obtenir de vrais fichiers png RGB24. Le résultat était que aucun filtre n'était 'auto inséré' , mais le résultat était toujours faux. Maintenant, je me demande comment changer le 'codeur' encoder : Lavf53.21.1?
Le codeur est fondamentalement ce qui est intégré à avconv (ou ffmpeg si vous utilisez FFmpeg). Vous ne pouvez le changer qu'en utilisant une version plus récente. À ma connaissance, Libav ne propose pas de versions de avconv, alors vous devez vous construire. Ou téléchargez une version statique de ffmpeg de leur page de téléchargement . Veuillez noter la différence entre Libav et FFmpeg: Qui peut me dire la différence et la relation entre ffmpeg, libav et avconv
slhck
Cela dit, si vous pouvez reproduire cela avec une version récente, envisagez de créer un rapport de bogue avec FFmpeg ou Libav si vous avez l’impression forte que la conversion des couleurs n’est pas exacte (même si elle devrait l'être).
slhck

Réponses:

2

Avec l'aide d'un contributeur de ffmpeg, il a été découvert que ffmpeg et libav créaient des fichiers Quicktime sans perte sans faille. Le problème semble être que le pilote de la carte graphique affiche les vidéos de manière incorrecte (puisque les lecteurs basés sur GStream et VLC l’affiche de manière erronée, toutefois, VLC exporte des images au format PNG parfait). Si vous voulez vérifier si une vidéo contient vraiment les images pixel par pixel, essayez d'utiliser

$ ffmpeg -i input.png -vcodec qtrle out.mov

$ ffmpeg -i input.png -f framecrc -
$ ffmpeg -i out.mov -f framecrc -

Cela générera des sommes de contrôle de données de trame

Pour une comparaison visuelle, reconvertissez la vidéo sans perte en images uniques et comparez-les.

despens
la source
selon les codecs, vous devrez peut-être utiliser -pix_fmt pour crc / md5 le même arrangement de données décodées sans perte. par exemple. Le décodeur h.264 RVB de ffmpeg génère un RVB planaire, dans un format appelant ffmpeg gbrp.
Peter Cordes