らじる★らじるも録音したい

2010年当時、radikoではNHKのラジオ番組は視聴できなかった...。当時はなぜ参加してくれないんだと嘆いていたのだが、その後、2011年にはらじる★らじるが始まっていた。radikoで録音していれば、きっとそのうち らじる★らじるでも録音したくなるはず。そうだ、rec_radiko.shと同じ基準で利用できるrec_radiru.shを作ってみよう!

二つの方式

らじる★らじるを録音するには二つの方法が公開されていた。(感謝です!)

どちらの方式を利用させて頂くか迷ったが、すでにrec_radiko.shでrtmpdumpを使っているので、rtmpdumpを利用する方法でやってみた。

rtmpdumpバージョン2.4が必要

  • radikoと違って、らじる★らじるへのアクセスは至って簡単。
  • 選局は、playpathの部分を変更するだけ。
"NetRadio_R1_flash@63346" # らじる★らじる ラジオ第1ストリーム
"NetRadio_R2_flash@63342" # らじる★らじる ラジオ第2ストリーム
"NetRadio_FM_flash@63343" # らじる★らじる NHK-FMストリーム
  • 認証不要でいきなり以下のrtmpdumpコマンドで保存される。
$ rtmpdump --rtmp "rtmpe://netradio-fm-flash.nhk.jp" \
         --playpath 'NetRadio_FM_flash@63343' \
         --app "live" \
         -W http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf \
         --live \
         -stop 30 \
         -o NHK-FM.m4a
  • ...はずなのだが、エラーでファイルに保存できない...。
  • どうやら、らじる★らじるをダウンロードするにはrtmpdump2.4が必要らしい。
  • 自分の環境のrtmpdumpは、homebrewでインストールした2.3なのであった。

ファイル形式

  • 当初、出力ファイルの拡張子は.m4aにしていたのだが、どうも自分の環境ではその拡張子ではVLCでしか視聴できない...。
  • いろいろ試してみると、拡張子を.flvに変更すると、QuickTimeXでも視聴できた。(Perianインストール済みの環境)
  • QuickTimeXで表示されるフォーマットは、MPEG-4 HE AAC 48000 Hz、ステレオ(L R)となっている。
  • 適当に.flvとしてよいのか迷ったが、自分の環境では.flvで都合良く視聴できるので、rtmpdumpの出力オプションも.flvを使うことにした。

iTunesHE-AAC v2サポート

  • ところで、.flvのままではiTunesでは視聴できない...。
  • でも、.flvというコンテナ(入れ物)から中にあるオーディオファイルを無劣化でそのまま取り出すことはできる。
$ ffmpeg -i NHK-FM.flv -acodec copy NHK-FM.m4a
  • そうか、そうか、これはらじる★らじるだから、radikoとは違ってiTunesで再生可能な形式を使ってくれているのかもしれない。
  • そう思って、今度はradikoのflvから同じようにffmpegでオーディオファイルを取り出してみた。
$ ffmpeg -i J-WAVE_20130120-1700.flv -acodec copy J-WAVE_20130120-1700.m4a
  • 同じようにダブルクリックしてみると、やはりiTunesが起動し、ライブラリに取り込まれ、あっさり再生されてしまった!

素晴らしい!最新のiTunesは、radikoHE-AAC v2に対応していたのだ!

    • iPad 2 - 技術仕様
    • 上記はiPad2の技術仕様だが、オーディオ再生「対応するオーディオフォーマット:HE-AAC(V1およびV2)」とある。
    • iPad2が対応していれば、きっとそれを管理するiTunesも対応しているはずだと予測した。

m4a変換処理の追加

  • というわけで、過去の苦労はあっさり過去のものとなり、最新の環境ではm4aに変換すれば当然のように聴ける、という幸せが訪れた。
  • これは同時に変換処理も絡めたくなる。
  • 変換といっても、flvというコンテナ(入れ物)の中からオーディオファイルをそのまま取り出すだけなので、無劣化かつ一瞬である。
$ rtmpdump --rtmp "rtmpe://netradio-fm-flash.nhk.jp" \
         --playpath 'NetRadio_FM_flash@63343' \
         --app "live" \
         -W http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf \
         --live \
         -stop 30 \
         -o NHK-FM.flv
$ ffmpeg -i NHK-FM.flv -acodec copy NHK-FM.m4a
$ rm -f NHK-FM.flv
  • m4aに変換してしまったら、元のflvは削除してしまう。(無劣化で取り出したオーディオファイルのはずだから)

rec_radiru.shにまとめる

  • らじる★らじるを録音するのは苦労最小限に簡単だけど、これをrec_radiko.shと同じ基準で使えるようにしておくことが大事。
  • メインの処理はたった3コマンドなのだけど、rec_radiko.shと同じ操作性を追加するために、rec_radiru.shは以下のようになった。
#!/bin/sh
# Original: http://qiita.com/items/549b42c8b361807d96a2
# Original: https://gist.github.com/1185755 saiten / radiru.txt

