lunes, 5 de julio de 2021

DVB a PC con FFmpeg

DVB (Digital Video Broadcasting) engloba varios estándares para televisión terrestre (DVB-T), satelital (DVB-S) o por cable (DVB-C). DVB-T es el usado para la TDT (Televisión Digital Terrestre). Utilizando un receptor de estos sistemas conectado al ordenador podremos ver y grabar la emisión de los canales. Yo tengo un receptor AVerMedia AVerTV DVB-T y voy a explicar en este artículo como configurarlo en Debian para ver y grabar un canal con FFmpeg.

Por la parte de atrás tiene un conector USB para conectar al ordenador y un conector Belling Lee hembra para conectar el cable de la antena.



Al conectar el receptor al ordenador se puede ver con el comando dmesg que el aparato es detectado por el sistema operativo pero falla la inicialización porque falta el firmware.

# dmesg

[ 3933.736356] usb 3-4: new high-speed USB device number 3 using ehci-pci
[ 3933.893171] usb 3-4: New USB device found, idVendor=07ca, idProduct=a800, bcdDevice= 0.01
[ 3933.893201] usb 3-4: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 3934.028124] dvb-usb: found a 'AVerMedia AverTV DVB-T USB 2.0 (A800)' in cold state, will try to load a firmware
[ 3934.028217] usb 3-4: firmware: failed to load dvb-usb-avertv-a800-02.fw (-2)
[ 3934.028224] firmware_class: See https://wiki.debian.org/Firmware for information about missing firmware
[ 3934.028230] usb 3-4: Direct firmware load for dvb-usb-avertv-a800-02.fw failed with error -2
[ 3934.028254] dvb_usb_a800: probe of 3-4:1.0 failed with error -2
[ 3934.028343] usbcore: registered new interface driver dvb_usb_a800

Es necesario descarga este firmware desde la web del fabricante u otro sitio de internet y copiarlo al directorio /lib/firmware.

# cp dvb-usb-avertv-a800-02.fw /lib/firmware

A continuación si desconectamos y volvemos a conectar el receptor se cargará el firmware, se realizará la inicialización correctamente y podremos usar el dispositivo.

# dmesg

[ 5469.791849] usb 3-4: new high-speed USB device number 6 using ehci-pci
[ 5469.948403] usb 3-4: New USB device found, idVendor=07ca, idProduct=a800, bcdDevice= 0.01
[ 5469.948432] usb 3-4: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 5469.949663] dvb-usb: found a 'AVerMedia AverTV DVB-T USB 2.0 (A800)' in cold state, will try to load a firmware
[ 5469.950048] usb 3-4: firmware: direct-loading firmware dvb-usb-avertv-a800-02.fw
[ 5470.019875] usb 3-4: USB disconnect, device number 6
[ 5470.020014] dvb-usb: generic DVB-USB module successfully deinitialized and disconnected.
[ 5471.807795] usb 3-4: new high-speed USB device number 7 using ehci-pci
[ 5471.966023] usb 3-4: New USB device found, idVendor=07ca, idProduct=a801, bcdDevice= 0.00
[ 5471.966052] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 5471.966070] usb 3-4: Product: A801
[ 5471.966084] usb 3-4: Manufacturer: AVerTV
[ 5471.967588] dvb-usb: found a 'AVerMedia AverTV DVB-T USB 2.0 (A800)' in warm state.
[ 5471.967910] dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
[ 5471.968442] dvbdev: DVB: registering new adapter (AVerMedia AverTV DVB-T USB 2.0 (A800))
[ 5472.379096] usb 3-4: DVB: registering adapter 0 frontend 0 (DiBcom 3000MC/P)...
[ 5472.380871] dvb_pll: dvb_pll_attach: Panasonic ENV57H1XD5 tuner, frequency range: 44250000...858000000
[ 5472.381259] Registered IR keymap rc-avermedia-m135a
[ 5472.381451] rc rc0: AVerMedia AverTV DVB-T USB 2.0 (A800) as /devices/pci0000:00/0000:00:1d.7/usb3/3-4/rc/rc0
[ 5472.381665] rc rc0: lirc_dev: driver dvb_usb_a800 registered at minor = 0, scancode receiver, no transmitter
[ 5472.381860] input: AVerMedia AverTV DVB-T USB 2.0 (A800) as /devices/pci0000:00/0000:00:1d.7/usb3/3-4/rc/rc0/input21
[ 5472.382063] dvb-usb: schedule remote query interval to 150 msecs.
[ 5472.382077] dvb-usb: AVerMedia AverTV DVB-T USB 2.0 (A800) successfully initialized and connected.

Para poder ver o grabar los canales necesitamos instalar algunos programas para buscar los canales y sintonizar el que deseemos.

# apt-get install w-scan dvb-apps

El programa w-scan hace la búsqueda de canales y crea un archivo con la lista de canales encontrados. El programa permite crear el archivo con varios formatos usados por diferentes programás. Con el parámetro -X se crea el archivo en el formato de los programas zap, czap y xine.

# w_scan -X > canales.conf

w_scan -X 
w_scan version 20170107 (compiled for DVB API 5.10)
guessing country 'ES', use -c  to override
using settings for SPAIN
DVB aerial
DVB-T Europe
scan type TERRESTRIAL, channellist 4
output format czap/tzap/szap/xine
output charset 'UTF-8', use -C  to override
Info: using DVB adapter auto detection.
	/dev/dvb/adapter0/frontend0 -> TERRESTRIAL "DiBcom 3000MC/P": good :-)
