Como transmitir vídeo H.264 do módulo de câmera Raspberry Pi por meio de um servidor da web?


50

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?


2
Também estou trabalhando nisso. Eu acho que você precisa adicionar suporte MP4 ao nginx ou algo assim. Avisarei se eu tiver um avanço.
recantha 16/05

@recantha Você já teve alguma novidade com o streaming de vídeo?
Piotr Kula #

3
A melhor solução que encontrei é baseada no RaspiMJPEG de Silvan Melchoir. Dê uma olhada no meu blog, que contém um link para o fórum da Raspberry Pi Foundation que explica tudo. ( recantha.com.br/blog/?p=11176 )
recantha

2
Sim, parece incrível poder transmitir para vários dispositivos. Que FPS e lag você recebe ?? Consegui fazer com que o uv4l funcionasse muito bem com o VLC e o OSD. Uma demonstração muito curta e ruim. Vai fazer um melhor em breve. Foi feito tarde da noite após horas de tentativa e erro. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin como posso gravar através de um script python enquanto o RaspiMJPEG está em execução? Ele dá um início na gravação de vídeo, mas grava no formato .h264 como fazer um script python ao pressionar start_recording?
Coderaemon

Respostas:


32

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

  • Pode transmitir HD 1080p na LAN para qualquer dispositivo que suporte .m3u8playlists
  • Usa semântica HTML5 (mas não é um formato padronizado)
  • Algum suporte em software premium de terceiros como o jwplayer 6 pode ser usado

CONS

  • Tem um atraso de pelo menos 5 segundos (nesta aplicação, mas usando o espelhamento do iPhone para o AppleTv, eles atingem 50 ms - 500 ms de alguma forma). Portanto, não é bom para aplicações de controle remoto onde são necessárias reações instantâneas, como robôs ou helicópteros.
  • É necessário pagar por software de terceiros, se você quiser um suporte mais amplo ao navegador, que pode piscar.

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 use apt-get installpara FFmpeg

Isso 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.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • Instale o nginx (engine-x) - o nginx foi projetado especialmente para dispositivos embarcados e é o servidor da Web habilitado para PHP mais leve e mais rápido disponível no momento. (Sim, é melhor que o Apache volumoso )
  • Crie um diretório, por exemplo, viva na sua pasta www, /usr/share/nginx/www/

Crie um arquivo de script do Bash chamado algo como video.sh, aplique chmod +x-o e cole-o. Altere a pasta base para onde quer que esteja o servidor HTTP . Eu costumava nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

Crie um arquivo HTML que carregará a lista de reprodução

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

Apoio, suporte

  • iPhone, abre a página, mas cai no QuickTime . A qualidade é realmente incrível!
  • Windows Safari, transmite bem.
  • Macintosh ou Windows, QuickTime. Córregos bem.
  • Android 2.3.5 e não funcionou, mas era para ser suportado desde 2.1.x
  • Windows, Chrome - Nada
  • Windows, Internet Explorer 10 --- Nada (tipo de vídeo não suportado)
  • Windows, VLC media player - Nada

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


Com relação a acelerar a compilação do ffmpeg Para contornar a baixa capacidade computacional do RPI e os longos tempos de compilação do ffmpeg, tentei usar o Qemu com o Wheeze, mas encontrei algum obstáculo ao fazer login e tive que tentar com uma imagem do Arch . Isso funcionou. Também tentou Sqeeze em uma imagem do Ubuntu , através VirtualBo
luboP

2
Existe uma maneira de excluir automaticamente segmentos antigos? O cartão SD fica cheio após algum tempo. Eu também gostaria que eles fossem excluídos para que eu possa executar isso em um tmpfs e não estragar o cartão SD.
Dimme

2
@Dimmme Se você adicionar -segment_wrap 10como argumento ao ffmpeg, ele usará no máximo 10 arquivos de segmento.
gregers

