salida mostrar mac los instalar h264 formatos desfasados aparece ajustes after activar c# .net directshow h.264 dvb

c# - mostrar - no aparece h264 en after effects cc 2018



Obligando a Mpeg2Demultiplexer a usar ffdshow para renderizar H264 Digital TV Video (1)

¿Comprobó que su ffdshow está habilitado para H264 / AVC? Abra las propiedades del filtro y en la sección "Codecs", el formato H264 / AVC debe estar habilitado (también puede desactivar el decodificador Mpeg2 solo para asegurarse de que no prefiera este formato).

Otra cosa, puedes intentar usar otro demultiplexor Mpeg2. El valor predeterminado "Demultiplexor MPEG-2" no se comporta igual en diferentes entornos. Hay muchos otros filtros que pueden demoler TS y si puedes invertir algo de dinero, te recomiendo usar MainConcept o Elecard.

Pasé mucho tiempo tratando de hacer que la muestra de DirectShow de DTVViewer funcione desafortunadamente sin éxito. El formato de video de la red DVBT es H264 y descubrí que el comportamiento de IntelliConnect de IFilterGraph prefiere usar el formato de video Mpeg2.

Para aquellos que quieren ver el código, aquí está. Si no sabe nada sobre DirectShow, compartí mi experiencia con este código. Y el problema más probable se describe en los pasos 5 y 6 del tutorial.

  • El código para la función auxiliar que conecta los filtros:

    public static void UnsafeConnectFilters(IFilterGraph2 graph, IBaseFilter source, IBaseFilter dest, Func<AMMediaType, bool> sourceMediaPredicate=null, Func<AMMediaType, bool> destMediaPredicate=null) { foreach(IPin spin in IteratePinsByDirection(source, PinDirection.Output)) { if(IsConnected(spin)) continue; int fetched; AMMediaType[] sourceTypes=GetMajorType(spin, out fetched); if(fetched>0) { Guid sourceType=sourceTypes[0].majorType; try { if(sourceMediaPredicate!=null&&!sourceMediaPredicate(sourceTypes[0])) continue; foreach(IPin pin in IteratePinsByDirection(dest, PinDirection.Input)) { if(IsConnected(pin)) continue; var types=GetMajorType(pin, out fetched); try { if(fetched>0) { Guid destType=types[0].majorType; if(destMediaPredicate!=null&&!destMediaPredicate(types[0])) continue; if(sourceType==destType) { spin.Connect(pin, types[0]); return; } } else { spin.Connect(pin, sourceTypes[0]); return; } } finally { } } } finally { } } } }

