暇つぶし文@謎

無料アクセスカウンターofuda.cc「全世界カウント計画」

2010-03-15

[] radikoをフラッシュ無しで再生

普段ラジオ聞かないけど。

この情報はradikoの仕様変更前のものです。より新しい情報は新しい記事を参照してください。

rtmpdumpに含まれるrtmpgwを使う場合。

./rtmpgw --rtmp "rtmp://radiko.smartstream.ne.jp:1935" --playpath "simul-stream" --swfUrl "http://radiko.jp/player/player_0.0.9.swf" --pageUrl "http://radiko.jp/player/player.html#QRR" --app "QRR/_defInst_" --flashVer "LNX 10,0,45,2" --live --device 127.0.0.1 --sport 8088
mplayer http://127.0.0.1:8088

ffplay http://127.0.0.1:8088 だとRangeヘッダのせいでうまくいかない。

直接ffplayを使う場合

以下のパッチを当てる必要あり。

Index: libavformat/rtmpproto.c
===================================================================
--- libavformat/rtmpproto.c     (リビジョン 22539)
+++ libavformat/rtmpproto.c     (作業コピー)
@@ -843,7 +843,7 @@
         } else {
             char *c = strchr(p + 1, ':');
             fname = strchr(p + 1, '/');
-            if (!fname || c < fname) {
+            if (!fname || (c && c < fname)) {
                 fname = p + 1;
                 av_strlcpy(rt->app, path + 1, p - path);
             } else {

んで以下で再生可能。

./ffplay rtmp://radiko.smartstream.ne.jp:1935/QRR/_defInst_/simul-stream

直接mplayerも同様のパッチとURLでうまくいくと思う。

パッチ送ろうかと思ったけどIP制限されていない適切な例が見つけられないのと、いくつかのrtmpのurlを見るにここら辺のコードが間違ってる予感がするので仕様を調べるまで保留。


一応録音の方法も書いておくか(SEO的に考えて)。

上記パッチ当てたFFmpegなら、以下を実行するだけでおk。

./ffmpeg -i rtmp://radiko.smartstream.ne.jp:1935/QRR/_defInst_/simul-stream -acodec copy qrr.aac

ffserver使って携帯機器から聞く方法も書きたかったが、クラッシュしたり雑音しか発生しなかったりで諦めた。

名無しさん@お腹いっぱい。名無しさん@お腹いっぱい。 2010/03/18 03:33 パッチ使わせていただきましたが、mplayer で再生、保存可能になりました。ありがとうございます。

schemescheme 2010/03/18 13:16 '/'を'%2f'と置き換えてやれば(….jp:1935/QRR%2f_defInst_…)パッチなしでもOKですよ。そうやってffmplayで聴いてます。

moriyoshimoriyoshi 2010/03/18 16:31 パッチを使わせていただいています。ありがとうございます。仕様云々以前に、name との比較前に c の validity チェックをしていないというのは明白なバグなので、そのままパッチを送ってしまっていいかと思いました。

schemescheme 2010/03/18 22:02 >fnameとの比較前にcのvalidityチェックをしていない
これはバグではなくて意図的にやっていることでしょう。おかしいのはRTMPのapp pathに'/'(0x2f)を使っているRadiko側でしょうね。これではplay pathとapp pathの区切りが不明確になってしまいます。したがって、'QRR/_defInst_'がapp pathであることを示すために'/'をURL encodeしておく必要があるのです。。。

nazodanenazodane 2010/03/19 07:45 仕様書を読んだのですが、仕様書にはURLについてはほとんど書かれてないですね。さてどうしよう。
librtmpのコードを読んだところ、コロンの判定がFFmpegと異なっていました。もしlibrtmpが合ってるのであれば、変数cを消す方が良いですね。
なお、appに/を使うのは一個までなら問題ないです("appName/appInstance")。それより多く使えるかは知りませんが、多く使えるのであれば問題は避けられなさそうですね。

schemescheme 2010/03/19 10:05 >appに/を使うのは一個までなら問題ないです
rtmpdumpの様に明示的にappとplay pathを指定できる場合は問題化しないのですが、ffplayやmplayerの様に明示的に指定する方法が提供されていない場合は上記の様に問題化してしまいます。。。ですので、ffplayやmplayerにrtmpdumpと同じ様なオプションスイッチ(--app/--playpath)を用意するパッチを作成する方が本筋だとは思いますが。。。

moriyoshimoriyoshi 2010/03/20 07:08 @scheme いえ、strchr(3) の結果であるところの c が NULL であるかどうかをチェックしないのは明らかにおかしいです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証