imagemagick conversão de imagem canalizada em avconv falha

3

Estou tentando escrever um script que deve pegar todo tipo de imagem (formato, tamanho ...) e criar um vídeo com o avconv. Eu consegui fazer funcionar com uma série de jpg (todos do mesmo tamanho) e agora estou tentando usar o convert para ter certeza de que ele irá criar o vídeo, tornando todas as imagens similares em tamanho e formato. Aqui está como eu faço:

(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

Eu tenho uma série de imagens em que o avconv retorna:

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

Eu verifiquei e a imagem parece ok quando estou usando apenas convert. Eu acho que estou faltando algo em converter para tornar a imagem perfeitamente idêntica para avconv para o trabalho. Mas eu não consigo encontrá-lo

Thx pela sua ajuda!

EDITAR

Então, depois de investigar isso, parece que as imagens de saída não têm a mesma resolução e / ou taxa de amostragem. Então eu tentei isso:

(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"

Ainda não há sucesso ...

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

pipe :: Entrada /

Aqui está a imagem que eu uso:

  • link
  • link
  • link
  • link

Espero que isso ajude ...

    
por charly 26.04.2013 / 01:34

1 resposta

3

Depois de muita pesquisa, finalmente encontrei algo funcionando (pelo menos com meus poucos arquivos de teste):

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"

As opções importantes são:

  • -strip remove todas as informações extras da entrada (eu tinha, por exemplo, o perfil de cor ou alguns dados EXIF), isso estava causando problemas para o avconv, aparentemente
  • -sampling-factor '4:2:2' Isso corrige o fator de amostragem jpeg para 4: 2: 2 (Se você acha que há uma escolha mais sábia do que 4: 2: 2, por favor, me diga)
  • -type TrueColor não foi testado, mas uma imagem em escala de cinza terá um formato diferente que será mantido em jpeg e forçado a converter em TrueColors para que todas as imagens usem a mesma codificação de cores.

Isso resolveu meus problemas. Por favor me diga se você ver mais alguma coisa ... Thx

    
por 26.04.2013 / 16:24