Alguém conseguiu que isso funcionasse? Os arquivos são criados, mas parecem não ter informações de SPS / PPS, para que o vídeo não seja reproduzido no iOS Safari nem no VLC. O stream.m3u8 também não foi incluído segments/ao apontar para os arquivos de segmento, então larguei a pasta de segmentos. Eu entendi mal alguma coisa?
Gregers

você precisa canalizar o fluxo pelo binário do filtro PSIPS. A versão mais recente do raspicam deveria fazer isso .. mas por alguma razão eu não poderia fazê-lo funcionar sem PSIPS
Piotr Kula

23

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/confarquivo 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 :

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

Em seguida, no seu Raspberry Pi 2 instale este WebRTC (para um Raspberry Pi 1, leia o site vinculado para outras opções)

sudo apt-get install uv4l-webrtc

Reinicie todos os drivers e vá para

http://raspberry:8080/

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 mjpeg1080p, 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 motiondeve (ainda preciso testar e comparar) funcionar muito melhor agora. Certifique-se de definir a configuração para usar v4l2_palette 8ouv4l2_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=xxxxxxno 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 comando vlc 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 / implementado

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

Não suportado / implementado


Ainda não há video4linuxdriver disponível. Isso significa que não podemos usar o ffserver para transmitir dados usando /dev/video0ou comparados como uma webcam USB.

É por isso que é tão difícil encontrar a transmissão ao vivo adequada para navegadores HTML5.


