FFMPEG: Comment convertir 24 bpp MP4 en 16 bpp au format AVI au format rgb565le?

0

Résumé: J'essaie de comprendre (à savoir un exemple, je suppose) comment utiliser les balises scaler src_format / dst_format pour convertir un format RVB de 16 bpp spécifique pour un périphérique cible.

Je traite avec un matériel plus ancien qui lit des vidéos sur une petite carte SD de 64 Mo. Oui, MB. L’affichage n’est que de 640x480, et j’ai récemment découvert qu’il s’agissait d’un pilote vidéo de 16 bits par pixel dont le format est de 5: 6: 5 RVB. Cette dernière pièce est nouvelle et explique probablement pourquoi les fichiers d'entrée comportant des remplissages dégradés dans les sections d'animation affichent un comportement de bande étrange - beaucoup de blocs de scintillement.

Les fichiers d'entrée sont un mélange de choses - des fichiers vidéo de tailles variées provenant de partout (mais de 45 secondes ou moins), et j'utilise FFMPEG pour convertir le format d'entrée en mon format cible:

Conteneur AVI Vidéo XVID à environ 300 kbps Audio MP3 à 96 kbps mono ou stéréo de taille 640x480 pour s'adapter à la taille de fichier réduite à l'écran de sorte que 10 fichiers environ puissent tenir sur la carte SD, ainsi que le programme de lecture en boucle (ancien et technologie de pointe par rapport aux normes actuelles, appareil et n'est pas modifiable pour plusieurs raisons)

Une configuration de conversion était en cours d’exécution il ya quelques semaines pour le premier lot de conversion, mais les utilisateurs n’étaient pas satisfaits de la qualité de la sortie. MediaInfo a continué à signaler que le débit binaire était bien supérieur à la valeur souhaitée de 300 Ko.

J'utilisais le codec libxvid, mais il existe en fait un bogue (# 6217) qui indique que l'attribut -b: v 300K ne fonctionne pas avec cela, mais que le codec mpeg4 fonctionne. Certaines expériences au cours des derniers jours me font croire cela. J'ai également constaté que je pouvais augmenter le débit cible à environ 500 kbps avec le codec mpeg4 et me retrouver avec un fichier de sortie de taille raisonnable (environ 3 Mo pour un fichier à 40 ans).

Ce que j'ai fini jusqu'à présent est la suivante:

ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid -src_format yuv420p -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 1 -an -f avi NUL
ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid  -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 2 -c:a libmp3lame -b:a 96k "output.avi"

Je reçois des fichiers qui fonctionnent sur le périphérique, mais les sections de dégradé sont très blocantes et scintillent beaucoup, et les zones qui ont un grand rectangle de couleur rouge ont toutes sortes d'artefacts lors de la lecture sur le périphérique cible. Les artefacts sont également visibles lorsque je lis la vidéo de sortie dans VLC sur mon ordinateur portable Windows. Ils ont juste l'air pire sur le périphérique cible.

J'ai essayé d'utiliser -q: vn (où n était compris entre 2 et 8) - la qualité était un peu meilleure, mais la taille du fichier n'était pas pratique.

Et je me rends bien compte que je mène une bataille difficile pour essayer d'obtenir une vidéo agréable lorsque je réduis la taille de ma sortie et pour réduire le fichier résultant de manière significative.

Cependant, dans mon énorme quantité de recherches sur Google, j'ai rencontré aujourd'hui quelque chose faisant référence à la conversion de pixels de YUV (ce que MediaInfo dit être mes fichiers de test particuliers) à 16 bpp RBG. Mais je ne peux pas comprendre quelle est la bonne incantation pour essayer de générer un fichier de sortie qui tente de prendre en compte la profondeur de couleur inférieure de mon appareil. J'ai essayé plusieurs choses qui s'opposaient à l'ajout de -dst_format rgb565le à ma ligne de commande.

Quelqu'un peut-il expliquer cela, ou me diriger vers un exemple où cela se fait sur la ligne de commande? Merci.

GuyWithDogs
la source
Cet appareil prend-il uniquement en charge la vidéo MPEG-4 Part 2? Quels autres formats supporte-t-il? L'encodeur mpeg4ne supporte que yuv420p.
llogan
Pouvez-vous partager une vidéo qui a l'air bien sur l'appareil?
Gyan
L'appareil prend uniquement en charge les conteneurs AVI avec le codec Xvid. L'utilisation de libxvid ou mpeg4 crée des vidéos lisibles, mais seul mpeg4 semble également permettre la limitation du débit binaire nécessaire pour conserver la taille du fichier et ne pas surcharger le processeur lors de la lecture. Et j’ai seulement confirmé hier que la profondeur de couleur est de 16 bpp, alors que la quasi-totalité des entrées est de 24 bpp jusqu’à présent.
GuyWithDogs
Je n'ai pas vraiment de vidéo qui ait l'air bonne - toutes les vidéos montrent le comportement de blocage, c'est pourquoi j'ai commencé à regarder dedans. Une généralisation serait que les animations (en particulier avec des dégradés) qui sont entrées sont généralement (subjectivement) pires que la vidéo normale "en ville" (comme une publicité télévisée ou un clip vidéo). Et de grandes zones de fond noir apparaissent sous forme de blocs de carrés gris-noirs.
GuyWithDogs