|
なんとかDirectShowの仕様も大体理解し、プログラムを書ける段階にこぎつけましたが、最後のところで詰まってしまっています。
入力ファイル・出力ファイル・切り出し開始時刻・終了時刻から動画を切り出すメソッドとして下のようなコードを書きましたが、以下のような問題が出ています。
・開始点の入力は正常に作動するが、終了点の指定が働いていない(動画の終わりまで切り出してしまう)
・出力ファイルの頭5〜7秒分が正常に灰色になっている(正常にエンコードされていない?)
何度もたずねてしまい申し訳ありませんが、どなたかお答えいただけるとありがたいです。
private void CutMovie(string inputFilePath, string outputFilePath, double start, double end)
{
IGraphBuilder graphBuilder;
IMediaControl _mediaControl;
IMediaPosition _mediaPosition;
IMediaSeeking _mediaseek;
IBaseFilter sourceFilter;
ICaptureGraphBuilder2 capGraphBuilder;
IFileSinkFilter sinkFilter;
IBaseFilter muxFilter;
int hr;
//フィルタグラフマネージャ構築
graphBuilder = (IGraphBuilder)new FilterGraph();
_mediaControl = (IMediaControl)graphBuilder;
_mediaPosition = (IMediaPosition)graphBuilder;
_mediaseek = (IMediaSeeking)graphBuilder;
//ソースフィルタ構築
hr = graphBuilder.AddSourceFilter(inputFilePath, inputFilePath, out (IBaseFilter)sourceFilter);
DsError.ThrowExceptionForHR(hr);
//出力フィルタ構築
capGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
hr = capGraphBuilder.SetFiltergraph(graphBuilder);
DsError.ThrowExceptionForHR(hr);
Guid mediaSubType = MediaSubType.Avi;
hr = capGraphBuilder.SetOutputFileName(mediaSubType, outputFilePath, out (IBaseFilter)muxFilter, out (IFileSinkFilter)sinkFilter);
DsError.ThrowExceptionForHR(hr);
hr = capGraphBuilder.RenderStream(null, null, sourceFilter, null, muxFilter);
DsError.ThrowExceptionForHR(hr);
_mediaPosition.put_CurrentPosition(start);
_mediaPosition.put_StopTime(end);
_mediaControl.Run();
}
|