2016-07-08 10 views
0

DirectShow AVIMuxに2つのデータストリーム(オーディオやビデオなど)が提供され、1つのストリームが少し前に開始される場合、AVIMuxの動作を制御する方法はありますか?つまり、オーディオが開始する前にAVIMuxがいくつかのビデオフレームを取得すると、実際には出力AVIからビデオフレームが除外されます。これは、音声が最後に失われたとき、それがビデオフレームをとにかく含んでいるときとは対照的です。DirectShowのAVIMuxのトリミング動作の制御?

私のオーディオとビデオのソースはライブストリーム(私が実際に改善/コントロールできないコマーシャルキャプチャフィルタ)です。オーディオが少し後に始まっても、ビデオフレームを維持したいと思います。

これを行うには良い方法がありますか?私は、2つのフィルタを独自のグラフでカスタムフィルタにラップし、必要に応じて無音を挿入することを想像することができますが、そのすべての問題に取り組む必要はありません。

答えて

0

マルチプレクサにフレームをドロップすることに関する疑問は、間違っていると思われます。マルチプレクサは、ビデオおよびオーディオデータのタイムスタンプを調べます。 「数フレーム前...」は、タイムスタンプが負でデータがプリロールデータであることを意味し、そのデータはドロップされ、結果ファイルから除外されます。それ以外の場合は、マルチプレクサの入力上のデータの実際の順序に関係なく含まれます。それぞれのオーディオの無音は、オーディオトラックの先頭に存在します。

つまり、データが正しくタイムスタンプされ、マルチプレクサが書き込まれることを確認します。

+0

ありがとうございました。残念ながら、これは私が見ているものと一致しません。 私は、既存のaviファイルを取り込み、ビデオ/オーディオストリームに分割してから、タイムスタンプとオーディオを約100ミリ秒前にシフトする単純なグラフを作成しました。その後、これをAVIマルチプレクサで結合して書き出します。その結果、AVIファイルは小さく、6フレーム短くなります。私はこのプロセスを繰り返し、毎回6フレームを連続的にトリミングすることができます。すべてのビデオフレームには正のタイムスタンプがあります。 私は負のタイムスタンプが落ちることにもつながる可能性があることを認識していなかったので、私はそれを見据えています。 – aggieNick02

+0

さらなる実験の後にビットを追加して明瞭にするには、オーディオを前方にシフトすると、元のサイズと同じサイズのAVIファイルになりますが、directshowやvirtualdubなどのAVIファイルを見ると、フレームはスキップされます。結果のファイルを単純なaviスプリッタとavi muxバックを使って実行すると、ファイルサイズが実際に低下することになります。 – aggieNick02

+0

マイナスのタイムスタンプについての声明も確認しました。ビデオサンプル全体の時間が負の場合、それは実際に落とされます。いずれかの部分が陽性であれば、それは保持される。私が作業しているDirectShowのソースは、実際には時間の経過とともに最初のフレームを完全に否定することがあります。したがって、これは知っていると素晴らしいです。 – aggieNick02

0

tl - 私の使用例では、最終的なAVIには表示されないフレームがshowstopperであり、AVI mux/demuxプロセスが複雑であるため、最初にフレームがドロップされることがあります。だから私は、フレームの処理を開始する前に、最初にいくつかの特別なフレーム(GUID /カウンタのペアがピクセルでコード化されていることがわかっています)を押すことで解決するでしょう。私は、AVIを書いた後、これらの特別なフレームを探して、処理が始まるフレームを特定することができます。

私が見たことはすべて、もともと私が求めていたことは事実上不可能であると信じています。ファイルサイズに基づいて、私は技術的にはビデオフレームがAVIファイルに書き込まれていると思うが、ほとんどの場合、そうではないかもしれない。

つまり、virtualdubやVLC、さらにはDirectShow AVIスプリッタなどのaviプレーヤーは、オーディオの開始前に存在するビデオフレームを無視/ドロップします。だから私はあなたがpre-audioフレームを抽出するためにいくつかの他のライブラリとAVIファイルを解析する必要があると思います。

私が気にする理由は、AVIファイル内の各フレームのエントリを持つ並列データ構造を作成し、どのデータがどのフレームに対応するのかを知る必要があるからです。 AVIからフレームをドロップすると、フレームとデータを一致させることができません。

ビデオ/オーディオキャプチャフィルタの後にカスタムトランスフォームフィルタを作成することに成功しました。これらのフィルタはタイムスタンプを見て、オーディオ開始時間が設定されビデオフレームがその時間の後になるまでビデオフレームをドロップします。次に、フィルタダウンストリームは、処理中のビデオフレームに依存することができることを知っています。欠点は、実際にはオーディオフィルタが少し遅れてサンプルを配信することです。そのため、オーディオが100msで開始するとき、250msでビデオフレームを処理するまではわかりません。つまり250msのビデオデータを落としています私はビデオフレームにオーディオが付随することを知っています。オーディオが開始してから1ビデオサンプル時間以上経過すると、別のAVIツールと違った動作をすることができます。AVIMux /スプリッタを制御しようとする私の自信が衰え始めます。

AVIMuxとAVIスプリッタは、それらを正確に制御しようとする価値がないほど複雑であるということだけを受け入れています。

関連する問題