ワンセグTS 続々

できたー(一応)

コメントもらって、やっぱりm3u8が違うんだろうなあと、親子のplaylist作ってみたけど、結果は変わらず。
いや、そもそもまっとうなやり方でやってみようとffmpeg+segmenterを試してみたけど、理由は良く分からないけどsegmenterがうまく読んでくれない。

さて詰んでしまい、どっかにm3u8のサンプルがないかと探したところ、どうやらこうなるのが正しいっぽい。

#EXTM3U
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5,
stream.php/out/173900/384460.ts
#EXTINF:5,
stream.php/out/384460/596900.ts
#EXTINF:5,
stream.php/out/596900/808964.ts
#EXTINF:5,
stream.php/out/808964/1021780.ts
#EXT-X-ENDLIST
  • EXT-X-MEDIA-SEQUENCEを追加(良く分からん)
  • ブツ切れのそれぞれに、EXTINFを追加
  • ブツ切れのそれぞれを、URLじゃなくて、相対パスのファイル名っぽく記述

というわけで、これで無事に(?)再生できるようになった。。。が。
5秒ごとの切れ目は感じなかった。結構先読みしてくれてる感じ。音声はわりとまとも。だがしかーし、映像が崩れまくり。
根拠なしの直感的には、ファイルの切れ目がTOTなので、chunkの頭からPAT-PMTが現れるまでのvideo streamを捨ててるんじゃないかしら。もしかしたらそれに加えて、ちゃんとGOPなところで切らないとダメなのかしら。

【追加】
継ぎ目で捨てられるところが多いんだったら、TOTを1個ずつ間引いて、10秒ごとにすればどうだ、と思って、

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
stream.php/out/173900/596900.ts
#EXTINF:10,
stream.php/out/596900/1021780.ts
#EXT-X-ENDLIST

としてみた。(上は例で、実際に使っているファイルは2分くらいのもの、chunkは12個ある)
結果。。。おぉ、結構ごまかせるぞ。
家の中でWiFiだとこれで十分かも。。3G経由はさすがにつらいなあ。でも想定される状況は、暇な電車の中で観る(しかも事前にdownloadしておくのが面倒)ということなので、3Gなのだけど。

ワンセグTS 続

VLCで観れるワンセグのみTSができたところで、次。
このout.tsから、TOTのfposをダンプ。先頭がfpos、後ろはTOTの内容。

173900  Wed Oct  6 02:59:33 2010
384460  Wed Oct  6 02:59:38 2010
596900  Wed Oct  6 02:59:43 2010
808964  Wed Oct  6 02:59:48 2010
1021780 Wed Oct  6 02:59:53 2010

これを加工して、こんな感じのout.m3u8を作成。

#EXTM3U
#EXT-X-TARGETDURATION:5
#EXTINF:5,
http://foobar/live/stream.php/out/173900/384460.ts
http://foobar/live/stream.php/out/384460/596900.ts
http://foobar/live/stream.php/out/596900/808964.ts
http://foobar/live/stream.php/out/808964/1021780.ts
#EXT-X-ENDLIST

httpd.confか.htaccessに、こんな設定。

AddType application/x-mpegURL .m3u8

続いて、stream.phpを作成する。PATH_INFOで「ワンセグTSのbasename」「開始fpos」「終了fpos」を拾って、指定ファイルの指定範囲を返すもの。

<?php

$param = split("[/\.]", $_SERVER["PATH_INFO"]);
$f = $param[1] . ".ts";
$s = $param[2];
$n = $param[3];

$len = $n - $s;

header('Content-Type: video/MP2T');
$v = file_get_contents($f, NULL, NULL, $s, $len);
print $v;
?>

最後に、こんなtest.htmlを作成。

<html>
<body>
<video width='320' height='180' src="out.m3u8" />
</body>
</html>

これら、out.ts、out.m3u8、stream.php、test.htmlを、http://foobar/live で見えるところに置いて、準備完了。

さて、iPhoneでtest.htmlを開いてみる。。。ぐはぁ。ダメだ。

  • test.htmlを読み込むと同時に、out.m3u8を何度もリクエストしてくる
192.168.0.1 - - [16/Apr/2011:13:27:39 +0900] "GET /live/test.html HTTP/1.1" 200 156 "-" "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5"
192.168.0.1 - - [16/Apr/2011:13:27:39 +0900] "GET /live/out.m3u8 HTTP/1.1" 304 - "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 304 - "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:27:40 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
  • video画面をタップすると、さらに何度もリクエストしてきた
192.168.0.1 - - [16/Apr/2011:13:28:15 +0900] "GET /live/out.m3u8 HTTP/1.1" 200 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:15 +0900] "GET /live/out.m3u8 HTTP/1.1" 304 - "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:15 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:15 +0900] "GET /live/out.m3u8 HTTP/1.1" 200 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:16 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:16 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:16 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 2 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
192.168.0.1 - - [16/Apr/2011:13:28:16 +0900] "GET /live/out.m3u8 HTTP/1.1" 206 1395 "-" "AppleCoreMedia/1.0.0.8C148 (iPhone; U; CPU OS 4_2_1 like Mac OS X; ja_jp)"
  • ところがvideo本体が1度もリクエストされない
  • そのうち、「このムービーは再生できません。」のダイアログが。。。

out.tsを読んで怒られるならともかく、そこまで行ってない。m3u8のファイルの書き方がおかしい?