Grabando Vídeo 3D

DIY. Hazlo tu mismo 12 de jul. de 2026

Uno de mis portatiles Latitude E6430s que compré de segundo mano, tras 14 años ha finalizado su ciclo de vida y ha pasado por mi zona de extracción par reciclar parte de sus piezas.

Al abrir el "baul de los tesoros informáticos" para guardar las piezas, y reciclar otras, me he encontrado dos webcams identicas LifeCam VX-800 de la marca Microsoft.

Curiosamente funciona mejor el hardware de Microsoft que su software...

Y he empezado a pensar en que uso podría dar a esas dos cámaras, y se me ha ocurrido usarlas para crear Vídeo 3D con ellas.

Así que mientras me entretengo con ellas, voy a documentar todo el proceso y os lo dejo en un artículo.


Grabación de vídeo estereoscópico (3D) con webcams USB en Debian

1. Planteamiento del problema

Dispongo de 2 webcams USB idénticas.

Para que funcione correctamente el modo estereoscópico tengo que montarlas con una separación entre ellas de aproximadamene uno 6-7 cm para que la óptica coincida con la distancia interocular.

Objetivo:

  • Capturar vídeo estereoscópico (3D)
  • Generar salida en formatos como:
    • Side-by-Side (SBS)
    • Top-Bottom
    • Anaglifo (Para ver con gafas de 2 colores: rojo-cian)

2. Arquitectura general

El problema lo he dividido en tres partes: Captura, Sincronización y la Generación en 3D.

2.1 Captura

  • Dispositivos Linux: /dev/video0, /dev/video1, ... /dev/videoN
  • Interfaz estándar: V4L2
Embedded Camera Firmware & V4L2 Driver Experts | Silicon Signals
Silicon Signals delivers custom camera solutions with V4L2, Linux camera integration, and embedded camera firmware for reliable video pipelines.

Para disponer de las utilidades V4L2 hay que instalar el conjunto de herramientas mediante el comando:

sudo apt install v4l-utils

2.2 Sincronización

  • No existe sincronización hardware en webcams USB
  • Desfase típico: 10–50 ms
GitHub - mprib/multiwebcam: concurrent frame capture with USB webcams
concurrent frame capture with USB webcams. Contribute to mprib/multiwebcam development by creating an account on GitHub.

2.3 Generación 3D

  • Composición de streams:
    • Side-by-side
    • Over-under
    • Frame-packed

3. Estrategias de captura

3.1 Opción A — Captura independiente + postproceso (recomendada)

Ventajas:

  • Máxima robustez
  • Permite ajustar desfase
  • Mejor calidad final

Flujo:

[Cam 1] ──► left.mp4
[Cam 2] ──► right.mp4
                 │
                 ▼
         Postprocesado 3D

3.2 Opción B — Pipeline en tiempo real

Ventajas:

  • Menor latencia
  • Ideal para streaming o pruebas

Inconvenientes:

  • Más sensible a desincronización
  • Mayor complejidad

4. Captura con FFmpeg (recomendable)

FFmpeg soporta V4L2 directamente.

https://trac.ffmpeg.org/wiki/Capture/Webcam

En mi caso es la opción que voy a usar, creo que es la me permite más opciones y personalización a nivel de scripts.

4.1 Identificación de dispositivos

Conecto las dos webcam a un Hub de teclado, veo que se encienden los pilotos de las webcam, compruebo ademas con el comando lsusbque el sistema las identifica:

$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 05ac:1006 Apple, Inc. Hub in Aluminum Keyboard
Bus 001 Device 003: ID 30fa:0300  USB OPTICAL MOUSE 
Bus 001 Device 004: ID 05ac:0250 Apple, Inc. Aluminium Keyboard (ISO)
Bus 001 Device 005: ID 05ac:8511 Apple, Inc. FaceTime HD Camera (Built-in)
Bus 001 Device 006: ID 05ac:8294 Apple, Inc. Bluetooth USB Host Controller
Bus 001 Device 012: ID 045e:0766 Microsoft Corp. LifeCam VX-800
Bus 001 Device 013: ID 045e:0766 Microsoft Corp. LifeCam VX-800
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
v4l2-ctl --list-devices

