3

Я пытаюсь написать сценарий, который должен принимать все виды изображений (формат, размер ...) и создавать видео с помощью avconv. Мне удалось заставить его работать с серией jpg (хотя и одинакового размера), и я сейчас пытаюсь использовать конвертирование, чтобы убедиться, что оно создаст видео, сделав все изображения одинаковыми по размеру и формату. Вот как я это делаю:

(for J in $(ls "$1/"* 2> /dev/null); do
     convert "$J" -resize 640x480 -gravity center \
             -size "$FORMAT" -fill black -extent 640x480 jpg jpeg:-
done) | avconv -f image2pipe -r 1/5 -c:v mjpeg -i - \
               -vcodec libx264 -r 20 -f mpegts video.mpeg

У меня есть серия изображений, где avconv возвращает:

Input stream #0:0 frame changed from size:640x480 fmt:yuvj420p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
 Error while decoding stream #0:0
 Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

Я проверил, и изображение выглядит нормально, когда я просто использую конвертировать. Я предполагаю, что мне не хватает что-то в конвертировании, чтобы сделать изображение полностью идентичным для работы avconv. Но я не могу найти это

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ

Таким образом, после исследования это может быть вызвано тем, что выходные изображения имеют разное разрешение и / или коэффициент дискретизации. Итак, я попробовал это:

(for J in $(ls "$1/"* 2> /dev/null); do
    convert "$J" -background '#000000' -resize "640x480" 
                 -gravity center -extent "640x480" -sampling-factor '4:2:2' 
                 -resample '72x72' jpeg:-
done) | 
avconv -f image2pipe -r 1/5 -c:v mjpeg -i - 
       -vcodec libx264 -r 30 "foo.mpeg"

Все еще безуспешно, хотя ...

Input stream #0:0 frame changed from size:640x480 fmt:yuvj422p to size:160x120 fmt:yuvj422p
Input stream #0:0 frame changed from size:160x120 fmt:yuvj422p to size:320x240 fmt:yuvj422p
Input stream #0:0 frame changed from size:320x240 fmt:yuvj422p to size:88x128 fmt:yuvj420p
[mjpeg @ 0x101838800] only 8 bits/component accepted
Error while decoding stream #0:0
Input stream #0:0 frame changed from size:88x128 fmt:yuvj420p to size:120x160 fmt:yuvj420p

труба :: Вход /

Вот изображение, которое я использую:

Надеюсь это поможет...

1 ответ1

3

После долгих поисков я наконец нашел что-то работающее (по крайней мере, с несколькими тестовыми файлами):

convert "$J" -background '#000000' -resize "$FORMAT" \
        -gravity center -extent "$FORMAT" -strip \
        -sampling-factor '4:2:2' -type TrueColor jpeg:- | \
avconv -f image2pipe -r 1/"$DURATION" -c:v mjpeg -i - \
       -vcodec libx264 -r 20 -f mpegts "$RESULT_FILE"

Важные варианты:

  • -strip удаляет всю дополнительную информацию из ввода (у меня был, например, Цветовой профиль или некоторые данные EXIF), это вызывало проблемы с avconv, по-видимому
  • -sampling-factor '4:2:2' Это фиксирует коэффициент выборки jpeg до 4:2:2 (если вы думаете, что есть более мудрый выбор, чем 4:2:2, пожалуйста, сообщите мне)
  • -type TrueColor это не проверено, но изображение в оттенках серого будет иметь другой формат, который будет сохранен в формате jpeg. Этот параметр заставляет конвертировать в TrueColors, чтобы все изображения использовали одинаковую цветовую кодировку.

Это решило мои проблемы. Пожалуйста, скажите мне, если вы видите что-нибудь еще ... Спасибо

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .