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
.m3u8
listas de reproducciónCONTRAS
m3u8
.m3u8
es 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 install
para 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 +x
y 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 10
como 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/conf
archivo 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
mjpeg
a 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.mjpeg
Esto también significa que
motion
debería (todavía necesito probar y comparar) funcionar mucho mejor ahora. Asegúrese de establecer la configuración para usarv4l2_palette 8
ov4l2_palette 2
H.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=xxxxxx
archivo 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.h264
Voila! 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únvideo4linux
controlador disponible todavía. Esto significa que no podemos usar ffserver para transmitir datos usando/dev/video0
o 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
video4linux
controlador, el controlador V4L2 oficial bcm2835-v4l2 y el controlador V4L2 del espacio de usuario [ linux-projects.org/modules/sections/…--demux h264
bandera. 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=264
Streaming 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
raspistill
ser MUY LENTO! El uso de la función de lapso de tiempo establecido en 100 ms, que debería darnos 10 fps, no funciona porqueraspistill
simplemente se ahoga y tiene serios problemas de rendimiento dentro de sí mismo./tmp
para 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.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
y sus complementosinput_*.so
youtput_*.so
para/usr/local/bin
. De lo contrario, ejecútelo directamente desde el directorio 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"
(ejecute esto donde están los binarios y los complementos)http://<IP-address>:8080
Luché 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
%d
el 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
%d
el 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)
raspivid
ya 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 ext
hace 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 otrosraspivid
métodos.(Sugerencia: si está enchufado a un enrutador o conmutador que admite IGMP, asegúrese de
224.0.0.0/4
que 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 strftime
los 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 ayT
luego 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
ffserver
o 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 defined
error. Normalmente uso IceWeasel para WebRTC, pero eso no es compatible con Jitsi.