Beispiel #1
0
        /// <summary>
        /// Builds a recording graph that saves the incoming H264 stream to an Ogg container to add
        /// support for seeking.
        /// </summary>
        /// <param name="filename">file to record to</param>
        /// <remarks>
        /// Since this recording graph does not recompress or decompress any data, it performs its job
        /// with little overhead.
        /// </remarks>
        protected void CreateRecordingGraph(string filename)
        {
            lock (instanceMutex)
            {
                //create file recording graph
                _fileSinkGraphBuilder        = (IGraphBuilder) new FilterGraph();
                _fileSinkCaptureGraphBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
                _fileSinkMediaControl        = (IMediaControl)_fileSinkGraphBuilder;

                //attach filter graph to capture graph, for recording
                int hr = _fileSinkCaptureGraphBuilder.SetFiltergraph(_fileSinkGraphBuilder);
                DsError.ThrowExceptionForHR(hr);

                //add bridge source to the recording graph, linked to the bridge sink
                _bridgeSource = (IBaseFilter)_bridgeController.InsertSourceFilter(_bridgeSink, _fileSinkGraphBuilder);

                _muxer = AddFilterByName(_fileSinkGraphBuilder, FilterCategory.LegacyAmFilterCategory, "LEAD MPEG2 Multiplexer (2.0)");
                //add the File Writer
                _fileSink       = AddFilterByName(_fileSinkGraphBuilder, FilterCategory.LegacyAmFilterCategory, "File writer");
                _fileSinkFilter = (IFileSinkFilter)_fileSink;
                hr = _fileSinkFilter.SetFileName(filename, null);
                DsError.ThrowExceptionForHR(hr);
                ConnectFilters(_fileSinkGraphBuilder, _bridgeSource, "Output 1", _muxer, "Input 01", true);
                ConnectFilters(_fileSinkGraphBuilder, _muxer, "Output 01", _fileSink, "in", false);
            }
        }
Beispiel #2
0
        public void SetNextFilename(string pFile)
        {
            VerifyAccess();

            int hr;

            ICaptureGraphBuilder2 pBuilder = null;
            IBaseFilter           pfMux    = null;
            IFileSinkFilter       pSink    = null;

            if (pFile != null)
            {
                if (m_captureDevice != null)
                {
                    ReleaseFilenameMembers();

                    m_pCaptureGraph = (IGraphBuilder) new FilterGraph();
                    try
                    {
                        //m_rot2 = new DsROTEntry(m_pCaptureGraph);

                        // Use the bridge to add the sourcefilter to the graph
                        hr = m_pBridge.InsertSourceFilter(m_pSourceGraphSinkFilter, m_pCaptureGraph, out m_pCaptureGraphSourceFilter);
                        DsError.ThrowExceptionForHR(hr);

                        // use capture graph builder to create mux/writer stage
                        pBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

                        hr = pBuilder.SetFiltergraph(m_pCaptureGraph);
                        DsError.ThrowExceptionForHR(hr);

                        // create the mux/writer
                        hr = pBuilder.SetOutputFileName(MediaSubType.Avi, pFile, out pfMux, out pSink);
                        DsError.ThrowExceptionForHR(hr);

                        //IConfigAsfWriter lConfig = pfMux as IConfigAsfWriter;

                        //Guid cat = new Guid("7A747920-2449-4D76-99CB-FDB0C90484D4");


                        //hr = lConfig.ConfigureFilterUsingProfileGuid(cat);
                        //Marshal.ThrowExceptionForHR(hr);


                        // render source output to mux
                        hr = pBuilder.RenderStream(null, null, m_pCaptureGraphSourceFilter, null, pfMux);
                        DsError.ThrowExceptionForHR(hr);

                        // Store the file name for later use
                        FileName = pFile;
                    }
                    catch
                    {
                        FreeResources();
                    }
                    finally
                    {
                        if (pBuilder != null)
                        {
                            Marshal.ReleaseComObject(pBuilder);
                        }

                        if (pfMux != null)
                        {
                            Marshal.ReleaseComObject(pfMux);
                        }

                        if (pSink != null)
                        {
                            Marshal.ReleaseComObject(pSink);
                        }
                    }
                }
                else
                {
                    throw new Exception("Device not selected");
                }
            }
            else
            {
                throw new Exception("Invalid parameter");
            }
        }
        SetNextFilename(string pFile)
        {
            int hr;

            ICaptureGraphBuilder2 pBuilder = null;
            IBaseFilter           pfMux    = null;
            IFileSinkFilter       pSink    = null;

            if (pFile != null)
            {
                if (m_DeviceSelected)
                {
                    ReleaseFilenameMembers();

                    m_pCaptureGraph = (IGraphBuilder) new FilterGraph();
                    try
                    {
                        m_rot2 = new DsROTEntry(m_pCaptureGraph);

                        // Use the bridge to add the sourcefilter to the graph
                        hr = m_pBridge.InsertSourceFilter(m_pSourceGraphSinkFilter, m_pCaptureGraph, out m_pCaptureGraphSourceFilter);
                        DsError.ThrowExceptionForHR(hr);

                        // use capture graph builder to create mux/writer stage
                        pBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

                        hr = pBuilder.SetFiltergraph(m_pCaptureGraph);
                        DsError.ThrowExceptionForHR(hr);

                        // create the mux/writer
                        hr = pBuilder.SetOutputFileName(MediaSubType.Avi, pFile, out pfMux, out pSink);
                        DsError.ThrowExceptionForHR(hr);

                        // render source output to mux
                        hr = pBuilder.RenderStream(null, null, m_pCaptureGraphSourceFilter, null, pfMux);
                        DsError.ThrowExceptionForHR(hr);

                        // Store the file name for later use
                        m_strFile = pFile;
                    }
                    catch
                    {
                        ReleaseFilenameMembers();
                    }
                    finally
                    {
                        if (pBuilder != null)
                        {
                            Marshal.ReleaseComObject(pBuilder);
                        }

                        if (pfMux != null)
                        {
                            Marshal.ReleaseComObject(pfMux);
                        }

                        if (pSink != null)
                        {
                            Marshal.ReleaseComObject(pSink);
                        }
                    }
                }
                else
                {
                    throw new Exception("Device not selected");
                }
            }
            else
            {
                throw new Exception("Invalid parameter");
            }
        }