En mi caso tengo la webcam (FaceTime HD Camera) que viene por defecto en el equipo (un iMac con Debian 13) y las otras dos 2 camaras que acabo de conectar.

Para ver si puedo usarlas con V4L2, lo compruebo con el comando v4l2-ctl –list-devices obtengo lo siguiente:

$ v4l2-ctl --list-devices
FaceTime HD Camera (Built-in):  (usb-0000:00:14.0-5):
	/dev/video0
	/dev/video1
	/dev/media0

Esta salida indica que algo no funciona. Aunque las 2 nuevas camaras conectadas reciben alimentación (se ha encendido el piloto verde), no se pueden gestionar ya que en donde las he conectado (Hub USB del teclado) no reciben toda la alimentación necesaria.

Las desconecto y pincho directamente en las conexiones USB del equipo y vuelvo a comprobar:

$ v4l2-ctl --list-devices
Microsoft LifeCam VX-800: Micro (usb-0000:00:14.0-10):
	/dev/video4
	/dev/video5
	/dev/media2

Microsoft LifeCam VX-800: Micro (usb-0000:00:14.0-3):
	/dev/video2
	/dev/video3
	/dev/media1

FaceTime HD Camera (Built-in):  (usb-0000:00:14.0-5):
	/dev/video0
	/dev/video1
	/dev/media0

Ahora sí, todo correcto, ya puedo gestinar las webcam con V4L2.

4.2 Captura de ambas cámaras

Coloco una camara al lado de otra y compruebo que puedo grabar imagenes de cada una de ellas.
Y aprovecho para averiguar cual hará de "ojo izquierdo" y cual de "ojo derecho".

ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video2 grabacion1.mp4 
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video4 grabacion2.mp4 

Identificadas correctamente cual es la camara derecha y izquierda, mientras grabo hago lo siguiente:

Acerco un dedo lo máximo posible al objetivo de la camara que he supuesto es la camara izquierda y luego cuando vea el vídeo la puedo identificar.
En mi caso /dev/video2 es la camara izquierda y /dev/video4 es la cámara derecha.

Este patrón (LEFT/RIGHT independientes) es el habitual para grabar en estereoscopía, cada camara hace la función de un ojo (izquiero y derecho)

Prepara un script para poder grabar simultaneamente con las dos camaras (una vez identificadas):

#!/bin/bash
echo "Iniciando grabación estereoscópica (archivos separados)..."

# Cámara Izquierda (/dev/video2)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video2 left.mp4 </dev/null >left.log 2>&1 &

# Cámara Derecha (/dev/video4)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video4 right.mp4 </dev/null >right.log 2>&1 &

echo "Grabando... Para detener ambas grabaciones ejecuta: killall ffmpeg"
NOTA: Al final las he identificado al reves, ya que no me he dado cuenta de la grabación invetida que realiza la webcam... luego veremos más adelante como lo he descubierto y corregido.

Para información sobre grabación independiente Izda/Dcha en estereoscopía, lee el siguiente artículo:

project:stereoscopy [Radiona Wiki]

4.3 Recomendaciones de captura

  • Usar MJPEG si la cámara lo permite
  • Evitar autoexposición dinámica
  • Mantener FPS constantes

5. Generación de vídeo 3D con FFmpeg

5.1 Side-by-Side (horizontal)

ffmpeg -i left.mp4 -i right.mp4 \
-filter_complex hstack output_sbs.mp4

5.2 Top-Bottom (vertical)

ffmpeg -i left.mp4 -i right.mp4 \
-filter_complex vstack output_tb.mp4

5.3 Vídeo 3D directo usando el filtro stereo3d

FFmpeg dispone del filtro stereo3d 

ffmpeg with webcam input and stereoscopic output
I’d like to take video fed from my webcam, and output it (live) as stereoscopic video using ffmpeg. I’m testing in Windows, but eventually I intend to use Linux. Here’s what I’ve crafted so far…

Ejemplo de como hay que usarlo:

ffmpeg -i input -vf stereo3d=... output.mp4

Para realizar la grabación en modo Anaglifo vamos crear un nuevo script que lo haga de forma sencilla:

#!/bin/bash
echo "Iniciando grabación 3D Anaglifo (Rojo/Cian)..."

