Portál AbcLinuxu, 2. května 2025 20:32
Poslední dobou mě zajímalo, jak nahrávat vysílání DVB-T v konzoli a hlavně případná možnost nahrávání celého multiplexu. Bohužel, k tomuto tématu neexistuje příliš dokumentace a o řešení typu vlc jsem neměl zájem. Pro nahrávání jednoho streamu (stanice) je možné s uspokojivými výsledky použít program tzap, nicméně tento program neumí nahrávat celý multiplex.
Po delším pátrání jsem našel sadu programů dvbutils, z nichž mě obzvlášť zaujal program dvbstream. Umožňuje mimojiné streamovat DVB přes síť, nicméně pro moje potřeby se mi zdál dostatečně malý a nepřeplácaný. Hlavní je, že umí naladit danou frekvenci a na definici stanic se neptá.
Bohužel, v Gentoo je dostupný pouze jeho bratříček - dvbtune, který má zřejmě podobnou funkci jako tzap, avšak neumí zpřístupnit dvb kartu pro následné nahrávání. Dovolil jsem si tedy zbastlit ebuild pro dvbstream, který se zdá být fukčním. Během tohoto procesu jsem ovšem narazil na problémy, a o hlavně nich bude tento příspěvek.
Prvním problémem je chybějící dokumentace, nepočítáme-li v to výpis přepínačů, spustíme-li program bez parametrů a samotný zdrojový kód. Navíc po chvíli studia zdrojáku vyjde najevo, že vypisovaný seznam přepínačů není ani úplný, ani dobře zdokumentovaný.
Základní syntaxe volání programu dvbstream, pokud nechceme streamovat (což je záměr), je: dvbstream -f frekvence -o v_pid a_pid. Přepínač "-f" specifikuje frekvenci, na kterou se má tuner naladit, ovšem je zde malý háček - frekvence je v kHz! Tento drobný nezdokumentovaný detail mi téměř přivodil stav šílenství a zatmění mysli. Další parametr "-o" říká, že si nepřejeme streamovat mpegy do sítě, ale chceme výstup na stdout. Parametry v_pid a a_pid jsou audio a video identifikátory jednotlivých PS streamů. Jdou například zjistit z tzapího channels.conf. Důležité je, že pokud zvolíme v_pid 8192 a a_pid vynecháme, bude se nahrávat celý multiplex.
Příklad: "dvbstream -f 560000 -o 8192 > cRa.ts" vyklopí do souboru celý multiplex Českých Radiokomunikací. To je všechno hezké, nicméně by to chtělo další fukce. Například parametr -n by měl nahrávat pouze n sekund. Potud je to dobré, jenže po chvíli (n sekundách), zjistíte, že to nefunguje. Průzkum bojem odhalil, že minimálně soubor dvbstream.c je napsán neuvěřitelně hnusně a minimálně parsování argumentů pomocí getopt() by potřeboval jako prase drbání. (Bugzilla na sf funkční řešení nenabízí, nicméně tento bug reportnutý je) Snad se někdy dostanu k tomu to přepsat...
Nyní budou následovat soubory...
dvbstream-0.5.ebuild:
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/media-tv/dvbstream/dvbstream-0.5.ebuild,v 1.1 2006/03/06 00:55:26 saruman Exp $
inherit eutils
DESCRIPTION="simple tuning app for DVB cards"
HOMEPAGE="http://sourceforge.net/projects/dvbtools"
SRC_URI="mirror://sourceforge/dvbtools/${P}.tar.gz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~x86"
DEPEND="media-tv/linuxtv-dvb-headers"
src_unpack() {
unpack ${A}
epatch ${FILESDIR}/location.patch
}
src_compile() {
emake dvbstream
}
src_install() {
dobin dvbstream
dodoc README scripts/*
}
files/location.patch:
*** dvbstream-0.5/dvb_defaults.h.orig 2002-07-06 10:43:12.000000000 +0200
--- dvbstream-0.5/dvb_defaults.h 2006-03-06 01:05:32.000000000 +0100
***************
*** 44,49 ****
--- 44,50 ----
//#define UK
//#define FINLAND
//#define FINLAND2
+ #define CZ
/* UK defines are at the end, as a default option */
***************
*** 60,65 ****
--- 61,80 ----
#endif
+ #ifdef CZ
+
+ /* Czech settings */
+ #define DVB_T_LOCATION "Praha"
+ #define BANDWIDTH_DEFAULT BANDWIDTH_8_MHZ
+ #define HP_CODERATE_DEFAULT FEC_2_3
+ #define CONSTELLATION_DEFAULT QAM_64
+ #define TRANSMISSION_MODE_DEFAULT TRANSMISSION_MODE_8K
+ #define GUARD_INTERVAL_DEFAULT GUARD_INTERVAL_1_8
+ #define HIERARCHY_DEFAULT HIERARCHY_NONE
+
+ #endif
+
+
#ifdef FINLAND2
/* FINLAND settings 2 (someone verify there is such environment) */
Tento patch nastavuje parametry vysílání pro ČR. Funguje jak pro multiplex CRa tak i pro CDG.
Tyto dva soubory uložte do /usr/local/portage/media-tv/dvbstream, odmaskujte v package.keywords, přesvědčte se, že máte nastaven PORTAGE_OVERLAY, spusťte ebuild dvbstream-0.5.ebuild digest a můžete kompilovat.
Přikládám i malý skriptík pro grabování multiplexu: getdvbmplex.sh
#!/bin/sh
#Pouziti: getdvbmplex frekvence cas vystupni_soubor
#kde "frekvence" je frekvence multiplexu v kHz, "cas" je doba nahravani v #sekundach a "vystupni_soubor" je jmeno souboru, kam se ziskana data ulozi
dvbstream -f ${1} 8192 -o > ${3} &
sleep ${2}
kill `pidof dvbstream`
Získaný transport stream můžete následně demuxovat pomoví ts2ps z balíčku libdvb, nebo pomocí javové aplikace ProjectX. O PX existuje zajímavé HOWTO na tvfreak.cz.
Závěrem: Doufám, že jsem podal srozumitelný návod, jak chytat celý multiplex v DVB-T a dále, že se někdy dostanu k opravám programu dvbstream. Mým finálním záměrem je postavit "nahrávací server" s webovým rozhraním, vybavený dvěma DVB-T tunery a dostatečným diskovým prostorem, kde by si známí mohli vždy minimálně od příštího dne "naklikat" pořady, o které by měli zájem a následně by se po propočítání časového rozpětí multiplex nahrál a demuxoval.
PS: používám tuner Technisat AirStar2, distribuci Gentoo, na přehrávání DVB primárně kaffeine a nainstalovaný software je z 95% z x86 větve.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.