api.ustream.tvからjsonをwgetしてgrepでchannelIDを入手し
cdngw.ustream.tvからamfをwgetしてgrepでrtmpエンドポイントURLを入手し
rtmpdumpコマンドを実行する
保存先は、channenName-unixtime.flvになる
チャンネル名は日本語でもOK
cronなどと組み合わせると定点カメラの映像を定期的に収集するといった事にも使える
wget, rtmpdump, ffmpegが無いと動かないです
update:
- 引数の数ふやした
- rtmpdumpがタイミング次第で壊れたflvを出力してしまうようなので、ffplayで再生に成功するまで再試行するようにしてみた
- h264配信をrtmpdumpするとどうしてもffplayで再生できないflvになってしまうため何回やっても失敗する。いまのところ対応できていない
ustreamdump.sh
if [ $# -ne 3 ]; then
echo "usage: ustreamdump.sh channenName recordingPath recordingSeconds"
exit 1
fi
chid=$(wget http://api.ustream.tv/json/channel/${1}/getInfo?key=yourDevKey -q -O -|grep -Po '"id":[0-9]*?,'|grep -Po '[0-9]*')
if [ ! $chid ]; then
echo "api error, channelName: ${1}"
exit 1
fi
echo $chid
rtmp=$(wget http://cdngw.ustream.tv/Viewer/getStream/1/${chid}.amf -q -O -|grep -Pao 'rtmp:\/\/[a-zA-Z].*')
if [ ! $rtmp ]; then
echo "$1 is not live"
exit 1
fi
echo $rtmp
retry=10
check=1
while [ $check -ne 0 ] ; do
rtmpdump -v -k 5 -B ${3}\
-r "${rtmp}/streams/live" -y "streams/live"\
-a "ustreamVideo`echo ${rtmp}|grep -Pao '\/[0-9].*$'`"\
-f "LNX 10,0,45,2" -o ./${2}
check=$( (ffplay ${2} -loglevel error -nodisp -autoexit > /dev/null) 2>&1 | wc -l )
retry=`expr $retry - 1`
if [ $retry -le 0 ] ; then
break
fi
done