2011/04/10

ubuntuでアレをホゲするためのメモ

やばいかもしれないので、伏せ字で書く。
(追記 2012/10/27)
2012/10/25あたりからradik○の仕様が変わったので、修正。



まずは必要なコンポーネントのインストール。
% sudo apt-get install subversion git-core checkinstall
そして rtmpdump のソース取得からコンパイル・インストール。
% sudo apt-get install libssl-dev
(追記 2012/10/27)
ubuntu 11.10では rtmpdump は普通に apt-get でインストールできる。
% sudo apt-get install rtmpdump
次に swftools のソース取得からコンパイル・インストール。
(追記 2012/10/27)
swftoolsのパッケージの中にxpdf-3.02が含まれるようになった。
ちなみに2012/04/21でバージョンが0.9.2になった。
% sudo apt-get install libfreetype6-dev libgif-dev libjpeg62-dev
% git clone git://git.swftools.org/swftools
% cd swftools/lib/pdf
% perl inject-xpdf.pl xpdf-3.02.tar.gz
% cd ../..
% ./configure
% make
% sudo checkinstall --pkgname "swftools" --pkgversion "0.9.2.git`date +%T%m%d`" --backup=no --default

次に ubuntu を AirVideoServer にする。
(追記 2012/10/27)
AirVideoServerはWindowsマシンでしちゃえばいいやと、最近はやってない。
なので、以下は古い情報。
ffmpegはapt-getでとってこれるものを使っている。

まずは AirVideoServer 用の ffmpeg のソース取得、コンパイル、インストール
% sudo add-apt-repository ppa:stemp
% sudo apt-get update
% sudo apt-get install libmp3lame-dev libfaac-dev libfaad-dev libx264-dev libxvidcore-dev lame faac faad mpeg4ip-server
/etc/apt/sources.list の partner の項目のチェックを外す
% sudo apt-get update
% sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-bin sun-java6-fonts
% wget http://www.inmethod.com/air-video/download/ffmpeg-for-2.2.5.tar.bz2
% tar jxvf ffmpeg-for-2.2.5.tar.bz2
% cd ffmpeg
% ./configure --enable-pthreads --disable-shared --enable-static --enable-gpl --enable-libx264 --enable-libmp3lame --enable-libfaad --disable-decoder=aac --enable-nonfree --enable-postproc --enable-libfaac --enable-libxvid
% make
% sudo checkinstall --pkgname "ffmpeg-airvideo" --pkgversion "2.2.5" --backup=no --default
% cd ..
次に AirVideoServer 本体と設定ファイルの取得。
% wget http://inmethod.com/air-video/download/linux/alpha5/AirVideoServerLinux.jar
% wget http://inmethod.com/air-video/download/linux/alpha1/test.properties
ちなみに AirVideServerLinux の最新情報はここのフォーラムに出るらしい。要チェック。
次に test.properties の path.ffmpeg, path.mp4creator, path.faac を編集する。
folders は Name:Path,Name:Path という書式で書けばよい。
次に Bonjour の設定。
/etc/avahi/serverces/airvideo.service というファイルを以下の用に新規作成する。
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
  <type>_airvideoserver._tcp</type>
  <port>45631</port>
</service>
</service-group>
これで以下のコマンドを打てば AirVideoServer が立ち上がり、iPhone の AirVideo クライアントから Bonjour でアクセスできる。
% java -jar AirVideoServerLinux.jar test.properties
最後に AirVideoServer がブート時に立ち上がるようにする。
/opt/AirVideServer ディレクトリを作り、その下に AirVideoServerLinux.jar と test.properties を置く。
そして以下を /etc/init/airvideo.conf として作成。
start on runlevel [2345]
stop on shutdown
respawn
exec sudo -H -n -u [yourname] env LANG=ja_JP.UTF-8 /usr/bin/java -jar /opt/AirVideoServer/AirVideoServerLinux.jar /opt/AirVideoServer/test.properties

