それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

プレイリストのファイル形式を色々試してみる。

プレイリスト扱えると便利

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 は iOSSafariと同じになる。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 でもm3u8動作チェックはできる*1

ただしポッドキャストとして扱われるのに、ポッドキャストではなくミュージック一覧にでてきた

itunes に追加する方法

ストリームを開く

f:id:takuya_1st:20170330022721p:plain:w200

URLを入力する

f:id:takuya_1st:20170330022726p:plain:w200

プレイリストに出てくる

f:id:takuya_1st:20170330022730p:plain:w200

結論

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だから?