# Usamos la sintaxis correcta: in=sbs2l (entradas separadas I/D) y out=arbg (anaglifo rojo/cian)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video2 \
       -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video4 \
       -filter_complex "[0:v][1:v]hstack=inputs=2[sbs];[sbs]stereo3d=in=sbs2l:out=arbg[v]" \
       -map "[v]" video_3d_anaglifo.mp4 </dev/null &

echo "Grabando en video_3d_anaglifo.mp4..."
echo "Para detener la grabación ejecuta: killall ffmpeg"
Nota: Al realizar la grabación de esta forma he detectado curiosamente un delay entre una webcam y otra cuando no debería de existir ninguno...

Hay veces que aunque la grabación e correcta de este modo, el MP4 final generado tiene algun problemas en la generación final y no siempre es reproducible, supongo que se debe al realizar el killall alguna escritura no genera alguno de los ultimos frames y no queda en un estado correcto.

6. Pipeline en tiempo real con GStreamer

6.1 Captura

Otras formas de captura que he evaluado es mediante el uso del plugin: v4l2src , podeis ver la información en la siguiente URL:

v4l2src

Capture video from v4l2 devices, like webcams and tv cards

6.2 Mezcla estereoscópica

Otras formas para la grabación estereoscópica es mediante el plugin: glstereomix que podeis ver en:

glstereomix

Combine 2 input streams to produce a stereoscopic output stream

6.3 Ejemplo de pipeline para la captura y mezcla

gst-launch-1.0 \
v4l2src device=/dev/video0 ! queue ! mix. \
v4l2src device=/dev/video1 ! queue ! mix. \
glstereomix name=mix ! \
video/x-raw,multiview-mode=side-by-side ! \
x264enc ! mp4mux ! filesink location=output.mp4

7. Uso de OBS Studio

7.1 Capacidades

  • Captura múltiples webcams
  • Mezcla en tiempo real
  • Escenas configurables
Open Broadcaster Software | OBS
OBS (Open Broadcaster Software) is free and open source software for video recording and live streaming. Stream to Twitch, YouTube and many other providers or record your own videos with high quality H264 / AAC encoding.

Necesitas un conocimiento mínimo de las escenas y del uso de OBS

7.2 OBS con Enfoque 3D

Existen plugins para OBS y poder crear videos en formato 3D

  • Añadir dos fuentes de vídeo
  • Alinearlas manualmente
  • Plugins adicionales:
    • shaders 3D
    • anaglifo
GitHub - apertus-open-source-cinema/stereo-3d-view: OBS plugins for stereo 3d related workflows
OBS plugins for stereo 3d related workflows. Contribute to apertus-open-source-cinema/stereo-3d-view development by creating an account on GitHub.

plugin anaglifo para OBS

8. Herramientas adicionales

8.1 Webcamoid

  • Suite completa de cámara
  • Uso: pruebas / prototipado
GitHub - webcamoid/webcamoid: Webcamoid is a full featured and multiplatform camera suite.
Webcamoid is a full featured and multiplatform camera suite. - webcamoid/webcamoid

8.2 OpenS3D

Este software está orientado al análisis y corrección estereoscópica

Funciones:

  • Medición de disparidad
  • Corrección de alineación
  • Visualización 3D
GitHub - hugbed/OpenS3D: Open Source Stereoscopic 3D Production Assistance Tools
Open Source Stereoscopic 3D Production Assistance Tools - hugbed/OpenS3D

9. Problemas a solventar

En la grabación nos vamos a encontrar con varios problemas: sincronización, ancho de banda del USB y calibración de la grabación.

9.1 Sincronización

Limitación:

  • No hay genlock en USB webcams

Soluciones:

  • Sincronización visual (flash / clap)
  • Ajuste en postproceso
  • Registro de timestamps

9.2 Ancho de banda USB

Problema:

  • Saturación en USB2

Mitigación:

  • USB3
  • Compresión MJPEG

9.3 Calibración

Necesario para 3D real:

  • Corrección de:
    • rotación
    • traslación
    • distorsión óptica

Herramienta recomendada:

  • OpenCV (stereo calibration)