Using TERRESTRIAL frontend (adapter /dev/dvb/adapter0/frontend0)
-_-_-_-_ Getting frontend capabilities-_-_-_-_ 
Using DVB API 5.11
frontend 'DiBcom 3000MC/P' supports
INVERSION_AUTO
QAM_AUTO
TRANSMISSION_MODE_AUTO
GUARD_INTERVAL_AUTO
HIERARCHY_AUTO
FEC_AUTO
BANDWIDTH_AUTO not supported, trying 6/7/8 MHz.
FREQ (44.25MHz ... 858.00MHz)
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 
Scanning DVB-T...
Scanning 8MHz frequencies...
474000: (time: 00:00.060)         signal ok:	QAM_AUTO f = 474000 kHz I999B8C999D999T999G999Y999 (0:0:0)
        Info: no data from PAT after 2 seconds
        deleting (QAM_AUTO f = 474000 kHz I999B8C999D999T999G999Y999 (0:0:0))
482000: (time: 00:03.216)         signal ok:	QAM_AUTO f = 482000 kHz I999B8C999D999T999G999Y999 (0:0:0)
        Info: no data from PAT after 2 seconds
        deleting (QAM_AUTO f = 482000 kHz I999B8C999D999T999G999Y999 (0:0:0))
490000: (time: 00:06.220)         signal ok:	QAM_AUTO f = 490000 kHz I999B8C999D999T999G999Y999 (0:0:0)
        QAM_AUTO f = 490000 kHz I999B8C999D999T999G999Y999 (0:0:0) : updating transport_stream_id: -> (0:0:1)
        QAM_AUTO f = 490000 kHz I999B8C999D999T999G999Y999 (0:0:1) : updating network_id -> (0:12572:1)
        updating transponder:
           (QAM_AUTO f = 490000 kHz I999B8C999D999T999G999Y999 (0:12572:1)) 0x0000
        to (QAM_64   f = 490000 kHz I999B8C23D0T8G4Y0 (8916:12572:1)) 0x405A
498000: (time: 00:14.316)

En cada línea del archivo de canales se escribe la información de un canal. El primer parámetro es el nombre y a continuación se indica la frecuencia a la que se emite.

Cuatro HD(MEDIASET):506000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1701:1703:191
mega(A3MEDIA):538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1301:1303:155
ONDA CERO(A3MEDIA):538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:1401:156
EUROPA FM(A3MEDIA):538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_2_3:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:1501:157

En el paquete dvb-apps instalado anteriormente se encuentra el programa tzap que permite sintonizar un canal utilizando la información del archivo de canales. Con el parámetro -c se le indica el archivo de canales y con -r prepara el receptor para grabación. Por último se le pasa el nombre del canal.

# tzap -c canales.conf -r "mega(A3MEDIA)"

using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
reading channels from file 'canales.conf'
Version: 5.11  	 FE_CAN { DVB-T }
tuning to 538000000 Hz
video pid 0x0515, audio pid 0x0517
status 07 | signal 837a | snr 0000 | ber 001fffff | unc 00000000 | 
status 1f | signal 8356 | snr 0000 | ber 00000000 | unc 0000000c | FE_HAS_LOCK

Una vez sintonizado el canal es posible verlo con el programa ffplay utilizando el dispositivo /dev/dvb/adapter0/dvr0.

# ffplay -i /dev/dvb/adapter0/dvr0

Después de comprobar que se puede ver y oir el canal podemos grabarlo con ffmpeg. Como el vídeo y el audio están comprimidos usando formatos como MPEG2, H264, MP2 o EAC3 podemos grabar el canal directamente con el parámetro -codec copy. Debemos usar un tipo de archivo contenedor compatible con esos formatos de vídeo y audio como por ejemplo MP4 o MKV.

# ffmpeg -i /dev/dvb/adapter0/dvr0 -codec copy video.mp4

Input #0, mpegts, from '/dev/dvb/adapter0/dvr0':
  Duration: N/A, start: 73929.973778, bitrate: N/A
    Stream #0:0[0x515]: Video: mpeg2video (Main), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Side data:
      cpb: bitrate max/min/avg: 3765200/0/0 buffer size: 1802240 vbv_delay: N/A
    Stream #0:1[0x517]: Audio: mp2, 48000 Hz, stereo, s16p, 128 kb/s
Output #0, mp4, to 'video.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: mpeg2video (Main) (mp4v / 0x7634706D), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], q=2-31, 25 fps, 25 tbr, 90k tbn, 90k tbc
    Side data:
      cpb: bitrate max/min/avg: 3765200/0/0 buffer size: 1802240 vbv_delay: N/A
    Stream #0:1: Audio: mp2 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 128 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)

Esto es lo básico que hay que saber para configurar el receptor, buscar los canales, sintonizar uno de ellos y verlo o grabarlo. Aparte de los programas mostrados hay bastantes más que podemos usar según nuestras necesidades.

2 comentarios:

  1. Utilizas una versión especial de ffmpeg con soporte para DVB?

    ResponderEliminar
    Respuestas
    1. Alejandro Sánchez18 de julio de 2023, 23:54

      Uso la versión de Debian. Creo que el soporte de DVB se encuentra en el controlador de la capturadora y el sistema de vídeo de Linux. A través del dispositivo /dev/dvb/adapter0/dvr0 cualquier programa puede acceder a la imagen.

      Eliminar