Streaming H264 com Logitech C920

13

Eu tenho uma webcam logitech C920. Ele tem a capacidade de codificar diretamente o vídeo no H264.

Quero reproduzir o que foi feito com um Beaglebone, mas usando um Raspberry Pi: envie um fluxo H264 para a rede . O Raspberry Pi está aqui apenas para empacotar o fluxo no RTP, a compactação de vídeo é feita pela própria webcam. O modo H264 é imposto usando o video4linux.

Até agora, e se eu usar um computador comum com a versão mais recente do Ubuntu, ele funcionará usando o VLC como servidor ou GStreamer. Por exemplo, se eu iniciar no Raspberry Pi um servidor VLC usando o comando:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... e, se eu ler o stream com o VLC em outro computador, está tudo certo.

No entanto, se eu usar o raspberry Pi para enviar o fluxo de vídeo, o resultado será muito ruim. Muito lixo na imagem assim que algo se move. As chaves de imagem são bem recebidas a cada 10 segundos, mas, enquanto isso, não é bom o suficiente em comparação com o fluxo de um computador comum.

Eu também tentei o método descrito para o beaglebone com o utilitário "capture" fornecido : ok se eu transmitir em um computador real, o mesmo problema de lixo se transmitir em um Raspberry Pi.

Não é um problema de rede: fiz algumas verificações de rede com o Wireshark e as estatísticas do VLC, não tenho perda de pacotes. Eu tentei com o Raspbian e o Arch Linux para Raspi (gstreamer 0.10 no raspbian, gstreamer 1.0 no Arch Linux).

Não sei se é relevante ou não, mas também testei com a versão de suporte a flutuação suave do Raspbian. Uma atualização deve ser feita primeiro para usar um kernel 3.2; mas mesmo problema, o vídeo tem algum lixo.

Alguma idéia do que eu poderia fazer para melhorar a qualidade do vídeo?

Vincent Hiribarren
fonte
Tente reduzir a taxa de quadros. A CPU do rPi é muito ruim, então acho que transmitir uma imagem de 800x600 a 30FPS é demais. Somente a nova placa da câmera rPI conectada via conector MIPI / CIS (em vez de USB) transmite 1080p a 15-30 FPS.
Matthias
Não é FPS. O Pi pode suportar HD a 60FPS sem problemas usando o módulo Pi Camera. Se a câmera da Logitech enviar um vídeo H264, ele já está codificado e o Pi precisará transmitir novamente os pacotes ... dos quais é totalmente capaz. De fato, ele pode retransmitir até 6 fluxos HD a 25FPS antes de atingir o limite máximo. Deve ser os corromper pacotes do controlador V4L
Piotr Kula
Eu sei que é um tópico antigo, mas você finalmente encontrou algo que funciona? Estou tentando fazer algo semelhante e preso
Ajith
Eu usei um Beaglebone e funcionou melhor. O problema ocorreu devido a um driver USB ruim para o RaspberryPi no Raspbian. Tanto quanto me lembro, mais tarde testei o mesmo sistema com uma versão posterior do Raspbian e tinha menos lixo. Posso fazer uma atualização do rpi (como foi dito em uma das respostas), mas não me lembro bem. Mas o certo é que o desempenho foi melhor após o uso de um firmware / sistema operacional atualizado.
Vincent Hiribarren
Vincent, estou recebendo um erro 'não é possível abrir o URL v4l2'. Este comando está desatualizado?
dalanmiller

Respostas:

5

Eu tive o mesmo problema, encontrei este tópico ao procurar por um codificador de hardware, não por problemas do c920.

No entanto, execute uma atualização de firmware para o raspberry pi e o lixo deve acabar

$> sudo rpi-update

Eu mesmo encontrei a solução aqui: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi

Steffen
fonte
Para encerrar esta pergunta, aceito essa resposta. O problema ocorreu devido a um driver USB quebrado, houve alguma perda de pacotes na comunicação USB. Um sistema / firmware atualizado deve fazer o truque.
Vincent Hiribarren
2

Você pode tentar usar o FFMPEG. Mas o problema não é usar a versão dos repositórios porque está desatualizada. Existe uma versão bifurcada que funciona muito bem.

Você terá que compilá-lo, que leva 5 horas ou mais, ou baixar um binário pré-compilado.

Em seguida, você pode canalizar os dados do driver V4L para o FFMPEG com essas configurações. Onde -i "fifo"deveria ser apenas -ipara caputre o fluxo encanado e -fvocê precisará verificar novamente como produzi-lo H264. o FLV o reembala em FLV que pode ser reproduzido com players de HTML.

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

ou um exemplo, descobri que tem como alvo diretamente a V4L, mas oyu precisa ter a câmera presente em /dev/video* * 1ou mais ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

o -fdenota o formato de saída no. Isso não significa que ele irá transcodificar-lo como H264 para FLV só fica envolto no formato FLV. então mude o endereço para o seu VLC player de clientes. por exemplo-f mpegts udp:192.168.1.19:1234

O VLC não parece funcionar muito bem no Pi. Tive muito pouco sucesso ao enviar o módulo Pi cmaera para o meu PC usando UDP. Funcionou, mas não era estável.

Você também pode instalar o nginx com o módulo rtmp, que funciona bem. Veja este guia, mas você precisará ajustar um pouco as configurações. Você então conecta seu VLC player ao fluxo nginx-rtmp e ele funciona como um encanto.

Piotr Kula
fonte
1
Qual versão bifurcada é a que funciona bem?
22714 Brian
1

Isso parece funcionar para mim @ menos ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy

Philippe Gachoud
fonte
0

Tente com um buffer maior no cliente que exibe o vídeo. Para mim, há uma diferença dramática entre o buffer de 1000ms e o buffer de 200ms. O buffer de 5000ms parece melhor que o buffer de 1000ms.

: cache de rede = 2000

Odie
fonte
Se o problema persistir, por favor, marque como resposta, caso a sua dúvida não tenha sido solucionada, por favor, poste novamente.
Piotr Kula
0

Postei uma possível solução no fórum raspberry usando um servidor RTSP leve baseado no live555 que captura o H264 a partir de um driver V4L2. Está disponível no github h264_v4l2_rtspserver

Isso foi feito para a raspicamera, mas deve funcionar com qualquer dispositivo V4L2 que forneça H264.

mpromonet
fonte
-1

Se eu entendi bem sua situação, você quer que o Raspberry transcodifique o vídeo para o H264? Eu acho que é por isso que você obtém desempenho ruim, porque o VLC está usando codificação de software e o Raspberry não é poderoso para essa tarefa.

Eu sugeriria tentar com o Gstreamer e os gst-omxplugins . Há um elemento para a codificação de vídeo de hardware que seria um bom servidor a partir do seu Raspberry.

10robinho
fonte
1
Como ele disse, a câmera Logitech já oferece H.264. Portanto, o rPi está apenas transportando quadros, mas não fazendo nenhuma codificação.
Matthias
Ele não está transcodificando. Apenas retransmitindo os dados. Como ele usa fluxo diretamente.
Piotr Kula