2013年11月16日土曜日

11/16すべきこと

誰かに見られてないとダレそうなのでブログに書いてみる。

とりあえずしたいこと。
・HLSのwebvttによるトラック動作の動作確認。
・rtmpのDL→xuggle変換→ULのプログラムをとりあえず完成させてどのくらいの早さがでるか見てみたい。
・HLSのシステムを作りたい。

とりあえずこの3つやりたい。
1つ目は会社での作業がかかわってくるのでやっときたいところ。
2、3は単なる趣味。まぁ、うまく動作したら会社でつかってもいいけど。

で、1つ目だ。
iOS6の後期からHttpLiveStreamingでwebvttを使った字幕動作が対応になっています。
具体的にiOS6の状態で動作するのを確認したことがないので個人的にはiOS7から対応と見ています。

わかっていること
サンプル:http://49.212.39.17/mario/index.m3u8

■レベル1
・iOSの古いバージョンでも動作可能。ただし字幕は見れない。
・日本語等も使える。
・m3u8を複数組み合わせた状態でしか実行できない。
上記のサンプルでは、index.m3u8がsubPlaylist.m3u8とmario.m3u8を内包している形になっている。

■レベル2(つかってみてわかったこと)
・字幕トラックの時間がかぶるのはあまりよろしくない。
00:00:07.500 --> 00:00:08.500 line:100% align:left position:0%
hello

00:00:08.000 --> 00:00:08.500 line:100% align:left position:0%

こんにちは

こういう字幕をつくると、互いの字幕が干渉する。

00:00:07.500 --> 00:00:08.000 line:100% align:left position:0%
hello

00:00:08.000 --> 00:00:08.500 line:100% align:left position:0%
hello

こんにちは

こうやった方が綺麗に字幕がでる。
干渉しすぎると字幕が極端に小さくなって見えなくなったりする。

・内部m3u8でエラーが発生したら動画が止まる。(一度でもm3u8を応答した場合)
→動画が読み込めませんでした。とでて前のページに戻されます。

・黒画面のまま固まる。(初出力の前に内部でredirectとかした場合)
→アクセス権限の問題でhttpのredirect等をやっているときで内部のm3u8でredirectやってしまうと、そのredirectは実行されますが、動画ではないのでそのまま表示待ちになります。

■知りたいこと
・字幕の出現時間をmpegtsのpcrに合わせるといい感じに動作するけど、どうやら
EXT-X-DISCONTINUITYを挟んで別の動画に切り替えると時間の概念がおかしくなるらしい。
字幕側もいったん切らないとだめなのか、pcrの時間ベースではなく、経過時間で時間を出力をしないとだめなのかがわからないところ。

・mpegtsのpcrはやく1日流し続けるとデータがoverflowしてカウンターが0にもどります。
この現象が発生したときにvttの記述をどうすべきか不明な点。

このあたり知っておきたい。
調査してなにかわかったら、この記事に追記しようと思う。

さぁ、今日もがんばろう。

■で、実際にやったこと。
とりあえず、rtypeDeltaのデータをmpegts化して動作させて、別トラックとして利用しようとおもいました。
で、avconvで変換しようとおもったら、動作しない・・・
仕方ないので、vlcで変換させてみました。aacに直接できなかったので、ac3にしてみた。(ac3のmpegts作成ははじめて)
変換してみたら、いつもと違うmpegtsができました。
違う点1:patやpmtのデータのデータがちょっと違う。
左がvlc出力、右がffmpeg出力(avconv)
vlcはヘッダ + adaptationField + PATデータになってますが
ffmpegはヘッダ + PATデータ + 埋めとなってます。

違う点2:pmtデータに見慣れないdescriptorがありました。
存在したのは、RegistrationDescriptorとISO639LanguageDescriptorの2つ
とりあえず解説しているサイトを参考に読み込みできるように調整。

違う点3:始めのデータが音声のみのpmtを出力していました。
途中から音声 + 映像のpmtに変わってました。
[このあたりは、vlcが再生データを変換していることに起因している気がします。(これは想像)]
このままだと、ffmpegにまわしたときに音声しか変換に拾われませんでした。
先頭部分の音声のみの部分を削ぎ落としたファイルをつくったら、音声 + 映像のデータとffmpegにも認識されました。

で、ライブラリも書き換え。
https://github.com/taktod/myLib
きちんと動作するようにしました。

本題に入る前に分割用のtsファイルを作るのに時間かかっちゃったw

■途中経過2
その1のhttpLiveStreamingの字幕入りのときに、中途で動画データが切り替わったらどうすればよい?というのに回答がでました。
(まぁ動作させた上での実験結果ですけど)

結論としては、字幕側のm3u8にも#EXT-X-DISCONTINUITYをいれること
字幕のtimestampも始めからやり直しにすること
この2点できればいけるみたいです。

サンプル:
字幕付きのストリーム
http://49.212.39.17/m3u8/index.m3u8
字幕のストリーム(中途切り替えあり)
http://49.212.39.17/m3u8/subPlaylist.m3u8
映像のみのストリーム(中途切り替えあり)
http://49.212.39.17/m3u8/movie.m3u8
マリオのデータ
http://49.212.39.17/m3u8/mario.m3u8
rtypeのデータ
http://49.212.39.17/m3u8/rtype.m3u8

字幕のやり方:
再生する。
右下にある字幕ボタンを押してcommentを選択
シークバーを巻き戻して視聴する
すると左下に秒数カウントがでてきます。

iPadの場合はフルスクリーンにしてからやらないと字幕選択ボタンがでてきません。

端末による動作確認結果:
iOS7のiphone4S、問題なし。
Nexus7 android、映像はみれるけど、字幕は選択できず。シークしようとするとこの動画を再生できませんとでてくる。

備考:EXT-X-ENDLISTをいれると強制的に始めからにできるけど、VODではなくライブ用の動作検証なので、今回はあえていれてません。

というわけで#EXT-X-DISCONTINUITYを適当に挿入してやればよかったという落ちでした。
よかったよかった。

0 件のコメント:

コメントを投稿