DVB Scripts

This I use to generate a modified channels configuration file for mplayer, so that channels can be selected by number rather than by name in mplayer.

#!/bin/bash
# This script scans the DVB-T frequencies and puts
# them into Freeview channel ordering,
# for easy selection from the console by number such as “mplayer dvb://700” for Radio 1
# change the WHERE line to point to tuning data for your location

WHERE=/usr/share/doc/dvb-utils/examples/scan/dvb-t/uk-SuttonColdfield 
RAW=~/.mplayer/freeview.raw
MAP=~/.mplayer/freeview.map
OUT=~/.mplayer/channels.conf.ter

scan -u ${WHERE} > ${RAW}
scan -q -o vdr -e 4 -u ${WHERE} > ${MAP}

N=0
IFS=$';'
while read LINE EXTRA
do
	if test "${LINE:0:2}" = ":@"
	then
		PROGNUM="${LINE}"
	else
		if test -n "${PROGNUM}"
		then
			C[${N}]="${PROGNUM:2}"
			P[${N}]="${LINE}"
			N=$((${N}+1))
			PROGNUM=""
		fi
	fi
done < ${MAP}

while IFS=: && read CHAN FREQ INVER REST
do
	IFS=:
	N=0
	for W in ${P[*]}
	do
		IFS=
		if [ "${CHAN}" = "${W}" ]
		then
			PROG=${C[${N}]}
			SO[${PROG}]=${PROG}$':'${FREQ}$':'${CHAN}$':'${REST}
		fi
		N=$((${N}+1))
	done
done < ${RAW}
IFS=

for N in ${SO[*]}
do
	echo ${N}
done > ${OUT}

It is possible to stream DVB to mp2 or mpeg

#!/bin/bash
# dvbstream and ts_filter are in package dvbstream
# dvb-mpegtools compiled as dvb-mpegtools_main is in the source of package libdvb-dev (and have to compile it)
# chrt is in schedutils (and needs realtime-lsm)
# tee is in coreutils
# madplay is in madplay
# aplay in in alsa-utils

LINE=$(grep $'^'"${1}" ~/.mplayer/channels.conf.ter)
FREQUENCY=$(cut -d":" -f2 <<<"${LINE}")
VIDEOPID=$(cut -d":" -f11 <<<"${LINE}")
AUDIOPID=$(cut -d":" -f12 <<<"${LINE}")

if test "${VIDEOPID}" != "0"
then
        chrt -r 1 dvbstream -f "${FREQUENCY}" "${VIDEOPID}" "${AUDIOPID}" -o | \
        chrt -r 1 ts_filter "${VIDEOPID}" "${AUDIOPID}" | \
        chrt -r 1 dvb-mpegtools ts2ps "${VIDEOPID}" "${AUDIOPID}" | \
        chrt -r 1 tee /tmp/$(date +%Y%m%d%H%M%S).mpeg |
        chrt -r 1 mplayer -
else
        chrt -r 1 dvbstream -f "${FREQUENCY}" "${AUDIOPID}" -o | \
        chrt -r 1 ts_filter "${AUDIOPID}" | \
        chrt -r 1 dvb-mpegtools ts2es "${AUDIOPID}" | \
        chrt -r 1 tee /tmp/$(date +%Y%m%d%H%M%S).mp2 | \
        chrt -r 1 madplay - -b 32 -o wave:- -R 48000 | \
        chrt -r 1 aplay -
fi

It is also possible to accept a stream from a videolan VLC instance over multicast.

Put #duplicate{dst=std{access=rtp,mux=ts,dst=239.255.0.0:5004}} in the default stream output chain in stream output in vlc preferences.

The newer #rtp{dst=239.255.0.0,port=5004,mux=ts,proto=udp,ttl=2} has the same effect

If you want to cross multiple networks, such as cabled to wlan, use a ttl of more than 1 on vlc and use a multicast forwarder like smcroute on each computer interconnecting the networks. Example: smcroute -a eth0 192.0.2.0 239.255.0.0 wlan0 goes in /etc/smcroute/startup.sh.

chrt -r 1 dumprtp 239.255.0.0 5004 | \
chrt -r 1 ts_filter 68 | \
chrt -r 1 dvb-mpegtools ts2es 68 | \
chrt -r 1 madplay - -b 32 -o wave:- -R 48000 | \
chrt -r 1 aplay -