らじる★らじるのHLS形式ストリーミングを録音する
2ちゃんねるを見てた所9月以降のらじる★らじるの配信形式が変更され一部地域の放送がHLS形式ストリーミングに変更になっている事を知った。東京地区の放送ばかり聞いていたので気づかなかった。そこで急ぎ対応した。まだ数分しか試してないのでバグがあったら後日記事にしたい。
らじる★らじるの視聴ページに移動する。
画面を広げてF12を押してネットワークモニターを見る。
再生するとリストがずらずら出てくるが目的はm3u8ファイルだけなので検索バーにm3u8を入れると目的のURLが出てくるので右クリックしてURLをコピーする。
https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8
このようなURLがコピーされる。
他の地域の視聴は上の地域を変更してURLを取得する
これを録音するにはffmpeg.exeが必要なのでダウンロードする。
ffmpeg.exe
http://hp.vector.co.jp/authors/VA020429/ffmpeg/ffmpeg.html
https://ffmpeg.org/
ffmpeg.exeを解凍するとffplay.exeも同梱されてるので再生してみる。再生が不要な方は飛ばして構いません
ffplay.exe "https://nhkradiobkr1-i.akamaihd.net/hls/live/512291/1-r1/1-r1-01.m3u8"
このコマンドで再生できる。
ffmpeg.exeも同様に録音できるがバッチファイルとWSHで録音できるようにした。
これ以降は以前のRajiruRecの記事の修正版です
参考にこちらのページです
http://hanpen.lsv.jp/blog.hanpen.net/%e3%82%89%e3%81%98%e3%82%8b%e2%98%85%e3%82%89%e3%81%98%e3%82%8b%e3%82%92%e3%83%90%e3%83%83%e3%83%81%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%a8wsh%e3%81%a7%e9%8c%b2%e9%9f%b3%e3%81%99%e3%82%8b/
D:\RajiruRec\にて実行する設定になっています。ここにffmpeg.exeと下記のスプリクトを置いてください。
途中で回線が切断されても時間計算して再録音し最後にmp3に変換するようになっています。
-起動例-
RajiruRec.bat R1 1:00:00 R1東京
RajiruRec.bat放送局のID 録音時間1時間 録音番組名(ファイル名に含まれます)
RajiruRec.bat
@echo off REM rtmpdumpなどの位置のドライブ set drive=D: REM rtmpdumpなどの位置(最後に\を) set DFDirectory=D:\RajiruRec\ REM 録音ファイルの保存のドライブ set argdrive=D: REM 録音ファイルの保存先(最後に\を) set argDirectory=D:\RajiruRec\rec\ set argOut = "out" %drive% cd %DFDirectory% rem 録音ファイルの保存先フォルダチェックと作成 IF NOT EXIST "%argDirectory%" (md %argDirectory%) IF NOT EXIST "%argDirectory%OLD" (md %argDirectory%OLD) set ch=%1 if "%1"=="" goto usage if not "%2"=="" set argSTOPSEC=%2 if "%2"=="" goto usage if not "%3"=="" set argOut=%3 rem 録音終了日時を求める for /f "tokens=1,2" %%i in ('CScript Time.vbs /r:%argSTOPSEC%') do ( SET AUTHTOKEN_D=%%i SET AUTHTOKEN_T=%%j ) REM NHKの連想配列 REM R1東京 if %ch%==R1 ( set aaNHK_r=https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8 ) REM R2東京 if %ch%==R2 ( set aaNHK_r=https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 ) REM FM東京 if %ch%==FM ( set aaNHK_r=https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8 ) REM R2東京 if %ch%==JOAB ( set aaNHK_r=https://nhkradioakr2-i.akamaihd.net/hls/live/511929/1-r2/1-r2-01.m3u8 ) REM R1東京 if %ch%==JOAK ( set aaNHK_r=https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8 ) REM R1仙台 if %ch%==JOHK ( set aaNHK_r=https://nhkradiohkr1-i.akamaihd.net/hls/live/512075/1-r1/1-r1-01.m3u8 ) REM R1名古屋 if %ch%==JOCK ( set aaNHK_r=https://nhkradiockr1-i.akamaihd.net/hls/live/512072/1-r1/1-r1-01.m3u8 ) REM R1大阪 if %ch%==JOBK ( set aaNHK_r=https://nhkradiobkr1-i.akamaihd.net/hls/live/512291/1-r1/1-r1-01.m3u8 ) REM R1広島 if %ch%==JOFK ( set aaNHK_r=https://netradiofkr1-i.akamaihd.net/hls/live/247615/1-r1/1-r1-01.m3u8 ) REM R1松山 if %ch%==JOZK ( set aaNHK_r=https://netradiozkr1-i.akamaihd.net/hls/live/248056/1-r1/1-r1-01.m3u8 ) REM R1福岡 if %ch%==JOLK ( set aaNHK_r=https://netradiolkr1-i.akamaihd.net/hls/live/247879/1-r1/1-r1-01.m3u8 ) REM FM東京 if %ch%==JOAK-FM ( set aaNHK_r=https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8 ) REM FM仙台 if %ch%==JOHK-FM ( set aaNHK_r=https://nhkradiohkfm-i.akamaihd.net/hls/live/512076/1-fm/1-fm-01.m3u8 ) REM FM名古屋 if %ch%==JOCK-FM ( set aaNHK_r=https://nhkradiockfm-i.akamaihd.net/hls/live/512074/1-fm/1-fm-01.m3u8 ) REM FM大阪 if %ch%==JOBK-FM ( set aaNHK_r=https://nhkradiobkfm-i.akamaihd.net/hls/live/512070/1-fm/1-fm-01.m3u8 ) REM FM福岡 if %ch%==JOLK-FM ( set aaNHK_r=https://netradiolkfm-i.akamaihd.net/hls/live/247890/1-fm/1-fm-01.m3u8 ) set loopck=0 :loop rem 録音時間を秒に変換 for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_END=%%i set STOPSEC=-t %AUTHTOKEN_END% if "%loopck%" == "0" set FLV_loop= if "%loopck%" geq "1" set FLV_loop=(%loopck%) set yyyymmdd=%date: =0% set hhmmss=%time: =0% set YMD=%yyyymmdd:~0,4%%yyyymmdd:~5,2%%yyyymmdd:~8,2%_%hhmmss:~0,2%%hhmmss:~3,2%%hhmmss:~6,2% set FLV=%YMD%_%ch%_%argOut% set RADI_PASS= REM らじる★らじるの録音パラメータ if not "%aaNHK_r%"=="" ( set RADI=%DFDirectory%ffmpeg.exe -i ""%aaNHK_r%"" %STOPSEC% -acodec copy "%argDirectory%%FLV%%FLV_loop%.ts" set RADI_PASS=1 ) if "%RADI_PASS%"=="" goto usage echo 録音開始%date%_%time%_"%~3" >> log.txt echo 「%ch%」の「%argOut%」を録音開始、録音時間は「%argSTOPSEC%」 echo %RADI% %RADI% echo 録音停止%date%_%time%_"%~3" >> log.txt for /f %%i in ('CScript Time.vbs /d:%AUTHTOKEN_D% /t:%AUTHTOKEN_T%') do SET AUTHTOKEN_EXIT=%%i if "%AUTHTOKEN_EXIT%" == "EXIT" goto loopEXIT if "%loopck%" geq "20" goto loopEXIT set /a loopck=loopck+1 REM Sleep[15秒数] set /a wtime=15*1000 echo WScript.Sleep %wtime% > tmp.vbs cscript //NoLogo tmp.vbs del tmp.vbs set wtime= REM *** goto loop :loopEXIT %argdrive% cd %argDirectory% for %%F in (*.TS) do goto FILE_EXIST echo エラーファイルが無い%date%_%time%_%argOut% >> %DFDirectory%log.txt goto end :FILE_EXIST echo MP3変換開始%date%_%time%_"%argOut%" >> %DFDirectory%log.txt REN *"%argOut%"*.ts *.m4a for %%i in (*"%argOut%"*.m4a) do %DFDirectory%ffmpeg.exe -y -i "./%%~ni.m4a" -vn -acodec libmp3lame -strict unofficial "./%%~ni.mp3" move *"%argOut%"*.m4a OLD\ >> %DFDirectory%log.txt echo MP3変換完了%date%_%time%_"%argOut%" >> %DFDirectory%log.txt goto end :usage echo "RajiruRec.bat JOAK 0:01:00 NHK深夜便" :end
録音時間計算のスプリクトです。バッチファイルで時間計算は大変なのでWSHで処理します
Time.vbs
' CScript Time.vbs /r:0:01:00 ' CScript Time.vbs /d:2016/12/14 /t:18:47:44 Option Explicit Dim argRecTime Dim value dim gRecTime dim argDay dim argTime Dim aNamed Set aNamed = WScript.Arguments.Named argRecTime = WScript.Arguments.Named.Item("r") argDay = WScript.Arguments. Named.Item("d") argTime = WScript.Arguments. Named.Item("t") if not (argRecTime = "") Then '引数で指定の録音時間を日時属性に変換 gRecTime = TimeValue(argRecTime) '録音終了日時を求める Dim gEndDate gEndDate = Now() + gRecTime WScript.Echo gEndDate End If if not (argTime = "") Then '引数で指定の録音時間を日時属性に変換 argRecTime = TimeValue(argTime) argDay = DateValue(argDay) argRecTime = argDay + argRecTime '録音秒数をrtmpdumpの引数形式(秒数)にする gRecTime = argRecTime - Now() if (gRecTime > 0) Then gRecTime = Hour(gRecTime) * 60 * 60 + Minute(gRecTime) * 60 + Second(gRecTime) + 20 '20秒ほどマージンを設けることで録音終了時の誤差でリトライにいってしまうことを防止する。 Else gRecTime ="EXIT" End If WScript.Echo gRecTime End If
タスクスケジューラを使って予約する為のバッチファイル
(schtasks.batは管理者として実行してください)
schtasks.bat
goto kome /sc 種類 スケジュールの種類を指定する。指定できる種類は次の通り。 種類 内容 MINUTE 分単位でスケジュールを指定 HOURLY 時間単位でスケジュールを指定 DAILY 日単位でスケジュールを指定 WEEKLY 週単位でスケジュールを指定 MONTHLY 月単位でスケジュールを指定 ONCE 指定した日時に一回限り実行 ONSTART システム起動ごとに実行 ONLOGON ログオンごとに実行 ONIDLE アイドル状態が一定時間続いた場合に実行 /d 日 曜日または日にちを指定する。 スケジュールの種類が「WEEKLY」、または「MONTHLY」の場合に有効。 曜日は以下のように3文字で表す。 値 内容 MON 月曜日 TUE 火曜日 WED 水曜日 THU 木曜日 FRI 金曜日 SAT 土曜日 SUN 日曜日 スケジュールの種類と指定できる値は次の通り。 WEEKLYの場合 MON~SUN、あるいは「*(毎日)」。 省略時は「/d MON」を指定したとみなされる。 MONTHLYの場合 1~31の数字。省略時は「/d 1」 を指定したとみなされる。「/mo」オプションに FIRST、SECOND、THIRD、FOURTH、LAST が指定されている場合は、必ず「/d」オプションで曜日を指定する。 SCHTASKS /CREATE /TN "NHK深夜便2315" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:47:00 NHK深夜便" /SC WEEKLY /d * /ST 23:14 SCHTASKS /CREATE /TN "NHK深夜便0005" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 00:04 SCHTASKS /CREATE /TN "NHK深夜便0105" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 01:04 SCHTASKS /CREATE /TN "NHK深夜便0205" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 02:04 SCHTASKS /CREATE /TN "NHK深夜便0305" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 03:04 SCHTASKS /CREATE /TN "NHK深夜便0405" /TR "D:\RajiruRec\RajiruRec.bat JOAK 0:57:00 NHK深夜便" /SC WEEKLY /d * /ST 04:04 SCHTASKS /CREATE /TN "NHK今日は一日アニソン三昧" /TR "D:\RajiruRec\RajiruRec.bat JOAK-FM 16:04:00 NHK今日は一日アニソン三昧" /sd 2016/04/30 /st 08:58 /sc once :kome SCHTASKS /CREATE /TN "NHKTEST" /TR "D:\RajiruRec\RajiruRec.bat JOAK-FM 0:04:00 NHKTEST" /sd 2016/04/29 /st 20:05 /sc once pause
以上実行ファイルと2つのバッチファイルと1つのvbsファイルと同じフォルダに置いて(上記の例ではD:\jcbaRec)
schtasks.batに録音したい番組を記入してタスクスケジューラに登録して実行する形になります。
タスクスケジューラにて実行するため後日動作確認する時用に実行フォルダにLOGを残す動きになっています。時々ファイルを削除してください
以前のRajiruRec.batを使用している方はffmpeg.exeとRajiruRec.batを入れ替えるだけで大丈夫です。
このスプリクトは試験的なもので要望など、いかなるサポートも行いません。 録音失敗や何らかの、いかなる損害が発生しても、苦情などを一切受け付けません。全て自己責任で利用してください。
追記
RajiruRec.batのR1東京JOAKのURLが
set aaNHK_r=aaNHK_r=https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8
と_r=aaNHKが余計に付いてました
set aaNHK_r=https://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8
が正しいです。
修正してお詫び申し上げます。
聞きながら、 録音できると嬉しいのですが、、、
tee.exe とかを使って、 できないでしょうか???
windowsを使用しているなら最新のmplayer.exeを使用して仮想オーディオデバイスなどに出力し録音した方が簡単だと思います。mplayer.exeにm3u8のURLを指定するだけです。残念ながらffmpeg.exeで標準出力する方法はあまり聞いた事がありません。
ありがとうございます。
>mplayer.exeにm3u8のURLを指定するだけです。
具体的に(例)を お示しいただけませんか?
mplayer.exe -cache 128(などのキャッシュ数) -ao dsound:device=1 “https://nhkradioakr1-i.akamaihd.net/hls/live/(局のURL).m3u8″ mplayer.exeの使い方は「radiko.jpをデバイスを指定して再生する」を検索して参考にしてください。
こちらのコメ欄だと削除はできるかと思いますが
荒らしみたいになりかねないので何か連絡手段あればご提示下さい
捨てメールアドレスやチャットルームなど探してみたのですが
相談に最適な手段が思い浮かびません
ここでいいですよ。そんなにコメント無いですし。
『/t:時間’) の使い方が誤っています。』
の’)が気になるのですが実際に表示されてるのしょうか?
echo onにして実行すると以下のような感じで表示されます
RajiruRec.bat FM 0:01:00 NHKTEST
~中略~
>rem 録音時間を秒に変換
/t:23:15:16′) の使い方が誤っています。
こちらに元ファイルを圧縮してUPしたので解凍して試してください
http://www.hanpen.net/image/RajiruRec.rar
ファイルを間違えました。開けない場合こっちをどうぞ
http://www.hanpen.net/image/RajiruRec.zip
/t:23:48:51′) の使い方が誤っています。
for /f %i in (‘CScript Time.vbs /d:17/09/10(日) /t:23:48:51’) do SET AUTHTOKEN_END=%i
以上のように表示され、特に変わりはないようです。
もしかしたら日付表示と代入まわりが怪しいのではないかという気がします
Rainmeterというソフトを使ってまして、日付や時刻をデスクトップに表示させるために
日付表示先頭二文字を表示しない設定に変更しているかもしれません
(検索してみた所デフォルト表示:2017/09のところ17/09というふうに)
本当は/t:23:15:16′) の所には録音秒時間が入るはずですがTime.vbs /d:で(日)が入って秒計算が出来てないようです。RajiruRec.batの中の
rem 録音終了日時を求める
for /f “tokens=1,2” %%i in (‘CScript Time.vbs /r:%argSTOPSEC%’) do (
SET AUTHTOKEN_D=%%i
SET AUTHTOKEN_T=%%j
)
SET AUTHTOKEN_T=%%jの次の行に
SET AUTHTOKEN_D=%AUTHTOKEN_D:~0,8%
を加えてください
ファイル名でもエラーが出てしまうようです…
\rec\17/0/1(譛・001948_JOBK-FM_NHKTEST(3).ts: No such file or directory
こういうエラーが出ることも
\Time.vbs(32, 2) Microsoft VBScript 実行時エラー: 型が一致しません。: ‘DateValue’
ファイル名はset YMD=%yyyymmdd:~0,4%%yyyymmdd:~5,2%%yyyymmdd:~8,2%_%hhmmss:~0,2%%hhmmss:~3,2%%hhmmss:~6,2%の行を変えることで対応します。
set YMD=%yyyymmdd%_%hhmmss:~0,2%%hhmmss:~3,2%%hhmmss:~6,2%
としてみてください。
Time.vbsのエラーはSET AUTHTOKEN_D=%AUTHTOKEN_D:~0,8%を加えても出ますか?
同じ環境が無いので決定的な返事が出来なくてすいません
もしかしてfor文の中じゃ不都合があるかもしれません。その場合は)の次の行で試してください
単純計算でデフォルトのset YMD=以降の数値最初の%yyyymmdd:
3つずつをマイナス2ずつしたところとりあえず動いたようです
まだちょっととりあえず動いた段階なので細かい検証(RajiruRec.vbs時代と同じファイル名にする)などもう少しやろうと思いますが流石にもう遅いので今日のところはここまでにしたいと思います
あとちょっと気になるのは回線切断されたわけでなく録音終了できているようなのですがMP3ファイルも出力されてしまってます
(recフォルダにmp3。oldフォルダにmp4が出力される)
すごく単純で初歩的なことだったようでお恥ずかしい…
無駄足掻きしてレスしたのが遅くなってしまったために
結局遅くまでお付き合い頂くことになり本当に申し訳ありませんでした
MP3変換はrecフォルダにあるファイルを全部変換します。録音終了が速い?のはちょっと情報まだが足らないですね。頑張ってください。
追記
録音終了が速い?は読み間違えでした。すいません
はじめまして。未熟なサンデープログラマーです。
CentOS上でrtmpdumpでらじる★らじるを録音していましたが、9月5日より急に録音が不能となり、あわててGoogleで検索したところ、こちらのサイトにたどりつきました。
らじる★らじるのHLS配信のダウンロードの仕方がわからなかったのですが、おかけ様でffmpegで指定のm3u8をダウンロードするスクリプトに変更し、翌日から無事復帰いたしました。
とても独力では解決できない問題でしたが、こちらのサイトの記事に助けていただき、感謝いたします。
「少しのことにも先達はあらまほしきことなり」という言葉を実感いたしました。
今度は聞き逃しのダウンロードにもチャレンジしてみようと思います。
いずれご相談することもあるかと思いますが、よろしくお願い申し上げます。