玩式草子─ソフトウェアとたわむれる日々

第95回 「らじる☆らじる」をHLS経由で

この記事を読むのに必要な時間:およそ 6 分

当初,今回は前回の続きでFail2banの話題を取りあげるつもりでしたが,今月の頭からNHKのネットラジオ「らじる☆らじる」の配信形式が変更され,本連載で以前紹介したスクリプトでは録音できなくなったので,急遽そのための対応方法を紹介することにしました。

本連載ではNHKのインターネットラジオ「らじる☆らじる」をLinuxで録音する話題を何度か取りあげてきました。⁠らじる☆らじる」はNHKのラジオ番組をインターネットで同時配信する仕組みで,2011年にMMSとRTMPの2種類で配信が初まりました。

MMS(Microsoft Media Server)は映像や音楽のストリーミング用にMicrosoft社が開発したプロトコル,RTMP(Real Time Messaging Protocol)はMacromedia(現Adobe)社がフラッシュビデオ用に開発したプロトコルです。

これを受け,当初はMMS配信をmplayerで録音するようなスクリプトを紹介しそのスクリプトを中心に予約録音するようなツール類を作りました。

「らじる☆らじる」の開始当時はWindows Media Playerで利用できるMMSの方が広く使われていたものの,マイクロソフト社によるMMSの開発は終了していたこともあり,配信方法の軸足は次第にRTMPの方に移動し,2015年の9月にはMMS配信が終了しました。そのため本連載でも,録音用スクリプトをrtmpdumpを使うように変更する話題を紹介しました。

それから2年経った今年の9月,今度はRTMP形式による配信が終了して,HLS(HTTP Live Stream)形式に変更され,rtmpdumpを使っていたスクリプトでは録音できなくなりました。そこで今回は,ffmpegを使ってHLS形式に対応することにしました。

RTMPからHLSへの移行

前節でも触れたように,RTMPはMacromedia社がフラッシュビデオのストリーミング配信用に開発した独自プロトコルで,2000年代初期のストリーミング配信に広く用いられていました。

Macromedia社は2005年にAdobe社によって買収され,フラッシュビデオやRTMPの開発はAdobe社に引き継がれました。

RTMPは独自プロトコルを利用しているため,ブラウザから直接利用することはできません。そこで開発されたのがFlashPlayerプラグインです。

FlashPlayerには,動画再生機能だけでなく,ゲームやインタラクティブにやりとりするページを作るためのさまざまな機能が詰め込まれており,そのような高機能性が災いして,それら機能のセキュリティホールを悪用するマルウェアがしばしば流行しました。加えて,インターネットの中心がデスクトップPCからスマホ等のモバイルデバイスに移行するにつれ,メモリや電池を浪費しがちなFlashPlayerは敬遠されるようになりました。

加えて,新しく策定されたHTML5の仕様では,FlashPlayerが提供していた機能の多くが仕様の中に取り込まれ,ブラウザと標準化されたプロトコルのみで動画再生やリッチコンテンツを提供できるようになり,FlashPlayerの必要性は低くなりました。

そのような環境変化を踏まえ,Adobe社自身,2020年でFlashPlayerのサポート終了を宣言しています。今回,⁠らじる☆らじる」がRTMP配信を終了したのも,そのような状況を踏まえてのことでしょう。

一方,新しく採用されたHLS(HTTP Live Streaming)は,Apple社が開発したストリーミング配信用のプロトコルで,動画や音声のデータを10秒程度の塊に分割し,それらをHTTP経由で順番に転送することでストリーミング再生を実現しています。

HLSの場合,その名の通り,データをやりとりするのはHTTPで,RTMPのように専用のサーバやクライアントを用意する必要はなく,標準的なWeb環境のみでストリーミング再生ができることもマルチデバイス対応が求められる「らじる☆らじる」には魅力的だったのでしょう。

実のところ,HLSへの移行は今年の9月になって急に行なわれたわけではなく,1年ほど前から始まったカルチャーラジオ等の過去の番組を配信する「ストリーミング配信」はHLS形式になっていました。最近ではこの機能が「聞き逃し番組」の再視聴として範囲を広げ,多くの番組が放送終了後一ヶ月程度の間HLS形式でストリーミング配信されており,⁠らじる☆らじる」のHLS化もその流れの一部と考えた方がよさそうです。

HLSについて

さて,それではこのHLS形式についてもう少し詳しく見て行きましょう。前節で触れたように,HLSでは動画ファイルを10秒程度の塊に分割し,それらを順に送信することでストリーミング配信を実現しています。このような処理を実現するには,分割された動画ファイルを順序正しく送受信することが重要になります。

