diary/Kojima

・「らじる★らじる」をrtmpdumpで

従来、「らじる★らじる」はwmvでも提供されていたけれど、 どうやら8月末でwmv配信は終了してMacromedia Flashオンリーになったらしい。

wmvは近い将来には止まるだろうなぁ、、と思っていたので、
いよいよその時が来たか、という感じ。
一方、セキュリティがらみの問題の多さからFlashは使わないようにしよう、
という動きもあるので、これからどうなるかはよく分からないところ

一応、Linux環境でMacromedia Flashな配信を聞くための、 rtmpdumpというコマンドが開発されていて、 それを用いた「らじる★らじる」用のコードもあちこちで公開されているので、 このあたりを参考に、 radiru_rec.py なコードをイジってみた。

ざっくりといじった感じ、rtmpdump で落ちてくるMacromedia Flashは、 音声の圧縮にAACを使ってはいるものの、Flashなコンテナ(flv)に入っているので、 そのままではMP4オーディオに対応しているはずのWalkmanでは再生できなかった。

$ file 2015-09-03-17-20_音楽遊覧飛行.flv 
2015-09-03-17-20_音楽遊覧飛行.flv: Macromedia Flash Video

CODECそのものはAACなんで、ffmpeg で -acodec copy を指定して、 コンテナ形式を変更してやれば再エンコードせずに移せる感じ。

$ ffmpeg -i 2015-09-03-17-20_音楽遊覧飛行.flv -acodec copy 2015-09-03-17-20_音楽遊覧飛行.m4a
$ file 2015-09-03-17-20_音楽遊覧飛行.m4a 
2015-09-03-17-20_音楽遊覧飛行.m4a: ISO Media, Apple iTunes ALAC/AAC-LC (.M4A) Audio

コード全体はもう少し動作の確認をしてから公開するつもりだけど、 radiru_rec.py の中心部分はこんな感じにしている。

   if channel == 'r1':
       rtmp='rtmpe://netradio-r1-flash.nhk.jp'
       playpath='NetRadio_R1_flash@63346'
   elif channel == 'r2':
       rtmp='rtmpe://netradio-r2-flash.nhk.jp'
       playpath='NetRadio_R2_flash@63342'
   elif channel == 'fm':
       rtmp='rtmpe://netradio-fm-flash.nhk.jp'
       playpath='NetRadio_FM_flash@63343'
   ...
   lines = []
   lines.append("#!/bin/sh")
   lines.append("flvfile={0}/{1}.flv".format(musicdir, title))
   lines.append("m4afile={0}/{1}.m4a".format(musicdir, title))
   lines.append("(rtmpdump --rtmp {0} --playpath {1} --app \"live\" 
     --swfVfy \'http://www3.nhk.or.jp/netradio/files/swf/rtmpe.swf\' 
     --quiet --live --stop {2} -o $flvfile ) &".format(rtmp, playpath, sduration))
   lines.append("sleep 1m")
   lines.append("radiru_noa.py {0} $m4afile".format(channel))
   lines.append("sleep {0}m".format(duration))
   lines.append("ffmpeg -loglevel quiet -i \"$flvfile\" -acodec copy "$m4afile\" ")
   lines.append("")
   lines.append("/bin/rm -f \"$flvfile\"")
   lines.append("radiru_tag.py \"$m4afile\"")
   lines.append("rm -f {}".format(scriptname))
   lines.append("")
   script = "\n".join(lines)

生成したシェルスクリプトをatの時間指定で実行する、という方針は変わらないけど、 mplayerとlameを使っていたのをrtmpdumpとffmpegに変えた、って感じ。

ざっと見、mp3だと15MBくらいだった15分の語学講座が、AAC形式のm4aだと5.5MBぐらいになるので、技術の進歩はすごいなぁ、、と思うところ。

録音のプロセスはrtmpdump一つだけになったので、mplayerとlameを同時に動かすよりはトラブルが起きにくいかな、と期待している。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:42