我一直在使用最新版本的 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-7创作更换明确VMR-9创建。也就是说,如果该解码器工作的软件只与VMR-7,然后使用该和上固定窗口重排根目录问题浓缩物。

其他提示

它结束了我已发布的代码(这本身是相当无耻轻微我从耶利米莫里尔的WPFMediakit源代码修改),其实是足以使.wmv文件,并抓住样本。

看来抖动现象有事情做与通过与调试运行,或VS2008本身。与XAML乱搞了,而在可视化编辑器,然后运行该应用程序后,我都会有这样的震荡行为出台。关闭VS2008似乎补救。 :P

所以没有太多的答案,但至少一个(烦人 - 重启VS2008)。修复时,它最多作物

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top