2013年11月18日月曜日

jsegmenterのプログラム作り直しました。

最近myLib.chunk*というライブラリをつくりました。
というのも、いままでのmyLib.packetのmpegtsの切り方が気に入らなかったからです。

今日はその説明
ffmpegでmpegtsを出力すると音声の分割がbyte量単位になります。
よって無音部や音が弱い部分があると、音声の塊の長さが長くなることがあります。
また、音声と映像のデータがきちんと同期しているわけではありません。

概念図を書いてみます。
まずは定義、映像のキーフレーム、中間フレーム、音声のフレームの3つがあります。

本来のデータは次のようになります。

ファイルに格納されるデータ
これがffmpegが出力するファイルだと次のような感じになっています。(mpegtsの場合)

いままでの僕のプログラム(myLib.packet)での分割だと、単にキーフレームの位置のみをみて、分割しているので、次のようになっていました。
キーフレームをみつけたら、時間を確認して、必要な時間分経っていたらファイルを分割するという感じ。
これだと、1つ目は音声がない映像だけ、
2つ目は音声も映像もあるけど、映像のデータよりだいぶ前の音声データがはいっている形になっています。
実際によく使うマリオのプロモ動画ははじめの方で分割後のデータが音声抜けていたりしていました。

で、今回はこうした。(myLib.chunk)

これで1つ1つの分割単位が、その単位の再生に必要な動画の1セットと対応する音声データを保持する形になっています。
なお、この概念図は時間の長さのみを考慮しているので、実際の出力ファイルのサイズは乱高下します。

プログラム
https://github.com/taktod/jsegmenter/tree/new
利用しているライブラリは
https://github.com/taktod/myLib

一応型変換できるようになったので、flvやmp4、mkvのデータからコーデックさえ合えばHLS形式のデータ分割できるようにしたいですね。
一応下地はすでにつくってあるけど。

0 件のコメント:

コメントを投稿