Samplegrabberを動作するAVI/MPEGファイルが周とWMV
-
27-09-2019 - |
質問
を使用している最新バージョンの WPFMediaKit.思いが書サンプルアプリケーションでの利用のsamplegrabberを捉え、ビデオフレームの動画ファイルいいし、個々のビットマップ.
それでは、私たちが取り組んでいたので運良く以下のコードを構築する場合、レンダリングマグラフで表示します。しかし、その結果が、先ほど任天堂さんのコードで再生。wmvビデオファイルの場合、samplegrabberを付属で再生途切れるや周.だいてわかりやすく解説しているようになっていますがを追加しますsamplegrabberをフィルターを動作させることができます。再ードを動作させることができ、samplegrabberを正しくAVI/MPEG等
protected virtual void OpenSource()
{
FrameCount = 0;
/* Make sure we clean up any remaining mess */
FreeResources();
if (m_sourceUri == null)
return;
string fileSource = m_sourceUri.OriginalString;
if (string.IsNullOrEmpty(fileSource))
return;
try
{
/* Creates the GraphBuilder COM object */
m_graph = new FilterGraphNoThread() as IGraphBuilder;
if (m_graph == null)
throw new Exception("Could not create a graph");
/* Add our prefered audio renderer */
InsertAudioRenderer(AudioRenderer);
var filterGraph = m_graph as IFilterGraph2;
if (filterGraph == null)
throw new Exception("Could not QueryInterface for the IFilterGraph2");
IBaseFilter renderer = CreateVideoMixingRenderer9(m_graph, 1);
IBaseFilter sourceFilter;
/* Have DirectShow find the correct source filter for the Uri */
var hr = filterGraph.AddSourceFilter(fileSource, fileSource, out sourceFilter);
DsError.ThrowExceptionForHR(hr);
/* We will want to enum all the pins on the source filter */
IEnumPins pinEnum;
hr = sourceFilter.EnumPins(out pinEnum);
DsError.ThrowExceptionForHR(hr);
IntPtr fetched = IntPtr.Zero;
IPin[] pins = { null };
/* Counter for how many pins successfully rendered */
int pinsRendered = 0;
m_sampleGrabber = (ISampleGrabber)new SampleGrabber();
SetupSampleGrabber(m_sampleGrabber);
hr = m_graph.AddFilter(m_sampleGrabber as IBaseFilter, "SampleGrabber");
DsError.ThrowExceptionForHR(hr);
/* Loop over each pin of the source filter */
while (pinEnum.Next(pins.Length, pins, fetched) == 0)
{
if (filterGraph.RenderEx(pins[0],
AMRenderExFlags.RenderToExistingRenderers,
IntPtr.Zero) >= 0)
pinsRendered++;
Marshal.ReleaseComObject(pins[0]);
}
Marshal.ReleaseComObject(pinEnum);
Marshal.ReleaseComObject(sourceFilter);
if (pinsRendered == 0)
throw new Exception("Could not render any streams from the source Uri");
/* Configure the graph in the base class */
SetupFilterGraph(m_graph);
HasVideo = true;
/* Sets the NaturalVideoWidth/Height */
//SetNativePixelSizes(renderer);
}
catch (Exception ex)
{
/* This exection will happen usually if the media does
* not exist or could not open due to not having the
* proper filters installed */
FreeResources();
/* Fire our failed event */
InvokeMediaFailed(new MediaFailedEventArgs(ex.Message, ex));
}
InvokeMediaOpened();
}
と:
private void SetupSampleGrabber(ISampleGrabber sampleGrabber)
{
FrameCount = 0;
var mediaType = new AMMediaType
{
majorType = MediaType.Video,
subType = MediaSubType.RGB24,
formatType = FormatType.VideoInfo
};
int hr = sampleGrabber.SetMediaType(mediaType);
DsUtils.FreeAMMediaType(mediaType);
DsError.ThrowExceptionForHR(hr);
hr = sampleGrabber.SetCallback(this, 0);
DsError.ThrowExceptionForHR(hr);
}
だったのは数え上げればきりがないと言ってた。wmvいます。asfフォーマットは非同期であります。試みたに挿入すWMAsfReaderをデコードする作品だが、VMR9を与えているので同じ行動です。これにより、今まで以上に頂いても正しく動作しきいてわかりやすく解説している IBaseFilter renderer = CreateVideoMixingRenderer9(m_graph, 1);
ラインとして filterGraph.Render(pins[0]);
--ここまで描画し、Activemovieウィドウの代わりに私の制御が、samplegrabberを機能で正確なスキッピング。うにしようと考えていバグを修正はVMR9/samplegrabbingどこかということです。
さい私は新しいです。
解決
一部のデコーダを使用ハードウェア高速を使用DXVA.このメソッドの実装では、交渉、一部復号化された形式で、これに合格すると、一部復号化されたデータのレンダリングを完全に復号化および描画する場合に挿入するサンプルなボタンに設定されRGB24のデコーダのレンダリング、ハードウェアを無効にす加速を可能にします。
がんは世界の問題です。の詳細につきましては少し漠然とんどで動作をご利用の場合のデフォルトVMR-7が失敗したときに使用VMR-9.したものではないでしょうかこのデコーダを利用することにしたのだろうdxvaが、vmr-9の場合には、合理的なソフトウェアのみバックアップにも通用するvmr-7.
私は知らないのWPFMediaKitがってくださいというふうに思って最も単純な解決への明示的なvmr-9創明vmr-7。である場合、デコーダの作ソフトウェアだけでvmr-7を使用し、その中に固定ウィンドウのウィンドウreparentingます。
他のヒント
私が投稿したコード(エレミヤモリルのWPFMediakitソースコードから私によってかなり恥知らずにわずかに変更されたコードが実際には、.WMVファイルをレンダリングしてサンプルをつかむのに適していました。
Choppinessは、VSデバッガー、またはVS2008自体を実行することと関係があるようです。視覚エディターでしばらくXAMLをいじり、アプリを実行した後、この途切れ途切れの動作が導入されます。 vs2008をシャットダウンすると、それを改善するようです。 :p
したがって、それほど答えではありませんが、少なくとも(迷惑な - VS2008を再起動する)が、それが現れたときに修正します。