GitHub - TemugeB/python_stereo_camera_calibrate: Stereo camera calibration with python and openCV
Stereo camera calibration with python and openCV. Contribute to TemugeB/python_stereo_camera_calibrate development by creating an account on GitHub.

Stereo camera calibration with python and openCV

10. Fallos Cometidos en la Grabación y Creación 3D

Fallo 1: Grabación directa a 3D

Problema: El plugin de ffmpeg consume recursos durante el procesamiento de la captura de ambos videos y puede generar delays (retrasos) entre una webcam y otra. Tambien se genera a veces un vídeo resultante con errores de procesamiento en los frames (por abortado prematuro por el killall supongo).

Solución: Grabar con ffmpeg en modo normal el vídeo separado de cada una de las webcam.

Por ejemplo usando el script grabacion_doble-webcam.sh:

#!/bin/bash
# Grabar video simultaneo de dos webcam
# Versión 1.7

echo "Iniciando grabación estereoscópica (archivos separados)..."

# Cámara Izquierda (/dev/video2)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video2 left.mp4 </dev/null >left.log 2>&1 &

# Cámara Derecha (/dev/video4)
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video4 right.mp4 </dev/null >right.log 2>&1 &

echo "Grabando... Para detener ambas grabaciones ejecuta: killall ffmpeg"

grabacion_doble-webcam.sh

Fallo 2: Confundir Camara Izquierda y Derecha

Tenemos nuestro script de crear el video 3D anaglifo:

#!/bin/bash
# Crear video Anaglifo para gafas Rojo/Cian
# Version 1.0

ffmpeg -i left.mp4 -i right.mp4 \
  -filter_complex "[0:v][1:v]hstack=inputs=2[sbs];[sbs]stereo3d=in=sbs2l:out=arbg[v]" \
  -map "[v]" -c:v libx264 -crf 18  -y Anaglifo-3D.mp4 

Problema: Al procesar el video 3D (anaglifo) uniendo el video de la cámara izquierda y derecha, el vídeo aunque parece que tiene profundidad se ve raro.

Solución: Cambiar el orden de entrada de los vídeos. Revisar el resultado 3D del vídeo procesado. En mi caso tengo que cambiarlo para que quede así:

#!/bin/bash
# Crear video Anaglifo para gafas Rojo/Cian
# Version 1.2
# Corrección orden de camara Izquierda y Derecha

ffmpeg -i right.mp4 -i left.mp4  \
  -filter_complex "[0:v][1:v]hstack=inputs=2[sbs];[sbs]stereo3d=in=sbs2l:out=arbg[v]"  \
  -map "[v]" -c:v libx264 -crf 18 -y Anaglifo-3D.mp4 

Fallo 3: Delay entre los vídeos

Problema: Al ver el resultado se nota un delay entre la imagen roja/cian. Se debe a que los vídeos originales empezó unas décimas de segundo antes

Solución: Se puedes usar el parámetro -itsoffset para retrasar una de las dos pistas hasta que queden perfectamente sincronizadas.

  • Si la cámara DERECHA (right.mp4) va adelantada (por ejemplo, 0.2 segundos antes que la izquierda), usaremmos el siguiente comando para retrasarla:
ffmpeg -i left.mp4 \
       -itsoffset 0.2 -i right.mp4 \
       -filter_complex "[0:v][1:v]hstack=inputs=2[sbs];[sbs]stereo3d=in=sbs2l:out=arbg[v]" \
       -map "[v]" -c:v libx264 -crf 18 resultado_sincronizado.mp4
  • Si la cámara IZQUIERDA (left.mp4) es la que va adelantada, ponemos el -itsoffset 0.2 justo antes del -i left.mp4.
Truco "de cine" para calcular el delay exacto: Abrimos ambos archivos (left.mp4 y right.mp4) en un reproductor como VLC. Buscamos un evento instantáneo que haremos siempre en la grabación (una claqueta, un aplauso, un parpadeo, el flash de un móvil) y apuntamos el milisegundo exacto en el que ocurre en cada vídeo.
La diferencia entre ambos tiempos será el valor que tenemos que poner en -itsoffset.

Fallo 4: Alineación de la Cámara

Problema: En el video 3D final se ve que hay mucha diferencia entre las imágenes Roja/Cian