いよいよradik○の録音。
/path/to/workdir/rec_radik○.sh
#!/bin/sh
if [ $# -eq 3 ]; then
  OUTFILEPREFIX=$1
  RECTIMEMIN=$2
  CHANNEL=$3
else
  echo "usage : $0 OUTFILEPREFIX RECTIMEMIN CHANNEL"
  exit 1
fi
OUTFILEPREFIX=$1
RECTIMEMIN=$2
CHANNEL=$3
#以下のパスは各自環境に合わせて!
RTMPDUMP=/usr/bin/rtmpdump
FFMPEG=/usr/bin/ffmpeg
OUTFILEBASEPATH=/path/to/workdir
OUTFILENAME=${OUTFILEBASEPATH}/${OUTFILEPREFIX}_`date +%Y%m%d`
FLVFILEEXT=".flv"
MP3FILEEXT=".mp3"
MARGINTIMEMIN=1
RECTIME=`expr ${RECTIMEMIN} \* 60 + ${MARGINTIMEMIN} \* 2 \* 60`
cd ${OUTFILEBASEPATH}
playerurl=http://radik○.jp/player/swf/player_3.0.0.01.swf
playerfile=${OUTFILEBASEPATH}/player.swf
keyfile=${OUTFILEBASEPATH}/authkey.png
#
# get player
#
if [ ! -f $playerfile ]; then
  /usr/bin/wget -q -O $playerfile $playerurl
  if [ $? -ne 0 ]; then
    echo "failed get player"
    exit 1
  fi
fi
#
# get keydata (need swftools)
#
if [ ! -f $keyfile ]; then
  /usr/local/bin/swfextract -b 14 $playerfile -o $keyfile
  if [ ! -f $keyfile ]; then
    echo "failed get keydata"
    exit 1
  fi
fi
if [ -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
  rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL}
fi
#
# access auth1_fms
#
/usr/bin/wget -q \
     --header="pragma: no-cache" \
     --header="X-Radik○-App: pc_1" \
     --header="X-Radik○-App-Version: 2.0.1" \
     --header="X-Radik○-User: test-stream" \
     --header="X-Radik○-Device: pc" \
     --post-data='\r\n' \
     --no-check-certificate \
     --save-headers \
     --tries=5 \
     --timeout=5 \
     -O auth1_fms_${OUTFILEPREFIX}_${CHANNEL} \
     https://radik○.jp/v2/api/auth1_fms
if [ $? -ne 0 ]; then
  echo "failed auth1 process"
  exit 1
fi
#
# get partial key
#
authtoken=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radik○-authtoken: ([\w-]+)/i)'`
offset=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radik○-keyoffset: (\d+)/i)'`
length=`cat auth1_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/x-radik○-keylength: (\d+)/i)'`
partialkey=`dd if=$keyfile bs=1 skip=${offset} count=${length} 2> /dev/null | base64`
echo "authtoken: ${authtoken} \noffset: ${offset} length: ${length} \npartialkey: $partialkey"
rm -f auth1_fms_${OUTFILEPREFIX}_${CHANNEL}
if [ -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
  rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL}
fi
#
# access auth2_fms
#
/usr/bin/wget -q \
     --header="pragma: no-cache" \
     --header="X-Radik○-App: pc_1" \
     --header="X-Radik○-App-Version: 2.0.1" \
     --header="X-Radik○-User: test-stream" \
     --header="X-Radik○-Device: pc" \
     --header="X-Radik○-Authtoken: ${authtoken}" \
     --header="X-Radik○-Partialkey: ${partialkey}" \
     --post-data='\r\n' \
     --no-check-certificate \
     --tries=5 \
     --timeout=5 \
     -O auth2_fms_${OUTFILEPREFIX}_${CHANNEL} \
     https://radik○.jp/v2/api/auth2_fms
if [ $? -ne 0 -o ! -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL} ]; then
  echo "failed auth2 process"
  exit 1
fi
echo "authentication success"
areaid=`cat auth2_fms_${OUTFILEPREFIX}_${CHANNEL} | perl -ne 'print $1 if(/^([^,]+),/i)'`
echo "areaid: $areaid"
rm -f auth2_fms_${OUTFILEPREFIX}_${CHANNEL}
#
# rtmpdump
#
RETRYCOUNT=0
while :
do
 ${RTMPDUMP} -v \
              -r "rtmpe://w-radik○.smartstream.ne.jp" \
              --playpath "simul-stream.stream" \
              --app "${CHANNEL}/_definst_" \
              -W $playerurl \
              -C S:"" -C S:"" -C S:"" -C S:$authtoken \
              --live \
              --flv ${OUTFILENAME}${FLVFILEEXT} \
              --stop ${RECTIME}
  if [ $? -ne 1 -o `wc -c ${OUTFILENAME}${FLVFILEEXT} | awk '{print $1}'` -ge 10240 ]; then
    break
  elif [ ${RETRYCOUNT} -ge 5 ]; then
    echo "failed rtmpdump"
    exit 1
  else
    RETRYCOUNT=`expr ${RETRYCOUNT} + 1`
  fi
done
${FFMPEG} -y -i "${OUTFILENAME}${FLVFILEEXT}" -ar 44100 -ac 1 -ab 64k -vn -acodec libmp3lame "${OUTFILENAME}${MP3FILEEXT}"
rm -f ${OUTFILENAME}${FLVFILEEXT}
そしてこんなかんじで crontab を作る。 /path/to/workdir/rec_radik○.crontab
59 0 * * 5 /path/to/script/rec_radik○.sh 99_ANN 120 LFR > /dev/null 2>&1
59 0 * * 0 /path/to/script/rec_radik○.sh OD_ANN 120 LFR > /dev/null 2>&1
59 0 * * 6 /path/to/script/rec_radik○.sh BNN_JUNK 120 TBS > /dev/null 2>&1
59 0 * * 0 /path/to/script/rec_radik○.sh ELK_JUNK 120 TBS > /dev/null 2>&1
後は以下のコマンドを打てば良い。
% crontab rec_radik○.crontab

0 件のコメント:

コメントを投稿