それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

らじる★らじるをlibrtmpで取得する。C言語でプログラム書いた

radikool が落ちまくる

わたしはat コマンド + python で録音できるので 問題ないのですが、家族がradikool で録音したのですが・・・radikool不安定すぎて苦情が俺のところに来る。

radikoolのソースコード落ちてないかなと思ったら作者さんはソースコード公開してない模様。てか作者you ってもしかしてヤツか。。。ヤツだ奴に違いない。

radiko を予約録音できるexeでもつくろう

radikoolが動かない程度で、電話かかってきては私もツライ。もう面倒だから録音できるEXEをつくろうと思う。

Windowsradikoを録音するには、netFramework でアレコレやらなくちゃいけないんだけど。

  • ffmpeg でmp3/m4a に変換
    • rtmpdump でストリーム取得
  • curl で番組表XML取得
  • curl で認証クリア
  • タイムテーブル作成

が必要なんだけど、、とりあえず、rtmpdumpのlibrtmp を動かしてストリーム取得してみることにした。

GUI作る前に、とりあえず、ライブラリを作っておかないと。。。

librtmp を使って らじる★らじる NHK FMをストリーム

librtmp を使って、らじる★らじるをストリーム取得してみよう

rtmpdump を使った再生

rtmpdumpコマンドを使った再生は、次のようなコマンド一発で終わる。alias登録しても問題ないほどに単純なコマンド。

rtmpdump --rtmp "rtmpe://netradio-r1-flash.nhk.jp" \
         --playpath 'NetRadio_R1_flash@63346' \
         --app "live" \
         -W http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf \
         --live \
         | mplayer -

今回は、rtmpdumpに引数を与えて起動している部分をlibrtmpを使って、C言語で書いてみることにした。

2015-03-25 追記 注意 rtmpdump のバージョン

OSXでrtmpdump はバージョンでらじる★らじる再生失敗するので、再生できない時は、Macのhomebrew を見直す

brew uninstall rtmpdump
brew install --HEAD rtmpdump

ソースコードの実行方法。

ファイルのコンパイル

gcc main.c -lrtmp -o radiru_nhk_fm

ライブラリパスに、librtmp がない場合は、適当にインストールしておく。

聴取はコレ。

作ったコマンドはSTDOUTにバイナリを出すだけなので、聴取するにはmplayer のSTDINに渡す。

./radiru_nhk_fm | mplayer - 

これで、うん、動いた。3時間ほどかかったけど、librtmp を使うことが出来た。

ソースコード

main.c

librtmp を使う手順

  RTMP_Init(&rtmp);
  RTMP_SetupURL(&rtmp, url);
  RTMP_SetupStream(&rtmp, protocol, &hostname, port, &sockshost, &playpath,
       &tcUrl, &swfUrl, &pageUrl, &app, &auth, &swfHash, swfSize,
       &flashVer, &subscribepath, &usherToken, dSeek, dStopOffset, bLiveStream, timeout);
  RTMP_SetBufferMS(&rtmp, bufferTime);
  RTMP_Connect(&rtmp, NULL);

この順番で呼び出す。 RTMP_ConnectStream は使わなくてもいいみたい。

AVal はこの構造で定義される。

AVal  = { "文字列", "長さ" }

RTMP_ParseURL で、url を解析してくれるけど、app 名は手作業だった。

RTMP_HashSWFはなんでいるかわからないけど、なんか必要みたい。

正しく接続できたか確認するには

RTMP_IsConnected(&rtmp)

を使えば取得できる。RTMP_IsConnected(&rtmp)が TRUEを返すまで頑張る。

次は、librtmp を使ってRadikoを再生してみよう。