Alguien sabe acerca de:

  1. ¿Cómo debo conectar el pin h264 a ffdshow?
  2. ¿Cómo debo recomendar el gráfico para usar la decodificación de video h264?
  • Tutorial y detalles

    1. Crear la grafica

      _graph = (IFilterGraph2)new FilterGraph();

    2. Estamos utilizando la red DVBT

      IBaseFilter networkProvider = (IBaseFilter) new DVBTNetworkProvider();

      ... que debe sintonizarse a 602000 kHz @ 8MHz ONID = 1 TSID = 1 SID = 6

      ITuner tuner = (ITuner) networkProvider; IDVBTuningSpace tuningspace = (IDVBTuningSpace) new DVBTuningSpace(); tuningspace.put_UniqueName("DVBT TuningSpace"); tuningspace.put_FriendlyName("DVBT TuningSpace"); tuningspace.put__NetworkType(typeof (DVBTNetworkProvider).GUID); tuningspace.put_SystemType(DVBSystemType.Terrestrial); ITuneRequest request; tuningspace.CreateTuneRequest(out request); ILocator locator = (ILocator) new DVBTLocator(); locator.put_CarrierFrequency(602000); ((IDVBTLocator) locator).put_Bandwidth(8); request.put_Locator(locator); IDVBTuneRequest dvbrequest = (IDVBTuneRequest) request; dvbrequest.put_TSID(1); dvbrequest.put_ONID(1); dvbrequest.put_SID(6); _graph.AddFilter(networkProvider, "Network Provider");

    3. Cree un demux mpeg2 para obtener secuencias de EPG / Vidoe / Audio / Texto separadas de una sola transmisión de TV

      _mpeg2Demultiplexer = (IBaseFilter) new MPEG2Demultiplexer(); _graph.AddFilter(_mpeg2Demultiplexer, "MPEG-2 Demultiplexer");

      Ahora buscamos filtros locales para BDA Source Filter, que en mi caso es IT9135 BDA Fitler

      DsDevice[] devicesOfCat = DsDevice.GetDevicesOfCat(FilterCategory.BDASourceFiltersCategory); IBaseFilter iteDeviceFilter; _graph.AddSourceFilterForMoniker( devicesOfCat[0].Mon, null, devicesOfCat[0].Name, out iteDeviceFilter);

    4. Ahora conecte los filtros: [DVBT Net. Provider]->[BDA Src Filter]->[MPEG2Demux]-> ... [DVBT Net. Provider]->[BDA Src Filter]->[MPEG2Demux]-> ...

      UnsafeConnectFilters(_graph, networkProvider, iteDeviceFilter); UnsafeConnectFilters(_graph, iteDeviceFilter, _mpeg2Demultiplexer);

      Se deben conectar dos filtros a Demux para proporcionar epg (datos de la guía de programas). Lo siento, no sé qué están haciendo específicamente :P Se encuentran en la categoría BDATransportInformationRenderersCategory . Intentamos encontrarlos por nombre y conectarlos a Demux.

      DsDevice[] dsDevices = DsDevice.GetDevicesOfCat(FilterCategory.BDATransportInformationRenderersCategory); foreach (DsDevice dsDevice in dsDevices) { IBaseFilter filter; _graph.AddSourceFilterForMoniker( dsDevice.Mon, null, dsDevice.Name, out filter); if(dsDevice.Name == "BDA MPEG2 Transport Information Filter") _bdaTIF = filter; else if(dsDevice.Name == "MPEG-2 Sections and Tables") { _mpeg2SectionsAndTables = filter; } UnsafeConnectFilters(_graph, _mpeg2Demultiplexer, filter); }

      Ahora demux está conectado a las MPEG-2 Sections and Tables BDA MPEG2 Transport Information Filter .

    5. Ahora cree el tipo de video h264 y agregue la salida de un pin de salida a demux para este tipo

      AMMediaType h264 = new AMMediaType(); h264.formatType = FormatType.VideoInfo2; h264.subType = MediaSubType.H264; h264.majorType = MediaType.Video; IPin h264pin; ((IMpeg2Demultiplexer) _mpeg2Demultiplexer).CreateOutputPin(h264, "h264", out h264pin);

      A continuación, traté de buscar el decodificador de video ffdshow que es capaz de procesar video H264 y está ubicado en la categoría de DirectShow Filters (como en GraphStudio ).

      DsDevice[] directshowfilters = DsDevice.GetDevicesOfCat(FilterCategory.LegacyAmFilterCategory); IBaseFilter ffdshow = null; foreach (DsDevice directshowfilter in directshowfilters) { if(directshowfilter.Name == "ffdshow Video Decoder") { _graph.AddSourceFilterForMoniker( directshowfilter.Mon, null, directshowfilter.Name, out ffdshow); break; } }

    6. Crear un renderizador de video para salida de video ...

      _videoRenderer = new VideoRendererDefault(); _graph.AddFilter((IBaseFilter)_videoRenderer, "Video Renderer");

      ... y audio ...

      DsDevice defaultDirectSound = DsDevice.GetDevicesOfCat(FilterCategory.AudioRendererCategory)[0]; _graph.AddSourceFilterForMoniker( defaultDirectSound.Mon, null, defaultDirectSound.Name, out _audioRender);

      Aquí traté de conectar el pin de salida h264 de demux a ffdshow. Esta llamada al método falla con AccessViolationException. No estoy seguro de cómo conectar estos dos juntos :( .

      Comentar esta línea dará como resultado un gráfico que comienza a ejecutarse, aunque en el gráfico no se muestra ningún filtro ffdshowVideoDecoder desconectado. IntelliConnect conecta la salida de video Mpeg2 a un decodificador de video disponible localmente y, como dije, no mostrará nada.

      // UnsafeConnectFilters(_graph, _mpeg2Demultiplexer, ffdshow, type => type.majorType == MediaType.Video && type.subType == MediaSubType.H264);

    7. ConnectFilters está tomado de la muestra de DTVViewer de directshowlib

      ConnectFilters();

      Me moví sintonía real aquí

      tuner.put_TuningSpace(tuningspace); tuner.put_TuneRequest(request);

    8. Comience el gráfico y desee que se muestre algún sonido o video

      int hr = (_graph as IMediaControl).Run(); DsError.ThrowExceptionForHR(hr);

    9. compruebe que el gráfico se está ejecutando ...

      FilterState pfs; hr = (_graph as IMediaControl).GetState(1000, out pfs); DsError.ThrowExceptionForHR(hr);

      y dice que el grafo se está ejecutando.