закодированный файл avi (h.264) странного цвета - PullRequest
0 голосов
/ 25 мая 2020

Я захватываю avi-файл (h.264) с камеры, я использую xvid code c filter, когда я кодирую в graphEdit, закодированный файл воспроизводится нормально, но когда я кодирую в своей программе, закодированный avi-файл с правильной формой, но плохим цветом, кажется неправильным mediatype, я прикрепляю свой код следующим образом: Кто-нибудь может сказать мне что-то не так в моем коде?

... hr = m_FilterGraph.AddSourceFilterForMoniker (dev.Mon, null, dev .Name, вне capFilter); DsError.ThrowExceptionForHR (hr);

            IPin pRaw = null;
            IPin pSmart = null;

            // Add a splitter
            IBaseFilter iSmartTee = (IBaseFilter)new SmartTee();

            hr = m_FilterGraph.AddFilter(iSmartTee, "SmartTee");
            DsError.ThrowExceptionForHR(hr);

            // Find the find the capture pin from the video device and the
            // input pin for the splitter, and connnect them
            pRaw = DsFindPin.ByCategory(capFilter, PinCategory.Capture, 0);
            pSmart = DsFindPin.ByDirection(iSmartTee, PinDirection.Input, 0);

            hr = m_FilterGraph.Connect(pRaw, pSmart);
            DsError.ThrowExceptionForHR(hr);

            // Now set the capture and still pins (from the splitter)
            previewPin = DsFindPin.ByName(iSmartTee, "Preview");
            capturePin = DsFindPin.ByName(iSmartTee, "Capture");

            m_FilterGraph.Render(previewPin);

            x264Filter = new XVID() as IBaseFilter;
            hr = m_FilterGraph.AddFilter(x264Filter, "x264 encoder");
            DsError.ThrowExceptionForHR(hr);
            x264In = DsFindPin.ByDirection(x264Filter, PinDirection.Input, 0);
            x264Out = DsFindPin.ByDirection(x264Filter, PinDirection.Output, 0);

            aviMux = new AVIMUXFILTER() as IBaseFilter;
            hr = m_FilterGraph.AddFilter(aviMux, "avi mux");
            DsError.ThrowExceptionForHR(hr);
            aviIn = DsFindPin.ByDirection(aviMux, PinDirection.Input, 0);
            aviOut = DsFindPin.ByDirection(aviMux, PinDirection.Output, 0);

            fileWriter = new FileWriter() as IBaseFilter;
            IFileSinkFilter fileSinkFilter = fileWriter as IFileSinkFilter;
            hr = m_FilterGraph.AddFilter(fileWriter, "file writer");
            DsError.ThrowExceptionForHR(hr);
            AMMediaType media = new AMMediaType();
            media.majorType = MediaType.Stream;
            media.subType = MediaSubType.Avi;
            fileSinkFilter.SetFileName("123.avi", media);
            fileWriterIn = DsFindPin.ByDirection(fileWriter, PinDirection.Input, 0);

            hr = m_FilterGraph.Connect(capturePin, x264In);
            DsError.ThrowExceptionForHR(hr);

            hr = m_FilterGraph.Connect(x264Out, aviIn);
            DsError.ThrowExceptionForHR(hr);

            hr = m_FilterGraph.Connect(aviOut, fileWriterIn);
            DsError.ThrowExceptionForHR(hr);

            ConfigVideoWindow(hControl);

...

в функции ConfigVideoWindow, я только помещал видеоокно в окно изображений, ничего не делал с mediatype. enter image description here

...