Transmisja i rejestracja RTV

Prezentuje skrypt służący do prostszego uruchamiania transmisji lub rejestracji sygnału RTV. Warto zapoznać się także z komendami wykorzystywanymi przez skrypt, gdyż jest całkiem prawdopodobne iż może być potrzebne ich wywołanie z innymi opcjami (np. rejestracja obrazu odbieranego przez sieć).

Alternatywna motoda rejestracji sygnału z karty telewizyjnej może byc taka funkcja którą możemy dopisac do ~/.bashrc:

	function tv_record() {
		if [ $# -lt 1 ]; then
			echo "USAGE: $0 STATION"
			echo "USAGE: $0 STATION /dev/videoX hw.X"
			return -1
		fi
		
		STATION="$1"
		
		VIDEO="${2:-/dev/video1}"
		AUDIO="${3:-hw.2}"
		
		v4lctl -c $VIDEO setstation $STATION
		
		mencoder tv:// -tv device=$VIDEO:input=0:norm=PAL-DK:adevice=$AUDIO:alsa:input=0:amode=1:immediatemode=0:decimation=1 -ffourcc XVID -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=3000:keyint=125:vhq -oac mp3lame -lameopts cbr:br=96:mode=0 -o tv_`date +%F_%T`.avi
	}

Z użyciem rtmpsuck możliwe jest także nagrywanie strumieni RTMP (np. filmików z rutube), posłużyć do tego może komenda: iptables -t nat -A OUTPUT -p tcp --dport 1935 -m owner \! --uid-owner root -j REDIRECT; rtmpsuck

rtv.sh

#!/bin/bash

# skrypt jest dość wygodnym magnetowidem cyfrowym/stramerem sieciowym umożliwiającym proste uruchamianie
# programu transcode/vlc/mencoder z zadanymi parametrami,
# dodatkowo ustawia inne parametry jak kanał, mikser do nagrywania audio, ...


print_help_and_exit() {
  echo "USAGE: $0 [-a alias] [-e engine] [-i input_source] [-r|-t] [-f frenquency|-c chanell_name]"
  echo "          [-d dev_num] [-q hq|vhs] [-l ttl] [-p] [-v] [-n] [output]"
  echo " -e = set engine:"
  echo "      vlc (default)"
  echo "      transcode (tv/composite recording only)"
  echo "      arecord (radio recording only)"
  echo "      mplayer OR mencoder"
  echo
  echo " -r = recorder"
  echo " -s = network streaming (default)"
  echo
  echo " -i = set input mode:"
  echo "      radio (requie -f, frenquency in MHz),"
  echo "            use this option in VLC for only /dev/dsp capture and ignore v4l errors"
  echo "      tv (requie -f, frenquency in kHz)"
  echo "      composite (default)"
  echo " -d = set video device {NUM} for /dev/video{NUM} (default 0)"
  echo " -D = set audio device {NUM} for /dev/dsp{NUM} (default empty)"
  echo
  echo " -f = set frenquency for tv or radio station (in kHz for TV, in MHz for RADIO)"
  echo " -c = set chanel name from ~/.xawtv for tv station"
  echo
  echo " -q = set quality support in transcode recorder modes (default hq)"
  echo " -t = set recording time in transcode recorder modes (default infinty)"
  echo
  echo " -p = preview"
  echo " -v = verbose"
  echo " -n = no daemon"
  echo
  echo " -h = help (this info)"
  echo
  echo "output is "
  echo "  IP.ADDRES:PORT for network streaming mode (for example: 226.1.226.1:1234)"
  echo "  file name without extension for recorder mode"
  
  exit
}

# default value
ENGINE="vlc"
INPUT="composite"
MODE="NET"
VDEV_NUM=0
ADEV_NUM=""
ACSS="udp{ttl=1}"
QUALITY="hq"

# $FREQ nie może być pusty
FREQ="123"

while getopts "e:rsi:d:D:f:c:qtpvnh" arg; do
  case "$arg" in
    a)
      case "$OPTARG" in
        "alias1")
          ENGINE="vlc"
          INPUT="composite"
          MODE="NET"
          DEV_NUM=0
          ACSS="udp{ttl=1}"
        ;;
      esac
      ;;
    e) ENGINE="$OPTARG" ;;
    r) MODE="REC" ;;
    s) MODE="NET" ;;
    i) INPUT="$OPTARG" ;;
    f) FREQ="$OPTARG" ;;
    c) CHANELL="$OPTARG" ;;
    d) VDEV_NUM="$OPTARG" ;;
    D) ADEV_NUM="$OPTARG" ;;
    q) QUALITY="$OPTARG" ;;
    t) TIME="$OPTARG" ;;
    l) ACSS="udp{ttl=$OPTARG}" ;;
    
    p) PREVIEW="dup" ;;
    v) DEBUG="-vvv --color" ;;
    n) DAEMON="no" ;;
    h) print_help_and_exit ;;
  esac
done

# destination IP addres IP:PORT, for example (multicast): 226.1.226.1:1234
shift $(( $OPTIND-1 ))
OUTPUT=$1

if [ "$OUTPUT" = "" ]; then
  if [ "$MODE" = "REC" ]; then
    OUTPUT="rtv.`date +%FT%T`"
  else
    print_help_and_exit
  fi
fi


# ustawianie parametrów AUDIO
set_audio() {
  # USTAWIENIA GLOSNOSCI
  amixer set 'Input Source',0 Line
  amixer set 'Capture',0 30% on
  amixer set 'Digital',0 30% on
  # w powyzszym nie dziala on ale to `amixer cset numid=10 on` lub ponizsze (rownowazne) dziala:
  amixer cset iface=MIXER,name='Capture Switch',index=0 on
  
  # unmute audio
  v4lctl volume mute off
}

# uzyskanie częstotliwości z ~/.xawtv
get_FREQ() {
  awk '
    BEGIN {
      RS="["; FS="]"
    }
    $1=="'$1'" {
      print $0
    }
  ' .xawtv | awk '
    BEGIN {
      FS="[\t ]*=[\t ]*"
    }
    $1=="freq" {
      print $2
    }
  ' | tr "," "."
}

# TRYBY NAGRYWANIA
# dla plikow o maksymalnej jakosci oferowanej przez PAL
REC_transcode_hq() {
  /usr/bin/transcode -x v4l2,v4l2 -i /dev/video$VDEV_NUM -p /dev/dsp$ADEV_NUM -g 768x576 \
    -n 0x1 -b 64 -e 16000,16,1 \
    -y xvid4,tcaud -R 1,$1.xvid.log -o $1.avi $2
    # moznaby dodac -w 700,250,100 ale przy tym kodeku to bez (większego) znaczenia
}

# dla plikow o obnizonej jakosci (np. z VHS ...)
REC_transcode_vhs() {
  /usr/bin/transcode -x v4l2,v4l2 -i /dev/video$VDEV_NUM -p /dev/dsp$ADEV_NUM -g 384x286 \
    -n 0x1 -b 64 -e 16000,16,1 \
    -y xvid4,tcaud -R 1,$1.xvid.log -o $1.avi $2
    # -avi_limit 2048
    # -b 48 -y divx -w 450,60,100 -R 1 --export_fps 15
}

# nagrywanie przy pomocy mencoder'a
REC_mencoder() {
  mencoder tv:// \
    -tv device=/dev/video$VDEV_NUM:input=$V4L_INPUT:norm=PAL-DK:freq=$FREQ:adevice=/dev/dsp$ADEV_NUM:immediatemode=0:decimation=1 \
    -ffourcc XVID -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=3000:keyint=125:vhq \
    -oac mp3lame -lameopts cbr:br=96:mode=0 -o $1.avi
}


# dodatkowe ustawienia
if [ "$INPUT" = "composite" ]; then
  V4L_INPUT=1
else
  V4L_INPUT=0
  if [ "$CHANELL" != "" ]; then
    FREQ=`get_FREQ $CHANELL`
  fi
fi
FREQ_kHz=`echo "$FREQ * 1000" | bc`


# wybór silnika i trybu
case "$ENGINE $MODE" in
  "vlc NET"|"VLC NET")
    #INPUT_V4L="v4l:///dev/video$VDEV_NUM :v4l-norm=pal :v4l-frequency=$FREQ :v4l-size=640x480 :v4l-channel=$V4L_INPUT :v4l-adev=/dev/dsp$ADEV_NUM :audio=0"
    INPUT_V4L="v4l2:///dev/video$VDEV_NUM :v4l2-norm=pal :v4l2-tuner-frequency=$FREQ_kHz :v4l2-size=640x480 :v4l2-input=$V4L_INPUT :input-slave=alsa://hw:2,0 :audio=1"
    OUTPUT_NET="std{access=$ACSS,mux=ts,dst=$OUTPUT}"
    
    CODEC="ffmpeg{keyint=80,hurry-up,vt=800000}"
    TRANSCODE="transcode{vcodec=mp4v,acodec=mpga,vb=3000,ab=256,venc=$CODEC}"
    DUPLICATE="duplicate{dst=display,dst=$OUTPUT_NET}"
    
    # for send to perrcast
    # OUTPUT_NET="std{access=http,mux=ogg,dst=$DEST}"
    # TRANSCODE="transcode{acodec=vorb,ab=128}" 
    # and start via -r local_IP:local_port and use http://local_IP:local_port in peercast config
    # peercast may be on other machine
    
    if [ "$PREVIEW" = "dup" ]; then
      OUTPUT_VLC="#$TRANSCODE:$DUPLICATE"
      INTERFACE=""
      DAEMON="no"
    else
      OUTPUT_VLC="#$TRANSCODE:$OUTPUT_NET"
      INTERFACE="-I hotkeys"
    fi
    
    set_audio
    
    # URUCHAMIANIE VLC
    if [ "$INPUT" = "tv" -o "$INPUT" = "composite" ]; then
      vlc $DEBUG $INPUT_V4L --sout "$OUTPUT_VLC" $INTERFACE &
      sleep 1
      if [ "$CHANELL" != "" ]; then
        v4lctl setstation $CHANELL
      fi
    elif [ "$INPUT" = "radio" ]; then
      vlc $DEBUG $INPUT_V4L --sout "$OUTPUT_VLC" --no-video $INTERFACE &
      sleep 1
      radio -f $FREQ -q
    fi
    ;;
  "transcode REC")
    if [ "$CHANELL" != "" ]; then
      v4lctl setinput Television
      v4lctl setstation $CHANELL
    elif [ "$INPUT" = "composite" ]; then
      v4lctl setinput Composite1
    else
      echo "transcode requies -i composite OR -c options"
      exit
    fi
    
    set_audio
    
    if [ "$TIME" != "" ]; then
      TIME="-c $TIME"
    fi
    
    REC_transcode_$QUALITY $OUTPUT $TIME
    ;;
  "arecord REC")
    if [ "$INPUT" != "radio" ]; then
      print_help_and_exit
    fi
    
    set_audio
    radio -f $FREQ -q
    arecord -fcd $OUTPUT.wav
    ;;
  "mplayer REC"|"mencoder REC")
    REC_mencoder $OUTPUT
    ;;
  *)
    if [ "$MODE" = "NET" ]; then
      echo "Not supported network stream (-t) with this engine (-e $ENGINE)"
    else
      echo "Not supported recording (-r) with this engine (-e $ENGINE)"
    fi
    ;;
esac

# INFORMACJE O PID / ZAKANCZANIE PRACY
pid=`jobs -p`
if [ "$pid" != "" ]; then
  echo "DAEMON PID is $pid"
  if [ "$MODE" = "NET" ]; then
    echo "for watch or listen use: vlc udp://@$OUTPUT"
    echo " OR: vlc udp://@$OUTPUT --sout '#duplicate{dst=std{access=file,mux=ogg,dst=\"record.ogg\"}}' -I hotkeys"
    echo " to record in record.ogg file"
  fi
  
  if [ "$DAEMON" = "no" ]; then
    echo -e "\033[1;31mfor exit write \033[1;0m\033[1;41mquit\033[0m"
    cmd=""
    while [ "$cmd" != "quit" ]; do 
      read cmd
    done;
    kill $pid
  else
    echo -e "\033[1;31mfor exit exec \033[1;0m\033[1;41mkill $pid\033[0m"
  fi
fi

# MORE INFO:
#  * http://www.videolan.org/doc/streaming-howto/en/ch03.html
#  * vlc --longhelp --advanced | less
#  * man radio

XHTML generated by highlight (http://www.andre-simon.de/) from rtv.sh



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/usage_and_config/multimedia/rtv_recorder_and_transmiter) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:42 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).