Então, eu peguei a Câmera Raspberry hoje e as fotos estão funcionando bem.
Capture uma imagem no formato JPEG:
raspistill -o image.jpg
Capture um vídeo de 5 segundos no formato H.264 :
raspivid -o video.h264
Não quero instalar nenhum aplicativo extra, pois quero aproveitar o HTML5 que está prontamente disponível. Como o Chrome / Safari possui decodificadores internos para o H.264, só quero apontar meu navegador para o URL e assistir ao stream.
Como posso conseguir isso?
webcam
streaming-video
camera
Piotr Kula
fonte
fonte
Respostas:
Streaming com HLS
Método proprietário da Apple de transmitir vídeo ao vivo. É chamado de HTTP Live Streaming (HLS) e é suportado apenas pela tecnologia da Apple. O Google (Chromium / YouTube) usa sua própria implementação, chamada dash mpeg, e todo mundo está confuso ou usando o H.264 encapsulado no MP4 .
PROS
.m3u8
playlistsCONS
m3u8
.m3u8
é simplesmente uma versão UTF-8 do formato M3U. (os arquivos .m3u podem ter várias codificações.) Algumas pessoas afirmam que renomear um .m3u8 para .m3u funcionará conforme o esperado em todos os navegadores HTML5. Eu tentei isso e não funcionou para mim.O conceito por trás desse streaming é que segmentos curtos de arquivos, com pelo menos 5 segundos de duração (neste exemplo - são possíveis novas formas de acelerar), são gravados e salvos em um arquivo adequado. O arquivo da lista de reprodução é atualizado com o novo nome de arquivo e o cliente sempre pesquisa essa lista de reprodução e baixa o arquivo mais recente. Existem alguns mecanismos envolvidos para mesclar o vídeo perfeitamente no cliente. É por isso que outros desenvolvedores não querem implementar isso porque exige muito esforço e não está em conformidade com os padrões HTML5 (mesmo que não exista um padrão HTML5 adequado para transmissões ao vivo? Ehh, suspiro ).
Instalando
Você precisa compilar
ffmpeg
- não useapt-get install
para FFmpegIsso pode levar até 5 horas - deve ser a versão 1.1 ou superior, que suporta o streaming de segmentos. Você pode usar isso para cloná-lo e compilá-lo.
/usr/share/nginx/www/
Crie um arquivo de script do Bash chamado algo como
video.sh
, apliquechmod +x
-o e cole-o. Altere a pasta base para onde quer que esteja o servidor HTTP . Eu costumavanginx
,/usr/share/nginx/www/
Crie um arquivo HTML que carregará a lista de reprodução
Apoio, suporte
Referência: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392
Código original: https://github.com/AndyA/psips/blob/master/examples/hls.sh
fonte
-segment_wrap 10
como argumento ao ffmpeg, ele usará no máximo 10 arquivos de segmento.segments/
ao apontar para os arquivos de segmento, então larguei a pasta de segmentos. Eu entendi mal alguma coisa?UV4L MMAL
Agradecemos o comentário de @mpromonet pela atualização do driver Linux-Projects V4L2 que agora implementa o MMAL com muita eficiência - mas ainda é um trabalho em andamento.
Siga estas instruções para instalar o repositório linux-project e instale o driver UV4L com extras. Em seguida, instale o servidor e o mjpeg. Se você quiser, também pode experimentar os outros.
Depois de instalar tudo, você pode acessar o servidor HTTP na porta 8080. Você também deve verificar o
/etc/uv4l/conf
arquivo e definir se deseja mjpeg ou H.264, pois isso faz a diferença, mas é possível ajustar algumas configurações através da Web embutida. servidor.HTML 5
Era isso que estávamos esperando (chamado WebRTC ) e, graças ao novo driver, ele funciona muito bem (em um Raspberry Pi 2).
Primeiro, siga estas etapas, http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :
Em seguida, no seu Raspberry Pi 2 instale este WebRTC (para um Raspberry Pi 1, leia o site vinculado para outras opções)
Reinicie todos os drivers e vá para
Agora você tem streaming de vídeo de baixa latência e alta qualidade direto para um navegador moderno como o Chrome ou o Firefox. (Talvez o Safari, mas não posso verificar porque eles não fazem mais o Winblows e o Internet Explorer ... eh)
MJPEG
Por padrão, ele usa
mjpeg
1080p, e é muito lento. Ajustei o tamanho do quadro em 800x600 e usei algo como o iSpy para processar o vídeo. Por segurança, recebo cerca de 10 qps em um vídeo nítido. É muito melhor do que os 3 qps em 640x480 antes deste driver. Funciona no iPhone com Safari, Android Chrome e quase todo o resto.http://raspberrypi:8080/stream/video.mjpeg
Isso também significa que
motion
deve (ainda preciso testar e comparar) funcionar muito melhor agora. Certifique-se de definir a configuração para usarv4l2_palette 8
ouv4l2_palette 2
H.264
Agora isso foi corrigido para "streaming", e não precisamos nos esforçar ao máximo para assistir a vídeos H.264 através do VLC media player . O fluxo é ainda no formato RAW H.264, portanto, é necessário desmembrá-lo ou transcodificar / encapsualte se você precisar que ele funcione em outro lugar. Você deve ajustá-lo
bitrate=xxxxxx
no arquivo de configuração se estiver transmitindo por Wi-Fi.No VLC media player, você deve informar que deseja usar o desmuxador H.264. Portanto, se você estiver usando a GUI, adicione o argumento
:demux=264
. Na linha de comandovlc http.../video.h264 --demux h264
,. Caso contrário, você verá uma tela em branco, mesmo que o LED da câmera esteja aceso.http://raspberrypi:8080/stream/video.h264
Voila! Streaming HD com aproximadamente 500 ms de atraso (com ajustes, até 200 ms). Definitivamente, é muito mais fácil do que usar os métodos antigos. A qualidade e o FPS são excelentes, mas você não pode incorporar isso no HTML5 sem transcodificar para MP4 ou WebM . Espero que isso seja implementado, pois realmente fará deste um ótimo servidor independente.
RTSP / RTMP / RTP
Não suportado / implementadohttp://www.linux-projects.org/uv4l/tutorials/rtsp-server/
HLS
Não suportado / implementado
Ainda não hávideo4linux
driver disponível. Isso significa que não podemos usar o ffserver para transmitir dados usando/dev/video0
ou comparados como uma webcam USB.É por isso que é tão difícil encontrar a transmissão ao vivo adequada para navegadores HTML5.
Gstreamer
(não HTML5)<OBJECT ...
:) (atrasado)fonte
video4linux
motorista o motorista V4L2 bcm2835-v4l2 oficial eo motorista userspace V4L2 [ linux-projects.org/modules/sections/...--demux h264
bandeira. Ainda precisamos transcodificar isso para uso em dispositivos móveis ou incorporação como mp4 / webm em páginas da web. Mas é realmente ótimo avançar com eficiência e qualidade. Não confunda com a "outra" coisa de driver de projeto não linux do UV4L que é lixo./usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Streaming com MJPEG
U4VL
Uma interface do kernel com uma compilação no servidor HTTP (S).
http://www.linux-projects.org/uv4l/tutorials/streaming-server/
Interface da Web Raspberry Pi Cam
Um bom projeto da silvanmelchior que implanta um servidor web, como o dvr, servidor de streaming multi-alvo. Precisa de mais informações
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
Método legado
O streaming com mjpg é suportado por quase todos os navegadores, incluindo o Internet Explorer 6. Muitas câmeras usadas antes do H.264 usavam mjpg de hardware, que basicamente despejava arquivos JPEG o mais rápido possível em uma pasta enquanto o mjpg lia o arquivo em um buffer e excluía eles. Alguns dispositivos podem atingir até 25 qps e, mesmo se você tiver uma conexão ruim, obterá pelo menos 1 qps.
O suporte para mjpg foi descartado nas câmeras HD porque o arquivo JPEG ficou muito grande para transmitir pela Internet e o H.264 é um protocolo muito mais rápido e de melhor qualidade.
Como não temos como transmitir o H.264 usando o módulo da câmera de forma nativa, isso parece uma alternativa viável ...
É praticamente instantâneo, mas não espere obter mais de 1,5 qps. Isso se resume a
raspistill
ser extremamente SLOOOW! O uso da função de lapso de tempo definida como 100 ms, que deve nos dar 10 fps, não funciona, porqueraspistill
apenas engasga e apresenta sérios problemas de desempenho./tmp
para usar a RAM para/etc/default/tmpfs
alterar a velocidadeRAMTMP=yes
(este é um esforço para aumentar os fps, mas o raspistill simplesmente não consegue se manter.)/usr/src
, mkdir mjpg-streamer, cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
seus pluginsinput_*.so
eoutput_*.so
para/usr/local/bin
. Caso contrário, execute-o diretamente no diretório src.mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"
(execute isso onde estão os binários e os plugins)http://<IP-address>:8080
Eu lutei para compilá-lo por cerca de 5 horas ... suspiro , mas acho que vou usá-lo para acessar o fluxo de qualquer telefone e navegador. Eu só tenho que esperar até conseguirmos melhores pilotos ... Mais um ano ou dois. :(
Independentemente da qualidade que eu tente, não fico mais rápido ou mais lento que 1 qps usando o fluxo. Usei 720p e 1080p e apenas a qualidade da imagem melhora, mas o fps não faz diferença na LAN. Suponho que configurações menores ajudarão com WAN / 3G ou outras transmissões de rádio.
raspistill grava a imagem em um único arquivo. Isso pode ser um gargalo. Ele grava o arquivo, o leitor de mjpg o lê e o exclui, causando uma E / S de bloqueio, de modo que o raspistill não pode gravar no arquivo.
A única coisa em que consigo pensar é em usar o raspivid no FFmpeg que criará arquivos JPEG para nós - preciso tentar isso e, possivelmente, é muito mais rápido do que usar raspistill. Consegui obter 25 qps com uma qualidade chocante e demorou cerca de 10 segundos ... Ajustar as configurações me deu cerca de 3 qps, mas 100% da CPU. Nenhum hardware está sendo usado para processar o fluxo de vídeo ...
Eu também estava lendo e descobri que podemos usar
%d
o nome do arquivo de saída raspistill. Gostaria de saber se isso vai aumentar os fps. Também a codificação JPG é acelerada por hardware em raspistill, então estou realmente lutando para descobrir por que é tão lento ...Eu tenho uns 2 FPS impressionantes usando
%d
o nome do arquivo. Por alguma razão, a gravação do arquivo JPEG é terrivelmente lenta a partir do raspistill. Suspiro.fonte
A partir de 2017 (ou talvez antes)
raspivid
não é mais o método preferido, com os desenvolvedores do Pi recomendando que as pessoas usem o V4L2.Portanto, esse método permite transmitir H264 via RTP usando V4L2 em vez de
raspivid
. Notei que esse método resulta em menos desistências e permite uma taxa de bits mais alta:Esse script faz multicamada do vídeo e pode ser visualizado em outra máquina na LAN com um comando como este:
-sync ext
faz com que o vídeo seja reproduzido o mais rápido possível, para que seja executado em tempo real, em vez de executá-lo em uma taxa de quadros fixa e atrasada se o Pi estiver capturando quadros mais rapidamente do que isso. Ainda há algum atraso neste método, mas não é pior que os outrosraspivid
métodos.(Dica: se você estiver conectado a um roteador ou switch que suporta IGMP, verifique se
224.0.0.0/4
não está com firewall na sua máquina; caso contrário, quando o roteador perguntar ao seu PC se deseja algum tráfego multicast, o PC nunca responderá e você nunca verá qualquer vídeo.)Gravando em disco
Como mencionei a gravação nos comentários abaixo, vou expandir isso aqui. Você pode usar um comando como este para gravar o fluxo da rede em disco:
Veja
man strftime
o significado dos%
símbolos no nome do arquivo. Os deste exemplo usam o número do dia (0 = domingo, 1 = segunda-feira etc.) seguido de aeT
depois a hora. Inicia um novo arquivo a cada 15 minutos.Só para esclarecer, este comando de gravação deve ser executado em um PC remoto (não no próprio Pi), embora provavelmente funcione também no Pi (não testado).
Como você obtém um novo arquivo a cada 15 minutos com o dia e a hora no nome do arquivo, significa que após uma semana você começará a gerar nomes de arquivos que já foram usados, fazendo com que os arquivos mais antigos sejam substituídos. Em outras palavras, você terminará com um loop contínuo das gravações da semana anterior. Isso é ideal para uma câmera de segurança em que você raramente precisará voltar mais de uma semana.
Como observação lateral, isso produz cerca de 500 GB de arquivos, portanto, convém ajustar a taxa de bits, a resolução ou substituir os arquivos mais cedo (digamos a cada 24 horas), se você não quiser que eles ocupem muito espaço.
fonte
ffserver
ou outro sistema de servidor, se desejar que mais de uma máquina exiba o feed. Depois de talvez 2-3 clientes (dependendo da taxa de bits do vídeo), o adaptador USB Ethernet do Pi ficará sem largura de banda. Com o multicast, não há necessidade de executar um servidor (as máquinas clientes apenas escolhem ouvir ou não o tráfego), para que você possa ter milhares de máquinas exibindo o vídeo sem impacto no Pi, que apenas envia um único fluxo de vídeo .Consegui transmitir do meu Raspberry Pi para um servidor da Web com o módulo compilado nginx-rtmp .
Para evitar aborrecimentos
ffmpeg
, recomendo uma distribuição contínua como o Arch Linux Arm .Algumas notas:
Portanto, com base nisso, acho que a transmissão ao vivo a partir de um Raspberry Pi pode ser boa para uma transmissão temporária, mas não para uma webcam sempre ativa, pois ela tem muita largura de banda. Você não receberá áudio e, se o fizer, será uma missão sincronizar.
Você pode gravar áudio com mais eficiência separadamente, ao mesmo tempo que grava vídeos. Depois, talvez mux o feed de áudio mais tarde, converta-o para WebM e coloque-o no seu httpd como um arquivo estático com uma tag de vídeo HTML. O fluxo de trabalho é bastante complicado, embora seja o melhor que posso pensar para uma transmissão eficiente que funcionará sem problemas nos navegadores.
fonte
O UV4L agora suporta streaming de áudio e vídeo ao vivo com WebRTC e HTML5.
fonte
A resposta de Piotr Kula parece estar no caminho certo, mas está desatualizada no trecho de framboesa.
Há instruções atualizadas para o uv4l no Raspberry stretch em
https://www.linux-projects.org/uv4l/installation/
Você pode alterar as opções do uv4l via /etc/uv4l/uv4l-raspicam.conf e reiniciar o serviço com
No meu caso, as coisas não funcionaram imediatamente (se esqueci de instalar o uv4l-server ...). Os comentários a seguir podem ajudá-lo a depurar problemas semelhantes.
Eu verifiquei se o servidor está sendo executado com:
e se ouviu com
mas não havia entrada para uv4l na lista. Eu esperava um para a porta 8080
então eu tentei o comando de Como configurar UV4L?
Mas o servidor ainda não foi iniciado automaticamente ...
então me mostrou a opção
então eu tentei:
mas ainda nenhum servidor em execução na porta 8080 ou em outro lugar. Então parece que eu esqueci a opção "--foreground" que a página de manual afirma ser necessária:
Agora essa é uma dica clara! Parece não haver servidor ainda - então instale-o:
e tente novamente:
O servidor está agora disponível em http: // pi: 8080 (substitua pi pelo ip ou nome do host do servidor)
Após uma reinicialização, funcionou sem inserir outro comando.
fonte
O UV4L agora suporta transmissão de áudio e vídeo ao vivo para o Jitsi Meet Rooms pela Web. Nenhuma configuração especial é necessária. É tão fácil quanto preencher seu nome, quarto e clicar em Iniciar .
fonte
webkitRTCPeerConnection is not defined
erro. Eu normalmente uso o IceWeasel para WebRTC, mas isso não é suportado pelo Jitsi.