使用GNU/Linux播放电视节目(2)

# Process command options
while getopts ":h" opt; do
    case $opt in
    h  )  display_help
        exit 0 ;;
    \? )  display_help
        exit 1 ;;
    esac
done
shift $(($OPTIND - 1))

# Define a function for returning a process id
function get_pid_by_name()
{
    local process_str

echo "Searching process $1..."
    process_str=`ps aux | grep "$1" | tr --squeeze-repeats '[:blank:]+' '\t' | cut -f 2`
    if [ -n "$process_str" ]; then
        # The process for grep appears in the second field
        process_str=`echo $process_str | cut -s -d ' ' -f 1`
        if [ -n "$process_str" ]; then
            temp_pid=$process_str
            echo "The process id is $temp_pid!"
        else
            echo "The process $1 cannot be found, perfect!"
        fi
    else
        echo "The process $1 cannot be found, perfect!"
    fi
}

# Start execute the command
if [ $OSTYPE = 'linux-gnu' ] && [ `hostname` = "QuantumHome" ]; then
    if [ -z "$1" ]; then
    echo "$error_prefix Please specify the recording and watching mode: watch|nowatch|onlywatch"
    exit 0
    fi

if [ "$1" != "onlywatch" ] && [ -z "$2" ]; then
    echo "$error_prefix Please provide the video file name to be saved!"
    exit 0
    fi

# Declare the pid as integers
    declare -i temp_pid=-1 mplayer_pid=-1 mencoder_pid=-1 tee_pid=-1

get_pid_by_name mencoder
    mencoder_pid=$temp_pid
    temp_pid=-1

get_pid_by_name tee
    tee_pid=$temp_pid
    temp_pid=-1

get_pid_by_name mplayer
    mplayer_pid=$temp_pid
    temp_pid=-1

if [ $(($mencoder_pid!=-1 && $mplayer_pid!=-1 && $tee_pid!=-1)) = 1 ]; then
    echo "$error_prefix A tv recording or watching activity is now working, please exit it first!"
    exit 0
    fi

# Create FIFO named pipe
    if [ ! -e "/tmp/tv.fifo" ]; then
    echo "$state_prefix FIFO does not exist, now being created..."
    mkfifo /tmp/tv.fifo && echo "$state_prefix Creating FIFO successful!"
    fi

# Start tee and mplayer
    case "$1" in
    watch ) echo "$state_prefix Start recording tv and watch it using mplayer..."
                # Note: sudo must be used in order to make mplayer appear
                cat /tmp/tv.fifo | tee -a "${2%.avi}.avi" | sudo -u orlando DISPLAY=:0.0 mplayer -cache 51200 -framedrop -ao sdl -vo xv - & ;;
    nowatch ) echo "$state_prefix Start recording tv without watching it..."
                  cat /tmp/tv.fifo | tee -a "${2%.avi}.avi" & ;;
    onlywatch ) echo "$state_prefix Start watching tv without recording it..."
                    # Note: "tee -a -" will not work here
                    cat /tmp/tv.fifo | tee | sudo -u orlando DISPLAY=:0.0 mplayer -cache 51200 -framedrop -ao sdl -vo xv - & ;;
    * ) echo "$error_prefix Please specify the recording and watching mode: watch|nowatch|onlywatch"
            exit 0;
    esac

# Start mencoder to feed the video stream into FIFO
    echo "$state_prefix Now start mencoder to capture tv..."
    mencoder tv:// -tv driver=v4l2:device=/dev/video0:norm=PAL:alsa:adevice=hw.2,0:amode=1:audiorate=48000:forceaudio:volume=100:immediatemode=0:normid=8:input=1:buffersize=1024:width=768:height=576:outfmt=i420 -oac mp3lame -lameopts fast:preset=standard -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=1800 -o /tmp/tv.fifo
else
    echo "$warning_prefix Operating system or host name is not supported!"
fi

该脚本程序中,mencoder的参数较为复杂,这里对其解释如下:

driver=v4l2:使用video for linux驱动;

device=/dev/video0:视频卡设备节点。只有当驱动安装正确后,才会出现该节点;

norm=PAL:指定模拟电视制式,中国为PAL;

alsa:从ALSA捕获音频;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15884.html