Solución: Usar una regla o listón para alinear las cámara. Respetar la distancia de los ojos humanos entre cada objetivo de la cámaras.

Fallo 4: Nivelación (Convergencia vertical)

Problema: Hay una pequeña "aberración" en el resultado 3D final, si se revisa en algun frame clave del video se puede ver algun objeto desplazado verticalmente unos milímetros en su color rojo/cian.

En mi caso me he fijado en la montura de mis gafas y que veo la silueta roja está ligeramente más alta que la silueta azul. En el mundo real, nuestros ojos están desalineados horizontalmente, pero jamás verticalmente.

Solución hardware: Usar una regla o liston que permita ajustar exactamente inclinación y paralelismo de ambas cámaras.

Solución software: Vamos a aplicar un filtro para desplazar la cámara derecha unos pocos píxeles hacia arriba (o hacia abajo) y, de paso, recortaremos un poco el exceso de separación horizontal. Tenemos que tener en cuenta que en el "movimiento" ambos videos tienen que tener el mismo tamaño, el comando que he usado es:

ffmpeg -i left.mp4 -i right.mp4 -filter_complex \
"[0:v]fps=30[v1]; \
 [1:v]fps=30,crop=iw:ih-6:0:6,pad=iw:480:0:0:black[v2]; \
 [v1][v2]hstack=inputs=2[sbs]; \
 [sbs]stereo3d=in=sbs2l:out=arbg[v]" \
 -map "[v]" -c:v libx264 -crf 18 Anaglifo3D_Alineado.mp4

Solución hardware: Para no tener que estar ajustando en "post-producción" el vídeo, podemos desde nuestro Debian, testear la alineación física en vivo, para ello instalar una herramienta con la que podemos realizar el ajuste y alineación en tiempo real:

sudo apt -y install qv4l2

Ahora abrimos 2 consolas y en ella iniciaremos cada una de nuestras webcam y ejecutamos:
qv4l2 -d /dev/video2 y qv4l2 -d /dev/video4.
Ponemos las dos ventanas juntas en tu escritorio, nos fijaremos en algun objeto con líneas rectas, por ejemplo una caja. Colocaremos justo enfrente ese objeto y ajustamos físicamente las cámaras hasta que veas que las líneas horizontales coinciden exactamente en la misma cuadrícula de tu pantalla.

En mi caso he usado mis gafas como referencia al borde superior que captura la webcam para ir ajustando ambas camaras.

Alineación vertical de ambas cámaras

Una vez fijadas ahí, podemos usar los scripts sin tener que realizar poseriormente ninguna alineación


11. Arquitectura por la que optado

Pasos mínimos reproducibles

1. Captura con FFmpeg (left/right)
2. Ajuste de sincronización y alineación de la cámara.
3. Generación 3D con FFmpeg (Anaglifo)

Software recomendado

  • Software Base:
    • FFmpeg (Grabación y Procesado 3D)
    • v4l2-utils (Captura y gestión de WebCams)
    • qv4l2 (Alineación del hardware: WebCams)

Hardware recomendado

  • 2 Webcam Idénticas
  • Gafas 3D para visionado
2 Webcam identicas y Gafas 3D (anaglifas)

En mi caso recordaba que tenía guardadas unas gafas 3D "Rojo-Cian" y ha sido lo que he utilizado para la comprobación de las grabaciones.

13. Resumen del estudio

  • Es viable con hardware básico
  • La clave no es el software sino:
    • sincronización
    • calibración
    • alineamiento de las cámaras
  • El flujo más estable es:
    • capturar separado + procesar después

Os dejo un vídeo de tan sólo 15 segundos, se ha generado mediante post-procesado uniendo los vídeos capturados de la cámara izquierda y la cámara derecha

Para ver el vídeo correctamente hay que usar unas gafas anaglifas de color rojo-cian, en las que el color rojo va sobre el ojo derecho:

0:00
/0:06

Tareas Pendientes a Realizar

  1. Preparar un soporte físico para dejar fijas ambas webcam para estabilidad y alineamiento milimétrico.
  2. Pruebas con otros formatos de salida (CardBoard, Gafas polarizadas y/o Gafas VR)

Nos vemos en el siguiente artículo

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux