DVB карты и Gstreamer.
Если возникает ошибка ( текст ошибки, может быть переведен на текущий язык системы ):
“Cannot enumerate delivery systems from frontend device” - это преодолимо.
Начиная с версии 1.1 программы
Gtv-Dvb, такая ошибка возникать не должна, но если будет возникать, то решение описано ниже. Также описанное ниже может быть полезным для других программ, которые используют Gstreamer.
Ошибку генерирует dvbsrc:
GstElement <struct GstDvbSrc> dvbsrc - управляет DVB устройством.
Чтобы не терять время на объяснения, достаточно сравнить две функции ( из dvbsrc и libdvbv5 ):
Файл: sys/dvb/gstdvbsrc.c (
gst-plugins-bad-1.12.3 )
функция: gst_dvbsrc_open_frontend
строки: 1616 - 1624
LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_GET_PROPERTY, &props));
if (err) {
GST_ELEMENT_ERROR (object, RESOURCE, SETTINGS,
(_("Cannot enumerate delivery systems from frontend device \"%s\"."),
frontend_dev), GST_ERROR_SYSTEM);
close (object->fd_frontend);
g_free (frontend_dev);
return FALSE;
Файл: lib/libdvbv5/dvb-fe.c (
v4l-utils-1.12.5 )
функция: dvb_fe_open_fname
строки: 227 – 230
/* Detect a DVBv3 device */
if (xioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) {
parms->dvb_prop[0].u.data = 0x300;
parms->dvb_prop[1].u.data = SYS_UNDEFINED;
Две функции делают одно и то же:
1. открывают устройство
2. узнают имя устройства
3. выясняют тип устройства ( этот фрагмент кода находится выше )
В чем разница?
Libdvbv5 использует ошибку как детектор версии DVBv3, и не закрывает устройство, как это делает dvbsrc...Вывод:
строки - 1622 1623 1624 - нужно закомментировать, исходя из примера libdvbv5
close (object->fd_frontend);
g_free (frontend_dev);
return FALSE;
Алгоритм действий:
1. скачать архив
gst-plugins-bad-1.* исходного кода ( лучше выбрать такую же версию как в системе )
2. закомментировать строки - 1622 1623 1624 ( файл sys/dvb/gstdvbsrc.c )
3. выполнить команды ( если есть понимание того, как это сделать, то достаточно собрать и установить только одну секцию - dvb, а не весь проект )
./configure ( нужно откорректировать префикс )
make
make install
4. очистить кэш
rm -r ~/.cache/gstreamer-1.0
Кэш хранится в памяти, поэтому лучше перезагрузить компьютер.