Nahrávání z IPTV

Princip:
Skript v bashi, který konvertuje parametry příkazu na zadání nahrávání pomocí mencoderu pro daemon at. Vstupem jsou dva časové údaje, počáteční čas a datum pro daemon at a konečný čas, pak je to název kanálu a případný požadavek na vypnutí stroje.

Vysílání je realizováno pomocí getstream-poempel (klon getstreamu), což je velice nenáročné řešení sremingu multimédií (spotřebováná mezi 0,1-2% sys. zdrojů, snadná konfigurace ). Navíc zachytáváním z tohoto serveru se pak neblokuje DVB-T karta a je tedy možné se zachytávat či sledovat (případně obojí) v rámci multiplexu další programy.

Realizace zachytávání pomocí mencoderu se osvědčuje pro jeho nenáročnost, konfigurovatelnost a přirozenou snahu stream poopravovat. Jako zcela nevhodné se však ukázalo zachytávání do kontejneru AVI, proto je použit MPEG. Pro jeho další zpracování lze použít Gopchop, DVBCut, ProjectX , případně Avidemux.

Dalšími možnostmi pro zachytávání je použít třeba wget nebo vlc a pro streaming vls.

Pakliže Vás napdane nějaké vylepšení tohoto řešení či naleznete nejakou chybu, přijmám nápady, patche či jakoukoliv jinou pomoc.

Kontakt: dvb_record zavináč jakubcovi tečka info. nebo vizte kontakt

