Corrigindo um fluxo de imagem / jpeg não migrado da webcam usando o gstreamer

0

Eu fiz uma filmagem quebrada usando o seguinte pipeline:

gst-launch-1.0 v4l2src ! filesink location=encode.mjpeg

De alguma forma, o gstreamer ainda pode reproduzi-lo:

gst-launch-1.0 filesrc location=encode.mjpeg ! jpegdec ! videoconvert ! xvimagesink

No entanto, como eu, por engano, não usei nenhum contêiner, o fluxo é reproduzido em um ritmo muito rápido framerate=(fraction)0/1 . Existe alguma maneira de converter meu arquivo quebrado em um .avi ou qualquer outro contêiner sem recompressão?

O seguinte muxing trivial não funcionou como esperado:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! avimux \
    ! filesink location=encode.avi . -v

De alguma forma, o gstreamer joga encode.avi de volta muito lentamente a ~ 1 FPS sem consumir CPU significativa. E nem o Vlc 'nem o Adobe Aftereffects podem importá-lo - eles exibem apenas um stipe corretamente decodificado do primeiro quadro no topo.

    
por nponeccop 17.09.2013 / 14:44

1 resposta

0

O problema que você está tendo com o muxing no avi está relacionado ao fato de o filesrc estar fornecendo buffers para o avimux que não estão adequadamente alinhados com os mjpeg frames, então o avimux está criando amostras com alinhamento errado internamente, tornando mais difícil para os jogadores para usá-los mais tarde durante a reprodução.

Isso pode ser corrigido usando um analisador mjpeg após o capsfilter (jpegparse?). Outra opção é decodificar e re-codificar as amostras para que elas sejam alinhadas e alteradas corretamente. O seguinte pipeline deve funcionar:

gst-launch-1.0 filesrc location=encode.mjpeg \
! 'image/jpeg,framerate=30/1,width=1280,height=720' ! decodebin ! videoconvert ! \
<some encoder> ! <some muxer> ! filesink location=outputfile

Você pode selecionar o codificador e muxer que quiser, você pode até mesmo codificá-los de volta para jpeg e mux no avi, como você queria inicialmente.

Editar : para tentar transformar o conteúdo em avi sem decodificar, tente algo como:

gst-launch-1.0 filesrc location=encode.mjpeg \
    ! 'image/jpeg,framerate=30/1,width=1280,height=720' ! jpegparse ! avimux \
    ! filesink location=encode.avi . -v

Se o jpegparse fizer isso funcionar muito bem, o '' image / jpeg, framerate = 30/1, largura = 1280, altura = 720 '' não deve ser necessário.

    
por 17.09.2013 / 19:07