РЕЗЮМЕ: Я пытаюсь выяснить (я полагаю, пример), как использовать теги scaler src_format/dst_format для преобразования в определенный 16-битный формат RGB для целевого устройства.
Я имею дело с некоторым старым оборудованием, которое воспроизводит видео с небольшой 64 МБ SD-карты. Да, МБ. Дисплей только 640x480, и я недавно выяснил, что он имеет 16 бит на пиксель видеодрайвер, который я думаю , 5:6:5 RGB. Этот последний фрагмент является новым и, вероятно, объясняет, почему входные файлы с градиентной заливкой в разделах анимации отображаются со странным поведением полос - много мерцающих блоков.
Входные файлы представляют собой смесь вещей - видеофайлы различного размера, полученные со всего (но не более 45 секунд), и я использую FFMPEG для преобразования из входного формата в мой целевой формат:
AVI-контейнер XVID видео со скоростью 300 кбит / с или MP3-аудио с 96 кбит / с моно или стерео размером 640x480 для экрана небольшого размера, чтобы на SD-карту помещалось около 10 файлов вместе с программой циклического воспроизведения (это старая и низкотехнологичное по сегодняшним меркам устройство и не подлежит изменению по нескольким причинам)
У меня была настройка конвертации, запущенная несколько недель назад для первой партии конверсии, но люди не были довольны качеством вывода, и MediaInfo продолжала сообщать, что скорость передачи данных намного превышает желаемое значение 300K.
Я использовал кодек libxvid, но на самом деле есть зарегистрированная ошибка (# 6217), которая указывает, что атрибут -b:v 300K не работает с этим, но кодек mpeg4 работает. Некоторые эксперименты за последние пару дней заставляют меня в это поверить. Я также обнаружил, что с помощью кодека mpeg4 можно увеличить целевую скорость до 500 кбит / с и получить выходной файл разумного размера (около 3 МБ для файла 40 с).
Что я закончил до сих пор это:
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"
Я получаю файлы, которые работают на устройстве, но градиентные участки очень блочные и часто мерцают, а области, которые имеют большой прямоугольник красного оттенка, имеют всевозможные артефакты при воспроизведении на целевом устройстве. Артефакты также видны при воспроизведении выходного видео в VLC на моем ноутбуке с Windows. Они просто выглядят хуже на целевом устройстве.
Я попытался использовать -q: vn (где n было между 2 и 8) - качество было несколько лучше, но размер файла был непрактичным.
И я понимаю, что я сражаюсь в тяжелом сражении, пытаясь получить приятное видео, когда я уменьшаю свой выходной размер и пытаюсь значительно сократить полученный файл.
Однако в моем огромном количестве Googling я наткнулся сегодня на что-то, относящееся к преобразованию пикселей из YUV (что, как MediaInfo говорит о моих конкретных тестовых файлах) в RBG 16bpp. Но я не могу понять, что такое правильное заклинание, чтобы попытаться сгенерировать выходной файл, который пытается учесть меньшую глубину цвета моего устройства. Попробовал несколько вещей, которые возражали против моего добавления -dst_format rgb565le в мою командную строку.
Может кто-нибудь объяснить это или указать мне пример, где это делается в командной строке? Благодарю.