らじる★らじるの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
が正しいです。
修正してお詫び申し上げます。

らじる★らじるのHLS形式ストリーミングを録音する” への17件のフィードバック

  1. 聞きながら、 録音できると嬉しいのですが、、、
    tee.exe とかを使って、 できないでしょうか???

    1. windowsを使用しているなら最新のmplayer.exeを使用して仮想オーディオデバイスなどに出力し録音した方が簡単だと思います。mplayer.exeにm3u8のURLを指定するだけです。残念ながらffmpeg.exeで標準出力する方法はあまり聞いた事がありません。

  2. ありがとうございます。
    >mplayer.exeにm3u8のURLを指定するだけです。
    具体的に(例)を お示しいただけませんか?

    1. mplayer.exe -cache 128(などのキャッシュ数) -ao dsound:device=1 “https://nhkradioakr1-i.akamaihd.net/hls/live/(局のURL).m3u8″ mplayer.exeの使い方は「radiko.jpをデバイスを指定して再生する」を検索して参考にしてください。

  3. こちらのコメ欄だと削除はできるかと思いますが
    荒らしみたいになりかねないので何か連絡手段あればご提示下さい
    捨てメールアドレスやチャットルームなど探してみたのですが
    相談に最適な手段が思い浮かびません

    1. ここでいいですよ。そんなにコメント無いですし。
      『/t:時間’) の使い方が誤っています。』
      の’)が気になるのですが実際に表示されてるのしょうか?

  4. echo onにして実行すると以下のような感じで表示されます

    RajiruRec.bat FM 0:01:00 NHKTEST
    ~中略~
    >rem 録音時間を秒に変換
    /t:23:15:16′) の使い方が誤っています。

      1. /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というふうに)

        1. 本当は/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%
          を加えてください

          1. ファイル名でもエラーが出てしまうようです…
            \rec\17/0/1(譛・001948_JOBK-FM_NHKTEST(3).ts: No such file or directory
            こういうエラーが出ることも
            \Time.vbs(32, 2) Microsoft VBScript 実行時エラー: 型が一致しません。: ‘DateValue’

          2. ファイル名は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%を加えても出ますか?
            同じ環境が無いので決定的な返事が出来なくてすいません

        2. もしかしてfor文の中じゃ不都合があるかもしれません。その場合は)の次の行で試してください

          1. 単純計算でデフォルトのset YMD=以降の数値最初の%yyyymmdd:
            3つずつをマイナス2ずつしたところとりあえず動いたようです
            まだちょっととりあえず動いた段階なので細かい検証(RajiruRec.vbs時代と同じファイル名にする)などもう少しやろうと思いますが流石にもう遅いので今日のところはここまでにしたいと思います
            あとちょっと気になるのは回線切断されたわけでなく録音終了できているようなのですがMP3ファイルも出力されてしまってます
            (recフォルダにmp3。oldフォルダにmp4が出力される)

            すごく単純で初歩的なことだったようでお恥ずかしい…
            無駄足掻きしてレスしたのが遅くなってしまったために
            結局遅くまでお付き合い頂くことになり本当に申し訳ありませんでした

          2. MP3変換はrecフォルダにあるファイルを全部変換します。録音終了が速い?のはちょっと情報まだが足らないですね。頑張ってください。
            追記
            録音終了が速い?は読み間違えでした。すいません

  5. はじめまして。未熟なサンデープログラマーです。
    CentOS上でrtmpdumpでらじる★らじるを録音していましたが、9月5日より急に録音が不能となり、あわててGoogleで検索したところ、こちらのサイトにたどりつきました。
    らじる★らじるのHLS配信のダウンロードの仕方がわからなかったのですが、おかけ様でffmpegで指定のm3u8をダウンロードするスクリプトに変更し、翌日から無事復帰いたしました。
    とても独力では解決できない問題でしたが、こちらのサイトの記事に助けていただき、感謝いたします。
    「少しのことにも先達はあらまほしきことなり」という言葉を実感いたしました。
    今度は聞き逃しのダウンロードにもチャレンジしてみようと思います。
    いずれご相談することもあるかと思いますが、よろしくお願い申し上げます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)