Přímo zde vidíte náhled scriptu a ještě jeho kopie ke stažení v gzipu.

 



    1 #!/bin/sh
    2 # Description: Script for grabbing from getstream server (DVB-T Recording)
    3 # Author: Petr (DotaZ) Jakubec
    4 # Date:  2008/02/24 21:01:16 (CET)
    5 # Name: dvb_record.sh
    6 # Version: 0.99 beta
    7 # Destination: for home specially use
    8 # Licence: GPL v2 (http://www.gnu.org/licenses/gpl.txt)
    9 # Update:
   10 #
   11 # POZN:
   12 #			* interaktive user interface?
   13 #			* parse tv station from channels.conf?
   14 
   15 # programms need:
   16 # bash :), at, awk, tr, mencoder,
   17 
   18 
   19 if [ "$1" = "" -o "$1" = "--help" ]; then
   20 	clear
   21 	echo "Ahoj, umim jednorazove nahravat z dvb-t televize."
   22 	echo $"USAGE: $0"
   23 	echo "      <cas_spusteni> <cas_ukonceni> <tv_stanice> <stop> "
   24 	echo "        parametry se oddeluji mezerou"
   25 	echo ""
   26 	echo " format casu_spusteni: HH:MM MM/DD/YY"
   27 	echo "           musi byt v uvozovkach kvuli mezere !"
   28 	echo "           POZOR! datum musi byt ve formatu mesic-den-rok!"
   29 	echo "           priklad: \"15:00 12/21/06\""
   30 	echo " format casu_ukonceni: HH:MM"
   31 	echo "           musi byt v uvozovkach kvuli dvojtecce !"
   32 	echo "           priklad: \"16:30\""
   33 	echo " seznam stanic:"
   34 	echo "  CT1; CT2; CT24; CTSport; NOVA;"
   35 	echo " * parametr \"stop\" vepis pokud chces po nahravani pc vypnout."
   36 	echo ""
   37 	exit 0
   38 fi
   39 
   40 if [ "$2" = "" ]; then
   41 	echo "Chybi zadani casu ukonceni nahravani ...koncim!"
   42 	exit 1
   43 fi
   44 
   45 if [ "$3" = "" ]; then
   46 	echo "Chybi zadani televizni stanice ...koncim!"
   47 	exit 1
   48 fi
   49 
   50 # exit is needed for mail from AT.
   51 if [ "$4" = "stop" ]; then
   52 	echo " Pozor po ukonceni nahravani vypnu pocitac!!"
   53 	SHUTDOWN="sudo /sbin/shutdown -h +2 && exit 0"
   54 else
   55 	SHUTDOWN="exit 0"
   56 fi
   57 
   58 # rename variables:
   59 Time1=$1
   60 Time2=$2
   61 TVStation=$3
   62 # $4 indikates shudown need only, dont rename it.
   63 
   64 case $TVStation in
   65 	CT1)		PORT="9001" ;;
   66 	CT2)		PORT="9002" ;;
   67 	CT24)		PORT="9003" ;;
   68 	CTSport)	PORT="9004" ;;
   69 	NOVA)		PORT="9005" ;;
   70 	*) echo "ERROR! Je mi lito, ale takovou stanici neznam ...koncim!" && \
   71 		echo " Akceptuji:  CT1; CT2; CT24; CTSport; NOVA;" && exit 1
   72 esac
   73 
   74 # TIME MINING FUNCTION (count record time)
   75 #	input:	$Time1="23:45 12/21/06"
   76 #				$Time2="01:05"
   77 get_record_time () {
   78  # numeric mineing :-)
   79  # TH == time hour, TM == time minutes.
   80  # xx1 == startting time, xx2 == stopping time
   81 	    TH1=`echo $Time1 | awk -F ":" '{print $1}'`
   82 	TM1_tmp=`echo $Time1 | awk -F ":" '{print $2}'`
   83        TM1=`echo $TM1_tmp | awk -F " " '{print $1}'`
   84        TH2=`echo $Time2 | awk -F ":" '{print $1}'`
   85        TM2=`echo $Time2 | awk -F ":" '{print $2}'`
   86 
   87  #echo $1, $2, $TH1, $TH2 , $TM1, $TM2
   88 
   89  # digits is in pair? -> control this:
   90 	check_TH1=$(echo -n "$TH1" | wc -c)
   91 	check_TM1=$(echo -n "$TM1" | wc -c)
   92 	check_TH2=$(echo -n "$TH2" | wc -c)
   93 	check_TM2=$(echo -n "$TM2" | wc -c)
   94 
   95 	if [ $check_TH1 -ne 2 -o $check_TM1 -ne 2 ]; then
   96 		echo "Format pocatecniho casu musi byt  HH:MM MM/DD/YY" && exit 1
   97 	fi
   98 
   99 	if [ $check_TH2 -ne 2 -o $check_TM2 -ne 2 ]; then
  100 		echo "Format konecneho casu musi byt HH:MM" && exit 1
  101 	fi
  102 
  103  # multiplied *8 and *9 in BASH invoke exception:
  104  #     value too great for base (error token is "09")
  105  # -> zero turn off (takze to musim obejit pres odebrani nuly)
  106  #if TH1 or TH2 contains zero (etc.: 00:05) BASH invoke exception:
  107  #     syntax error: operand expected (error token is "* 60 + 30")
  108  # -> NOT tr -d "0" on second zero digit - neorezavat nuly (&& -gt 0)
  109 	if [ $TH1 -lt 10 ] && [ $TH1 -gt 0 ]; then
  110 		TH1=$(echo $TH1 | tr -d '0')
  111 	fi
  112 	if [ $TH2 -lt 10 ] && [ $TH2 -gt 0 ]; then
  113 		TH2=$(echo $TH2 | tr -d '0')
  114 	fi
  115 
  116  # Adding a whole day for special cases (23:30 - 01:15)
  117 	start=$(($TH1 * 60 + $TM1))
  118 	stop=$(($TH2 * 60 + $TM2))
  119 	if [ $stop -lt $start ]; then
  120 		TH2=$(($TH2 + 24))
  121 	fi
  122 
  123  # other errs & ending count record time:
  124  # Step by Step
  125  #Hours=$(($TH2 * 60 - $TH1 * 60))
  126  #Minutes=$(($TM2 - $TM1))
  127  #Record_time=$(($Hours + $Minutes))
  128 
  129 	Record_time=$(($(($TH2 * 60 - $TH1 * 60)) + $(($TM2 - $TM1))))
  130 	if [ $Record_time -lt 0 ]; then
  131 		echo "Pocet minut nahravani je $Record_time - Musi tam byt nekde chyba ...koncim!" && exit 1
  132 	fi
  133  # export not need? BASH have local or global variable only:
  134  #export `echo $Record_time`
  135 }
  136 
  137 
  138 #====begin=============================================================
  139 
  140 get_record_time
  141 
  142 # *60 = pocet_sekund *25 = pocet_frames
  143 # obvykly pocet framu je 24,94-7 ale pro jednoduchost (bash neumi necela cisla) je 25 prijatelne presna.
  144 Frame_time=$(($Record_time*60*25))
  145 
  146 RECORD="mencoder http://localhost:$PORT -cache 1024 -ovc copy -oac copy -of mpeg -o /cesta/DVBT-$TVStation-`date +%Y%m%d-%H%M--$$.mpg` -force-avi-aspect 1.33 -frames $Frame_time -really-quiet && $SHUTDOWN"
  147 
  148 # testovaci record
  149 #RECORD="touch /tmp/`date +%F--%H%M%S-`.txt"
  150 
  151 echo "Hlaseni od AT:"
  152 echo $RECORD | at $1 && echo " Zadani pro planovac AT se zda v poradku." || echo " Neco je statne - byl cas_spusteni zadan ve spravnem formatu a v uvozovkach?"
  153 #echo 'wget www.server.cz/film.mpg' | at 15:00 12/21/06
  154 
  155 echo ""
  156 echo "Vysledky zadani: "
  157 echo -e "\033[0102m Nahravam $Record_time min. ($Frame_time frames) z kanalu $TVStation (port $PORT) a zacinam $Time1 \033[0m"
  158 
  159 exit 0
  160 #====end===============================================================
  161 # EOF
Petr Jakubec © 2006