# Install: rtmpdump2.4 http://trick77.com/downloads/ 

# 使い方
show_usage() {
  echo "Usage: $COMMAND [-o output_path] [-t recording_seconds] NHK-R1 | NHK-R2 | NHK-FM"
  echo '       -o  Default output_path = $HOME/Downloads/${station_name}_`date +%Y%m%d-%H%M`.flv' 1>&2
  echo '             a/b/c/ = $HOME/Downloads/a/b/c/NHK-FM_20130123-1700.flv' 1>&2
  echo '             a/b/c  = $HOME/Downloads/a/b/c.flv' 1>&2
  echo '            /a/b/c/ = /a/b/c/NHK-FM_20130123-1700.flv' 1>&2
  echo '            /a/b/c  = /a/b/c.flv' 1>&2
  echo '           ./a/b/c/ = ./a/b/c/NHK-FM_20130123-1700.flv' 1>&2
  echo '           ./a/b/c  = ./a/b/c.flv' 1>&2
  echo '       -t  Default recording_seconds = 30' 1>&2
  echo '           60 = 1 minute, 3600 = 1 hour, 0 = go on recording until stopped(control-C)' 1>&2
}

# 引数解析
COMMAND=`basename $0`
while getopts ho:t: OPTION
do
  case $OPTION in
    o ) OPTION_o="TRUE" ; VALUE_o="$OPTARG" ;;
    t ) OPTION_t="TRUE" ; VALUE_t="$OPTARG" ;;
    * ) show_usage ; exit 1 ;;
  esac
done

shift $(($OPTIND - 1)) #残りの非オプションな引数のみが、$@に設定される

if [ $# = 0 ]; then
  show_usage ; exit 1
fi

# オプション処理
if [ "$OPTION_o" = "TRUE" ]; then
  if echo $VALUE_o|grep -q -v -e '^./\|^/'; then
    mkdir -p $HOME/Downloads ; cd $HOME/Downloads
  fi
  fname_ext="${VALUE_o##*/}"
  fname="${fname_ext%.*}"
  fext="${fname_ext#$fname}"
  wdir="${VALUE_o%/*}"; [ "$fname_ext" = "$wdir" ] && wdir=""
fi

if [ "$OPTION_t" = "TRUE" ]; then
  rectime=$VALUE_t
fi

mkdir -p ${wdir:=$HOME/Downloads} ; cd $wdir ; wdir=`pwd`
output="${wdir}/${fname:=$1_`date +%Y%m%d-%H%M`}${fext:=.flv}"

PLAYPATH[NHK-R1]="NetRadio_R1_flash@63346" # らじる★らじる ラジオ第1ストリーム
PLAYPATH[NHK-R2]="NetRadio_R2_flash@63342" # らじる★らじる ラジオ第2ストリーム
PLAYPATH[NHK-FM]="NetRadio_FM_flash@63343" # らじる★らじる NHK-FMストリーム

echo "==== recording ===="
echo "save as '$output'"
/usr/local/bin/rtmpdump \
         --rtmp "rtmpe://netradio-${1##*-}-flash.nhk.jp" \
         --playpath "${PLAYPATH[$1]}" \
         --app "live" \
         -W http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf \
         --live \
         --stop "${rectime:=30}" \
         -o "${output}"

ffmpeg -v quiet -y -i "${output}" -acodec copy "${output%.*}.m4a"
rm -f "${output}"


これでrec_radiko.shとrec_radiru.shはほぼ同じ操作性になった!

$ ./rec_radiru.sh -h
Usage: rec_radiru5.sh [-o output_path] [-t recording_seconds] NHK-R1 | NHK-R2 | NHK-FM
       -o  Default output_path = $HOME/Downloads/${station_name}_`date +%Y%m%d-%H%M`.flv
             a/b/c/ = $HOME/Downloads/a/b/c/NHK-FM_20130123-1700.flv
             a/b/c  = $HOME/Downloads/a/b/c.flv
            /a/b/c/ = /a/b/c/NHK-FM_20130123-1700.flv
            /a/b/c  = /a/b/c.flv
           ./a/b/c/ = ./a/b/c/NHK-FM_20130123-1700.flv
           ./a/b/c  = ./a/b/c.flv
       -t  Default recording_seconds = 30
           60 = 1 minute, 3600 = 1 hour, 0 = go on recording until stopped(control-C)

$ ./rec_radiru.sh -o radiru/ -t 10 NHK-FM
==== recording ====
save as '/Users/zari/Downloads/radiru/NHK-FM_20130125-0517.flv'
RTMPDump 2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: No application or playpath in URL!
Connecting ...
WARNING: HandShake: Type mismatch: client sent 6, server answered 9
INFO: Connected...
Starting Live Stream
For duration: 10.000 sec
INFO: Metadata:
INFO:   audiodatarate         48.00
INFO:   audiocodecid          mp4a
63.113 kB / 9.98 sec
Download complete