0

私はいくつかの非常に大きなビデオファイル(多くの場合最大16MP)で処理を行っていますが、これらのビデオを特定のフレーム(ffmpegのように時間ではなく)をシークできる形式で保存する方法が必要です。個別にzlibで圧縮されたすべてのフレームを連結し、フレーム番号をファイルのバイトインデックスにリンクするインデックスを最後に追加する独自のフォーマットをローリングすることを計画していました。ただし、これについて説明する前に、別のフォーマット/ライブラリの機能を複製していないことを確認したかっただけです。ビデオのロスレス圧縮とランダムアクセスを可能にするフォーマット/ライブラリについて聞いたことがありますか?

4

2 に答える 2

0

一部の形式では、1秒あたりのキーフレーム数を変更できます。

たとえば、ffmpegを使用して毎秒25フレームでflvにエンコードし、毎秒25キーフレームを使用してから、キーフレームへの移動に問題のないプレーヤーを使用しました。基本的に、これによりフレームごとのシークが可能になりました。

また、前回クイックタイムをチェックしたときは、各フレームをキーフレームにすることなく、フレームごとにシークを実行できます。

あなたには当てはまらないかもしれませんが、それは私の考えです。

于 2010-04-15T17:28:00.513 に答える
0

ほとんどのビデオコーデックで特定のフレームを探すのが難しい理由は、ほとんどのフレームが別のフレームに依存しているため、フレームをグループとしてデコードする必要があるためです。このため、ほとんどのライブラリでは、最も近いIフレーム(フレーム内-独立してデコード可能なフレーム)のみを検索できます。非Iフレームから実際に画像を生成するには、他のフレームからのデータが必要であるため、フレームに相当する数のデータをデコードする必要があります。

この問題が解決されたのを私が見た唯一の方法は、ファイルにある種のインデックスを作成することです。つまり、ファイルをパススルーし、ファイルの特定の時間またはセクションに対応するフレームのインデックスを作成します。ほとんどのライブラリのシーク機能はIフレームのみをシークできるため、最も近いIフレームをシークしてから、そこから目的のフレームにデコードする必要がある場合があります。

スペースがそれほど重要でない場合は、あなたが言うようにそれを行うことをお勧めしますが、画像データを扱っているという事実を利用するため、圧縮率がはるかに高くなるため、zlibの代わりにJPEG圧縮を使用してください。

スペースが問題になる場合は、Pフレーム(前のフレームに依存)によってファイルのサイズを大幅に減らすことができます。私はBフレーム(以前と将来のフレーム/フレームに依存します)を台無しにしないでしょう。なぜなら、それらは物事を正しくするのをはるかに難しくするからです。

私は過去にffmpeg(libavformat)を使用してビデオをパケット(パケットあたり1フレーム相当のデータ)にデマックスし、これらを1つのファイルに連結することにより、BフレームとPフレームの存在下で特定のフレームを探す問題を解決しました。重要なことは、特定のフレームのパケット境界を見つけることができるように、そのファイルを保持してインデックスを作成することです。フレームがIフレームの場合は、そのフレームのデータをffmpegデコーダーにフィードするだけで、デコードできます。フレームがBまたはPフレームの場合は、最後のIフレームに戻って、そこから前方にデコードする必要があります。特にBフレームの場合、表示方法とは異なる順序で送信されることが多いため、これを正しく行うのは非常に難しい場合があります。

于 2010-04-15T17:45:32.540 に答える