Así que hoy obtuve la cámara Raspberry y las imágenes fijas funcionan bien.
Capture una imagen en formato JPEG:
raspistill -o image.jpg
Capture un video de 5 segundos en formato H.264 :
raspivid -o video.h264
No quiero instalar ninguna aplicación adicional, ya que quiero aprovechar HTML5 que está fácilmente disponible. Como Chrome / Safari tiene decodificadores integrados para H.264, solo quiero apuntar mi navegador a la URL y ver la transmisión.
¿Cómo puedo conseguir esto?
webcam
streaming-video
camera
Piotr Kula
fuente
fuente

Respuestas:
Streaming con HLS
Método patentado de Apple para transmitir video en vivo. Se llama HTTP Live Streaming (HLS) y solo es compatible con la tecnología de Apple. Google (Chromium / YouTube) usa su propia implementación llamada dash mpeg y todos los demás están confundidos o usan H.264 encapsulado en MP4 .
PROS
.m3u8listas de reproducciónCONTRAS
m3u8
.m3u8es simplemente una versión UTF-8 del formato M3U. (Los archivos .m3u pueden tener varias codificaciones). Algunas personas afirman que cambiar el nombre de un .m3u8 a .m3u funcionará como se espera en todos los navegadores HTML5. Intenté esto, y no funcionó para mí.El concepto detrás de esta transmisión es que segmentos cortos de archivos, de al menos 5 segundos de duración (en este ejemplo, es posible que haya nuevas formas disponibles para acelerarlo) se graban y guardan en un archivo adecuado. El archivo de la lista de reproducción se actualiza con el nuevo nombre de archivo y el cliente siempre sondea esta lista de reproducción y descarga el archivo más reciente. Hay algunas mecánicas involucradas para fusionar el video sin problemas en el cliente. Es por eso que otros desarrolladores no quieren implementar esto porque requiere mucho esfuerzo y no cumple con los estándares HTML5 (a pesar de que no hay un estándar HTML5 adecuado para las transmisiones en vivo ?? Ehh, suspiro ).
Instalando
Necesita compilar
ffmpeg, no lo useapt-get installpara FFmpegEsto puede tomar hasta 5 horas - Se tiene a ser la versión 1.1 o superior que soporta segmento de streaming. Puede usar esto para clonarlo y compilarlo.
/usr/share/nginx/www/Haga un archivo de script Bash llamado algo así
video.sh, aplíquelochmod +xy péguelo. Cambie la carpeta base a donde viva su servidor HTTP . Solíanginx,/usr/share/nginx/www/Crea un archivo HTML que cargará la lista de reproducción
Apoyo
Referencia: 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
fuente
-segment_wrap 10como argumento a ffmpeg, utilizará un máximo de 10 segmentos de archivos.segments/al apuntar a los archivos de segmento, por lo que solté la carpeta de segmentos. ¿Entendí mal algo?UV4L MMAL
Gracias por comentar desde @mpromonet para la actualización del controlador Linux-Projects V4L2 que ahora implementa MMAL de manera muy eficiente, pero aún es un trabajo en progreso.
Siga estas instrucciones para instalar el repositorio de proyecto de Linux e instalar el controlador UV4L con extras. Luego instale el servidor y mjpeg. Si lo desea, también puede experimentar con los demás.
Después de instalar todo, puede acceder al servidor HTTP en el puerto 8080. También debe verificar el
/etc/uv4l/confarchivo y configurarlo si desea mjpeg o H.264, ya que marca la diferencia, pero puede ajustar algunas configuraciones a través de la web incorporada servidor.HTML 5
Esto es lo que todos estábamos esperando (llamado WebRTC ) y gracias al nuevo controlador funciona muy bien (en una Raspberry Pi 2).
Primero, siga estos pasos, http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :
Luego, en su Raspberry Pi 2 instale esto el WebRTC (para un Raspberry Pi 1, lea el sitio vinculado para otras opciones)
Reinicie todos los controladores y vaya a
Ahora tiene transmisión de video de baja latencia y alta calidad directamente en un navegador moderno como Chrome o Firefox. (Tal vez Safari, pero no puedo comprobarlo porque ya no hacen Winblows e Internet Explorer ... eh)
MJPEG
Por defecto, se usa
mjpega 1080p, y es muy lento. Lo ajusté a 800x600 cuadros de tamaño y usando algo como iSpy para procesar video. Por seguridad, obtengo unos 10 fps en un video nítido. Es mucho mejor que los 3 fps a 640x480 antes de este controlador. Funciona en iPhone con Safari, Android Chrome y casi todo lo demás.http://raspberrypi:8080/stream/video.mjpegEsto también significa que
motiondebería (todavía necesito probar y comparar) funcionar mucho mejor ahora. Asegúrese de establecer la configuración para usarv4l2_palette 8ov4l2_palette 2H.264
Esto ahora se ha solucionado para la "transmisión", y no tenemos que hacer grandes esfuerzos para ver el video H.264 a través del reproductor multimedia VLC . El flujo es aún RAW H.264, por lo que debe demuxux o transcodificar / encapsular si necesita que funcione en otro lugar. Debe ajustar el
bitrate=xxxxxxarchivo de configuración si está transmitiendo a través de Wi-Fi.En el reproductor multimedia VLC, debe decirle que desea utilizar el demuxer H.264. Entonces, si está utilizando la GUI, asegúrese de agregar el argumento
:demux=264. Desde la línea de comandos,vlc http.../video.h264 --demux h264. De lo contrario, solo verá una pantalla en blanco aunque el LED de la cámara esté encendido.http://raspberrypi:8080/stream/video.h264Voila! Transmisión en HD con aproximadamente 500 ms de retraso (con ajustes, hasta 200 ms). Definitivamente es mucho más fácil que usar los viejos métodos. La calidad y el FPS son excelentes, pero no puede incrustar esto en HTML5 sin transcodificar a MP4 o WebM . Espero que esto se implemente, ya que realmente hará de este un gran servidor independiente.
RTSP / RTMP / RTP
No compatible / implementadohttp://www.linux-projects.org/uv4l/tutorials/rtsp-server/
HLS
No compatible / implementado
No hay ningúnvideo4linuxcontrolador disponible todavía. Esto significa que no podemos usar ffserver para transmitir datos usando/dev/video0o simlar como una cámara web USB.Es por eso que es tan difícil encontrar la transmisión en vivo adecuada para los navegadores HTML5.
Gstreamer(no HTML5)<OBJECT ...:) (demorado)fuente
video4linuxcontrolador, el controlador V4L2 oficial bcm2835-v4l2 y el controlador V4L2 del espacio de usuario [ linux-projects.org/modules/sections/…--demux h264bandera. Todavía necesitamos transcodificar esto para usarlo en dispositivos móviles o incrustarlo como mp4 / webm en páginas web. Pero es realmente genial avanzar de manera eficiente y de calidad. No confunda con el "otro" controlador UV4L que no es un proyecto de Linux que es basura./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=264Streaming con MJPEG
U4VL
Una interfaz de kernel con una compilación en el servidor HTTP (S).
http://www.linux-projects.org/uv4l/tutorials/streaming-server/
Interfaz web Raspberry Pi Cam
Un buen proyecto de silvanmelchior que implementa un servidor web, como dvr, servidor de transmisión de múltiples destinos . Necesita más información
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
Método heredado
La transmisión con mjpg es compatible con casi todos los navegadores, incluido Internet Explorer 6. Muchas cámaras usadas antes de H.264 usaban hardware mjpg, que esencialmente descargaba archivos JPEG lo más rápido posible en una carpeta mientras que mjpg leía el archivo en un búfer y lo eliminaba ellos. Algunos dispositivos pueden alcanzar hasta 25 fps e incluso si tuviera una mala conexión, obtendría al menos 1 fps.
El soporte para mjpg se eliminó en las cámaras HD porque el archivo JPEG se hizo demasiado grande para transmitir por Internet y H.264 es un protocolo mucho más rápido y de mejor calidad.
Dado que no tenemos forma de transmitir H.264 usando el módulo de la cámara de forma nativa, esto parece ser una alternativa viable ...
Es casi instantáneo, pero no espere obtener más de 1.5 fps. ¡Esto se reduce a
raspistillser MUY LENTO! El uso de la función de lapso de tiempo establecido en 100 ms, que debería darnos 10 fps, no funciona porqueraspistillsimplemente se ahoga y tiene serios problemas de rendimiento dentro de sí mismo./tmppara usar RAM para la velocidad/etc/default/tmpfs: cambioRAMTMP=yes(Este es un esfuerzo para aumentar los fps, pero raspistill simplemente no puede mantenerse por sí mismo)./usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.gitmake USE_LIBV4L2=true clean allsudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.hsudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.hmjpg_streamery sus complementosinput_*.soyoutput_*.sopara/usr/local/bin. De lo contrario, ejecútelo directamente desde el directorio src.mkdir /tmp/streamraspistill -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"(ejecute esto donde están los binarios y los complementos)http://<IP-address>:8080Luché por compilarlo durante aproximadamente 5 horas ... suspiro , pero creo que lo usaré ya que puedo acceder a la transmisión desde cualquier teléfono y cualquier navegador. Solo tengo que esperar hasta que tengamos mejores conductores ... Otro año o dos. :(
No importa qué calidad pruebo, no obtengo ni más rápido ni más lento que 1 fps usando la transmisión. Utilicé 720p y 1080p y solo la calidad de imagen mejora, pero fps no es una diferencia en LAN. Supongo que configuraciones más pequeñas ayudarán con WAN / 3G u otras transmisiones de radio.
raspistill escribe la imagen en un solo archivo. Esto podría ser un cuello de botella. Escribe el archivo, mjpg strreamer lo lee y lo elimina causando un bloqueo de E / S, por lo que raspistill no puede escribir en el archivo.
Lo único que se me ocurre es usar raspivid canalizado en FFmpeg que creará archivos JPEG para nosotros. Necesito probar esto y posiblemente sea mucho más rápido que usar raspistill. Logré obtener 25 fps con una calidad impactante, y se retrasó unos 10 segundos ... Ajustar la configuración me dio unos 3 fps, pero 100% de CPU. No se está utilizando hardware para procesar la transmisión de video ...
También estaba leyendo y descubrí que podemos usar
%del nombre del archivo de salida de raspistill. Me pregunto si eso aumentará los fps. Además, la codificación JPG es acelerada por hardware en raspistill, por lo que me cuesta mucho entender por qué es tan lenta ...Obtuve un asombroso 2 FPS usando
%del nombre del archivo. Por alguna razón, escribir el archivo JPEG es terriblemente lento desde raspistill. Suspiro.fuente
A partir de 2017 (o tal vez antes)
raspividya no es el método preferido, ya que los desarrolladores de Pi recomiendan que las personas usen V4L2.Entonces, este método le permite transmitir H264 a través de RTP usando V4L2 en lugar de
raspivid. Noté que este método produce menos abandonos y permite una tasa de bits más alta:Esta secuencia de comandos multicast el video, y se puede ver en otra máquina en la LAN con un comando como este:
-sync exthace que el video se reproduzca lo más rápido posible, por lo que se ejecutará en tiempo real, en lugar de ejecutarse a una velocidad de fotogramas fija y retrasarse si el Pi captura fotogramas más rápido que esto. Todavía hay algún retraso con este método, pero no peor que los otrosraspividmétodos.(Sugerencia: si está enchufado a un enrutador o conmutador que admite IGMP, asegúrese de
224.0.0.0/4que no tenga firewall en su máquina, de lo contrario, cuando el enrutador le pregunte a su PC si desea algún tráfico de multidifusión, la PC nunca responderá y nunca verá ningún vídeo.)Grabando en disco
Como mencioné la grabación en los comentarios a continuación, ampliaré eso aquí. Puede usar un comando como este para grabar la transmisión de red al disco:
Busque
man strftimelos significados de los%símbolos en el nombre del archivo. Los de este ejemplo usan el número de día (0 = domingo, 1 = lunes, etc.) seguido de ayTluego la hora. Comienza un nuevo archivo cada 15 minutos.Para ser claros, este comando de grabación está destinado a ejecutarse en una PC remota (no en el Pi), aunque probablemente también funcione en el Pi (no probado).
Como obtiene un archivo nuevo cada 15 minutos con el día y la hora en el nombre del archivo, significa que después de una semana comenzará a generar nombres de archivos que ya se han utilizado, lo que hará que se sobrescriban los archivos más antiguos. En otras palabras, terminará con un ciclo continuo del material de archivo de la semana anterior. Esto es ideal para una cámara de seguridad donde rara vez necesitará regresar más de una semana.
Como nota al margen, esto produce aproximadamente 500 GB de archivos, por lo que es posible que desee ajustar la tasa de bits, la resolución o sobrescribir los archivos antes (por ejemplo, cada 24 horas) si no desea que ocupen tanto espacio.
fuente
ffservero algún otro sistema de servidor si desea que más de una máquina muestre la fuente. Luego, después de unos 2-3 clientes (dependiendo de la tasa de bits de video), el adaptador USB Ethernet de Pi se quedará sin ancho de banda. Con la multidifusión no hay necesidad de ejecutar un servidor (las máquinas cliente solo eligen escuchar el tráfico o ignorarlo) para que pueda tener miles de máquinas mostrando el video sin impacto en el Pi, que solo envía una transmisión de video .Logré transmitir desde mi Raspberry Pi a un servidor web con el módulo compilado nginx-rtmp .
Para ahorrar molestias
ffmpeg, recomiendo una distribución continua como Arch Linux Arm .Algunas notas:
Entonces, sobre esta base, creo que la transmisión en vivo desde una Raspberry Pi podría estar bien para una transmisión temporal, pero no para una cámara web siempre encendida, ya que requiere demasiado ancho de banda. No obtendrá audio y si lo hace, será una misión sincronizar.
Puede grabar audio de manera más eficiente por separado al mismo tiempo que graba video. Luego, tal vez envíe la transmisión de audio más tarde y la convierta a WebM y la coloque en su httpd como un archivo estático con una etiqueta de video HTML. El flujo de trabajo es bastante incómodo, aunque es lo mejor que se me ocurre para una transmisión eficiente que funcione sin problemas en todos los navegadores.
fuente
UV4L ahora admite transmisión de audio y video en vivo con WebRTC y HTML5.
fuente
La respuesta de Piotr Kula parece estar en el camino correcto, pero no está actualizada para Raspberry.
Hay instrucciones actualizadas para uv4l en Raspberry stretch en
https://www.linux-projects.org/uv4l/installation/
Puede modificar las opciones de uv4l a través de /etc/uv4l/uv4l-raspicam.conf y luego reiniciar el servicio con
En mi caso, las cosas no funcionaron de la caja (si olvidó instalar el servidor uv4l ...). Los siguientes comentarios pueden ayudarlo a depurar problemas similares.
Verifiqué que el servidor se está ejecutando con:
y si escuchó con
pero no había entrada para uv4l en la lista. Esperaba uno para el puerto 8080
Así que probé el comando de ¿Cómo configurar UV4L?
Pero aún así el servidor no se inició automáticamente ...
luego me mostró la opción
entonces intenté:
pero aún no hay ningún servidor ejecutándose en el puerto 8080 o en otro lugar. Así que parece que olvidé la opción "--foreground" que la página del manual dice que es necesaria:
Ahora que es una pista clara! Parece que todavía no hay servidor, así que instálelo:
e intenta de nuevo:
El servidor ahora está disponible en http: // pi: 8080 (reemplace pi con la IP o el nombre de host de su servidor)
Después de un reinicio funcionó sin ingresar otro comando.
fuente
UV4L ahora admite la transmisión de audio y video en vivo a Jitsi Meet Rooms a través de la Web. No se requiere una configuración especial. Es tan fácil como escribir su nombre, sala y hacer clic en Iniciar .
fuente
webkitRTCPeerConnection is not definederror. Normalmente uso IceWeasel para WebRTC, pero eso no es compatible con Jitsi.