Здравствуйте.
Что за странности такие творятся…
Сделал проигрыватель на DirectShow. Все нормально. Но вот странность есть.
Допустим я поставил видео на паузу, затем изменил позицию на середину файла.
Нажимаю проигрывать и первый кадр мне прилетает только через несколько секунд.
Но есть не дергать позицию и нажимать плей - пауза - плей… то ползунок начинает идти прям сразу после нажатия кнопки.
Вот позиция при начале проигрывания.
А вот колбэк прилетел первый через 3 сек.
Пробовал перелистывать с флагом релатив. Но там вообще даже в кадры не попадает. Хотя по логике вроде правильно делал. Разницу между текущим и новым положением задавал.
public void SetRelativePos(double NeededPos)
{
var relative = Position - NeededPos;
Task.Factory.StartNew(() => seek.SetPositions(new DsLong((long)(relative * 10000000.0)), AMSeekingSeekingFlags.RelativePositioning, new DsLong(0), DirectShowLib.AMSeekingSeekingFlags.NoPositioning));
}
Сам граф строю вот так:
internal static ICaptureGraphBuilder2 BuildGraph(CodecTypes ctp, IGraphBuilder pGraph, Func<IGraphBuilder, IBaseFilter> SourceFilterProvider, IBaseFilter pSampleGrabber, IBaseFilter pNullRenderer, ISampleGrabberCB CBObject)
{
int hr = 0;
//graph builder
ICaptureGraphBuilder2 pBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
hr = pBuilder.SetFiltergraph(pGraph);
checkHR(hr, "Can't SetFiltergraph");
IBaseFilter sourceFilter = SourceFilterProvider(pGraph);
IBaseFilter pVideoDecoder = GetVideoDecoder(ctp);
hr = pGraph.AddFilter(pVideoDecoder, "Video Decoder");
checkHR(hr, "Can't add Video Decoder to graph");
//connect Camera and Decoder
hr = pBuilder.RenderStream(null, MediaType.Video, sourceFilter, null, pVideoDecoder);
checkHR(hr, "Can't connect Source and Video Decoder");
BuildSampleGrabber(pBuilder, pGraph, pVideoDecoder, pSampleGrabber, pNullRenderer, CBObject);
return pBuilder;
}
ДЛя SourceFilterProvider такая вот функция:
internal static IBaseFilter CreateFileSource(IGraphBuilder pGraph, string srcFile)
{
int hr = 0;
//add LAV Splitter Source
IBaseFilter SplitterSource = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_LAVMediaSplitter));
hr = pGraph.AddFilter(SplitterSource, "Splitter Source");
checkHR(hr, "Can't add Splitter Source to graph");
//set source filename
IFileSourceFilter pSplitterSource_src = SplitterSource as IFileSourceFilter;
if (pSplitterSource_src == null)
{
checkHR(unchecked((int)0x80004002), "Can't get IFileSourceFilter");
}
hr = pSplitterSource_src.Load(srcFile, null);
checkHR(hr, "Can't load file");
return SplitterSource;
}
Че за фигня то??