プレイリスト扱えると便利
WEBサイトに動画や音声をたくさんおいていると、再生が面倒なのでプレイリストを作って対応したい。どのアプリが、どのプレイリストに対応しているか、そもそもプレイリストのファイル形式はどのようなものがあるのだろうか。
プレイリストファイルの形式。
ブラウザやOS標準になっているなど、すぐに使えるプレイリストのファイル形式には次のようなものがある。
幾つかあるけれどVLC をメインに考えることにした。
フォーマット | ファイルの中身 | 対応アプリなど |
---|---|---|
XSPF | XML | VLC |
ASX | XML | WMP / VLC |
m3u/m3u8 | TXT | Safari/Android/iTunes |
PLS | TXT | vlc |
此の他にも類似物として podcast.xml
がある。
また、プレイリストは入れ子に出来るようになっている。
XSPF の例
拡張子は xspf
。 Contet-Typeは application/xspf+xml
<?xml version="1.0" encoding="UTF-8"?> <playlist version="1" xmlns="http://xspf.org/ns/0/"> <trackList> <track> <location>http://example.com/sample.mp4</location> <title>自分のムービー</title> </track> </trackList> </playlist>
ASX の例
拡張子は asx
。Content-Type は video/x-ms-asf
<asx version=”3.0”> <entry> <title> 自分のムービー </title> <ref href=”http://example.com/sample.mp4” /> </entry> </asx>
ASXにはASFの類似物があり、そちらはテキストファイルでPLSに近い
WindowsメディアのフォーマットはiPhoneで使えないので、今回は調査対象から外します。
m3u / m3u8
拡張子 .m3u, .m3u8
。 Content-Type application/x-mpegURL
#EXTM3U #EXTINF:-1,自分のムービー http://example.com/sample.mp4
メタデータは次の行に書くのがポイント
#EXTINF:time_duration,ムービータイトル - シリーズ名
m3u8 の中に記載するのは m3u8か TS(content-type video/MP2T)が要求される。
時間は -1
にすると指定をキャンセルできる(あとで登場します)
PLS
拡張子 pls
。 Content-type はaudio/x-scpls
[playlist] File0=http://example.com/sample.mp4 Length0=1499 File1=http://example.com/sample.mp4 Length1=1499 NumberOfEntries=2 Version=2
中身は ini ファイルと同じフォーマットだと思う
今回は iOS Safari / iTunes / VLC について
VLC は Win/Mac/iOS でほぼ動作は変わらずなんでも再生できた。
また、iTunesは m3u8 については、ポッドキャストとして取り込んでくれた。
app | xspf | m3u8 | pls |
---|---|---|---|
VLC | ◯ | ◯ | ◯ |
iOS/Safari | ✕ | △ | ✕ |
Mac/Safari | ✕ | △ | ✕ |
iTunes | ✕ | ◯ | ◯ |
m3u8 の中身にTSを入れると、HLSのストリーミングになる。Safariはこのストリーミングとして読み込むので、m3u8の中身にTS以外をいれるのは厳しい。
AppleTV は iOSのSafariと同じになる。AppleTV / iOSはm3u8のmp4未対応みたいだね
m3u8 の中身にアレコレ入れてみる
m3u の中身に、mp4 を入れた結果
app | mp4(264/aac) | mpegts(264/aac) |
---|---|---|
VLC | ◯ | ◯ |
iOS/Safari | ◯ | ◯ |
Mac/Safari | ◯ | ◯ |
iTunes | ◯ | ◯ |
此の時にチェックに使ったものは次の通り。
#EXTM3U #EXTINF:-1,自分のムービー-sample_0 https://example.com/my-movie.ts
#EXTM3U #EXTINF:60,自分のムービー-sample_0 https://example.com/my-movie.ts
再生時間には、INT秒以外を入れると動かなかった。正確に時刻を測定したら逆に動かなかったという。
再生時間には-1
を入れておくのが無難なようです。
ちなみに、h264/aacの mpegts を mp4(h264/aac)から変換するには次のようにした。
ffmpeg -i input.mp4 -acodec copy -vcodec copy -bsf:v h264_mp4toannexb -t 60 -f mpegts out
ブラウザにキャッシュを許すためには
#EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-ALLOW-CACHE:YES #EXT-X-TARGETDURATION:8 # 略... #EXT-X-ENDLIST
EXT-X-TARGETDURATIONは、各エントリを全部まとめて此のファイルが再生時間が何秒あるか
MEDIA-SEQUENCE はどこから再生を始めるかをエントリ配列の最初から
AppleTV でも再生できる。
AppleTV でruby airplay を試したら、ちゃんと再生できた。
itunes に突っ込んだとき
ただしポッドキャストとして扱われるのに、ポッドキャストではなくミュージック一覧にでてきた
itunes に追加する方法
ストリームを開く
URLを入力する
プレイリストに出てくる
結論
m3u8 は mp4 を突っ込んでも iOSで動く。mpegtsに変換するのも時間はほとんどかからない。
また、HLSにあるような細切れになTSにする必要はなかった。
ハードディスクにたまったムービーファイルを AppleTV に配信して連続再生ができるようになった。
youtubeのファイルと組み合わせれば急にCMが入って目がさめること無く連続再生ができるね。
youtubeのプレイリストがm3u8 で取り出せばいいのになぁ。
追記
iOSは m3u8 の URL に GET のパラメータを入れても無視するようでした。
なので直接ファイルを指定しないと駄目なようです。GET引数でリダイレクト仕様としたけど駄目だった。
参考資料
https://en.wikipedia.org/wiki/PLS_(file_format)
https://en.wikipedia.org/wiki/Advanced_Stream_Redirector
*1:たぶんおなじAVFoundationだから?