URLStreamでダウンロードしてきたflvをNetStreamで再生する方法

URLStreamでflvをダウンロードしつつ、そのバイトデータをNetStream.appendBytes()に逐一渡して再生した場合には動画のシークができなくなってしまう。なので、その現象をなんとか回避する方法を模索中。

 

回避案1:

NetStream.appendBytes()は使わずに、ダウンロードしたデータをちょこちょこファイルに書き出してそのファイルパスをNetStream.play()に渡して再生する方法

  1. URLStreamでflvをダウンロード。
  2. 程よいバイト数読みこんだところでファイルに書き出し。
  3. 書き出したファイルパスをNetStream.play()に渡して再生開始。
  4. 更に程よいところまで読みこんだら再びファイルに書き出す…が、2.で書き出したファイルに追加で書き込みたいので、ファイルのロックを解放するためにファイルを利用中のNetStreamを一旦close()する。close()前にNetStream.timeの値(現在再生中の位置(秒))を取り出しておく。
  5. NetStream.close()してFileMode.APPENDで書きこんだら、3.と同じようにNetStream.play()にファイルパスを渡して再生再開。
  6. NetStream.seek()にclose前に取りだしたNetStream.timeの値を渡して再生位置を復元。
  7. 以下flvのダウンロードが完了するまで4~6の繰り返し。

問題点:

6.でseek()するが、このときにシークが可能な位置はseek()に渡した秒数(以降?)にある最も近いキーフレームになるらしい。なので4→6の部分で再生が滑らかに繋がらない。

 

キーフレームのある秒数を取得する方法があればだいぶ滑らかに繋げられそう…。

ひとまずこの回避案は置いておいて別の方法を模索中。

コメントを残す