「複数の動画ファイルを指定した順に連続して再生する」という処理は,各種メディアプレイヤーが利用している「プレイリスト」と同じだし,同じ形式にしておけばメディアプレイヤーがHLS形式に対応するのも簡単だろう,HLSの開発者たちはこう考えて,分割したデータの再生順をM3Uと呼ばれるプレイリストのフォーマットで記述することにしました。

M3U形式を採用することで,メディアプレイヤーの側にとっても,⁠指定されたURLから得たファイルがプレイリストだった場合,そのプレイリストに記述された順番に分割された動画ファイルを入手,再生する」という処理を追加するだけでストリーミング再生に対応できることになります。

少し先回りになりますが,HLS形式のNHK FM(東京)の配信元は⁠https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8なので,まずはこのファイルをwgetで取り寄せてみましょう。なお,このファイルの拡張子は"m3u8"となっていますが,これは「M3U形式のファイルの中身をUTF-8で記述している」ことを意味します。もっとも,⁠らじる☆らじる」の場合は以下に見る通りファイルの中身には英数字しか使っていないため,文字コードの種類による影響はありません。

$ wget https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8
 --2017-09-27 08:21:09--  https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8
Resolving nhkradioakfm-i.akamaihd.net... 61.213.189.240, 61.213.189.250
Connecting to nhkradioakfm-i.akamaihd.net|61.213.189.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 965 [application/x-mpegURL]
Saving to: ‘1-fm-01.m3u8’

1-fm-01.m3u8             100%[================================>]     965  --.-KB/s    in 0s         
2017-09-27 08:21:09 (138 MB/s) - ‘1-fm-01.m3u8’ saved [965/965]

このファイルの中身は以下の通り,再生すべき動画ファイルが順番に並んでいるだけです。

$ cat 1-fm-01.m3u8 
#EXTM3U
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:222425
#EXTINF:10,
1-fm-20170831T143716-01-111/425.ts
#EXTINF:10,
1-fm-20170831T143716-01-111/426.ts
#EXTINF:10,
1-fm-20170831T143716-01-111/427.ts
#EXTINF:10,
1-fm-20170831T143716-01-111/428.ts
....

ここで指定されている "425.ts" 等のファイルは,それぞれが10秒ごとに分割された動画ファイル(⁠らじる☆らじる」の場合は音声のみですが)で,MPEG2 TS(Transport Stream)という形式になっています。試しに,そのうちの1つのファイルだけをダウンロードしてみます。

$ wget https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-20170831T143716-01-111/439.ts
--2017-09-27 08:26:42--  https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-20170831T143716-01-111/439.ts
Resolving nhkradioakfm-i.akamaihd.net... 61.213.189.240, 61.213.189.250
Connecting to nhkradioakfm-i.akamaihd.net|61.213.189.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 87232 (85K) [video/MP2T]
Saving to: ‘439.ts’

439.ts                   100%[================================>]  85.19K  --.-KB/s    in 0.007s    
2017-09-27 08:26:42 (12.4 MB/s) - ‘439.ts’ saved [87232/87232]

このファイルは,86KBほどのMPEG TSファイルです。

$ ls -lh 439.ts 
-rw-r--r--+ 1 kojima users 86K  9月 27日  08:26 439.ts
$ file 439.ts
439.ts: MPEG transport stream data

このファイルのみをsmplayerで再生することも可能で,ファイルのプロパティを表示させると「10秒の長さでAAC形式の音声を持つ動画ファイル」なことがわかります。

図1 ダウンロードしたデータの断片1つを再生

図1 ダウンロードしたデータの断片1つを再生

一方,先に紹介したM3UファイルのURLを直接指定してsmplayerを起動すると,smplayerは指定されたURLがプレイリストであると判断して,その記述に従って分割されたファイルを次々とダウンロードし,再生してくれます。

$ smplayer https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-kojima'
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-kojima'
Debug: global_init
...
Debug: BaseGui::open: 'https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8'
Debug: Core::open: 'https://nhkradioakfm-i.akamaihd.net/hls/live/512290/1-fm/1-fm-01.m3u8'
...
Debug: Core::startMplayer: checking if stream is a playlist
Debug: Core::startMplayer: url path: '/hls/live/512290/1-fm/1-fm-01.m3u8'
Debug: Core::startMplayer: url_is_playlist: 1
Debug: Core::startMplayer: URL extension: "m3u8"
Debug: InfoReader::setPlayerBin: mplayerbin: "/usr/bin/mpv"
...

図2 M3UファイルのURLを指定したストリーミング再生

図2 M3UファイルのURLを指定したストリーミング再生

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入