2017-03-15 15 views
1

現在、問題なしでhttpバイト範囲要求をサポートしているいくつかのサーバー側コードがあります。しかし、トランスコードされたチャンクをクライアントに送信する前に、オンザフライでオンザフライでオンザフライでビデオファイルをトランスコードできるようにしたいのですが、ffmpegにはシーク時間を与えなければなりませんクライアントからの範囲です。クライアントブラウザからのバイト範囲を考慮して、ビデオファイルの時間範囲(シーク時間)をどのように把握できるでしょうか?バイト範囲と時間範囲をhtmlで変換する<video>

私は既にthis questionを見ていますが、サーバーはすでに指定された時間を知っていると仮定しています。

私はバイト範囲の代わりにデータを要求する時間範囲の使用をサポートするhtml5ビデオプレーヤーを使用していますが、実装を見つけたり、バッファリングのJavaScript側がどのように動作しているかを把握することはできません。<video>

+0

「offset」と「end_offset」を使ってビデオを取得する(https://ffmpeg.org/ffmpeg-protocols.html#http) – Mulvya

+0

これらのオプションは、ffmpegで直接HTTPストリーミングを行う場合にのみ表示されます。私はffmpegを使ってトランスコードするだけです。 – fengshaun

+0

それらに「要求範囲」を追加したコミット。 – Mulvya

答えて

1

ffprobeを実行し、その出力を分析してタイムスタンプを識別できます。

基本コマンドこれは

0.000000|48|K_ 
0.133333|956|__ 
0.066667|996|__ 
0.033333|1053|__ 
0.100000|1602|__ 
0.266667|1811|__ 
0.200000|2371|__ 
0.166667|2746|__ 
0.233333|3294|__ 
.... 

最初の列は、ビデオフレームのタイムスタンプで生成

ffprobe -i in.mp4 -show_entries packet=pos,pts_time,flags -select_streams v -of compact=p=0:nk=1 -v 0 

あり、第2は、そのフレームのバイトオフセットであり、3番目のフレームであるかどうかでありますキーフレーム。

あなただけのキーフレームでビデオを切ることができるので、ストリームをコピーするとき、あなたはそのフラグKであるか、以下のコマンドで引数を使用したタイムスタンプで切断する必要があります次のいずれか

ffmpeg -ss X -i in.mp4 -c copy -avoid_negative_ts make_zero out.mp4 

これではありませんビデオストリームをトランスコードする場合に必要です。