Agora há video4linuxmotorista o motorista V4L2 bcm2835-v4l2 oficial eo motorista userspace V4L2 [ linux-projects.org/modules/sections/...
mpromonet

É um driver v4l real ou é apenas aquele invólucro em torno do raspivid que oferece um desempenho terrível?
Piotr Kula

11
O driver oficial usa a interface MMAL, consulte o código fonte [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . O desempenho parece correto.
Mpromonet 19/10/2014

Eu tenho jogado com isso por 3 dias agora. A codificação mjpeg é muito mais estável e pode exibir 800x600 a 10fps no iPhone, Android ou iSpy, de forma confiável. O h264 é ótimo a 1080p 30fps e podemos ver isso em vlc usando a --demux h264bandeira. 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.
Piotr Kula

Observe que adicionar: demux = 264 no método H264 é para o servidor vlc, não para o cliente vlc. Assim, a linha de comando para iniciar o streaming na framboesa para obter compatibilidade com vlc em smartphones é:/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
Jaime M.

10

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 raspistillser extremamente SLOOOW! O uso da função de lapso de tempo definida como 100 ms, que deve nos dar 10 fps, não funciona, porque raspistillapenas engasga e apresenta sérios problemas de desempenho.

  1. Mude /tmppara usar a RAM para /etc/default/tmpfsalterar a velocidade RAMTMP=yes(este é um esforço para aumentar os fps, mas o raspistill simplesmente não consegue se manter.)
  2. Reiniciar
  3. apt-get install git
  4. apt-get install libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get install imagemagick
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. OPCIONAL Se você tiver erros
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. Dentro do makefile, comente todos os plugins, exceto input_file e output_http, e faça novamente. Eu tive muitos problemas aqui.
  14. Copie o binário, mjpg_streamerseus plugins input_*.soe output_*.sopara /usr/local/bin. Caso contrário, execute-o diretamente no diretório src.
  15. Final opcional
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. 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)
  19. Vamos para http://<IP-address>:8080
  20. Aqui estão algumas opções: aproveite a transmissão ao vivo à moda antiga ... suportada pela maioria dos navegadores - modernos, antigos e experimentais.

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 ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

Eu também estava lendo e descobri que podemos usar %do 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 %do nome do arquivo. Por alguma razão, a gravação do arquivo JPEG é terrivelmente lenta a partir do raspistill. Suspiro.


obrigado por compartilhar o conhecimento
user566245 13/06

10

A partir de 2017 (ou talvez antes) raspividnã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:

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

Esse script faz multicamada do vídeo e pode ser visualizado em outra máquina na LAN com um comando como este:

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync extfaz 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 outros raspividmétodos.

(Dica: se você estiver conectado a um roteador ou switch que suporta IGMP, verifique se 224.0.0.0/4nã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:

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

Veja man strftimeo 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 ae Tdepois 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.


Legal - Obrigado por compartilhar isso. Você pode explicar por que o uso do multicast é necessário aqui? Pelo que aprendi é que o multicast raramente é usado - então eu queria saber o que isso traz para a tabela aqui? Ainda assim - o script parece ótimo e tenho certeza de que ajudará muitas pessoas. Obrigado +1
Piotr Kula

11
O multicast é opcional - você pode simplesmente substituir um endereço IP normal, se desejar - mas precisará alterar o comando a ser usado ffserverou 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 .
Malvineous

Obrigado por explicar - Mas o multicast só funciona em redes internas? Se um provedor de serviços de Internet obtém um pacote de difusão seletiva, eles geralmente apenas o retiram. Portanto, não é como se você pudesse transmitir para todos na Internet. Suponho que, se você possui uma rede interna grande, a transmissão múltipla de mulit também pode impactar sua rede? Mas sim .. só para eu ver um fluxo, eu usaria apenas um UDP para um IP selecionado .. mas, de qualquer maneira, gosto da opção de difusão seletiva: D Tentarei fazê-lo neste fim de semana só porque nunca fiz isso antes. :) Obrigado
Piotr Kula

11
Sim, o multicast é principalmente para redes internas. Ele deve funcionar melhor com o IPv6, mas acho que ainda precisará da cooperação do ISP. Eu o uso porque significa que não preciso executar um servidor no Pi e posso visualizar os fluxos de duas máquinas diferentes e gravá-lo em disco sem alterar a configuração do Pi ou sobrecarregar a largura de banda da rede do Pi. Se a sua rede interna for grande, você provavelmente estará usando switches compatíveis com IGMP, projetados para enviar apenas tráfego multicast onde for necessário, para que o impacto não seja diferente do normal.
Malvineous 22/03

11
Obrigado por explicar .. Agora posso ver muitos benefícios do uso de multicast com pequenas advertências que nem sequer afetam os usuários domésticos. Definitivamente vou tentar. Às vezes, são as coisas simples e óbvias que precisam ser apontadas para fazer sentido. E olhando para sua atualização .. o bit de gravação é realmente muito, muito legal!
Piotr Kula #

4

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 .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

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.


11
Você pode controlar a largura de banda e a resolução. Se a transmissão local da LAN para CCTV for usada, isso não será um problema. A transmissão pela Internet pode precisar estar sob demanda e / ou com uma resolução muito menor. Mas é outra maneira de fazê-lo. Obrigado +1
Piotr Kula

e como isso funciona? isso não acontecer para mim ... FFMPEG diz "RTMP_Connect0, falhou na tomada de conexão 111 (Conexão recusada)."
flash Trovão


2

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/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

Você pode alterar as opções do uv4l via /etc/uv4l/uv4l-raspicam.conf e reiniciar o serviço com

sudo service uv4l_raspicam restart

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:

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

e se ouviu com

sudo netstat -tulpn 

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?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

Mas o servidor ainda não foi iniciado automaticamente ...

man uv4l

então me mostrou a opção

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

então eu tentei:

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

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:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

Agora essa é uma dica clara! Parece não haver servidor ainda - então instale-o:

sudo apt-get install uv4l-server

e tente novamente:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

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.


1

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 .


Qual navegador você está usando? O Jitsi suporta apenas Chrome, Chromium, Opera e Firefox no fim das contas, dos quais apenas o Chromium está disponível no Pi. Mas o Chromium me deu um webkitRTCPeerConnection is not definederro. Eu normalmente uso o IceWeasel para WebRTC, mas isso não é suportado pelo Jitsi.
Modulitos 17/09/2015

11
no PI, não há navegador que suporte o WebRTC, exceto um suporte quase quebrado no IceWeasel. A maneira que eu estou usando é: Pi-> jitsi Server na nuvem -> meu PC em outros lugares
prinxis

11
O UV4L suporta transmissão ao vivo H264 codificada por hardware sem latência.
prinxis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.