2016-05-06 4 views
2

zugreifen Ich arbeite an Windows 10 und möchte auf Videostream von meinem TV-Tuner-USB-Gerät zugreifen.Wie BDA-Gerät wie USB-TV-Tuner-Karte

Zuerst habe ich versucht, Media Foundation API zu verwenden und kam nach mehreren Suchen, dass diese API TV-Tuner-Karten nicht unterstützt.

Dann habe ich auf Directshow umgeschaltet, aber das Aufzählen von Videogeräten listet nicht mein TV-Tuner-Gerät auf. Nur meine Webcam ist aufgelistet. Ich fand heraus, dass ich mit Filtern & Pins arbeiten sollte, aber es gibt keine Anleitungen für eine solche Operation.

Jede Hilfe, Beratung oder Beispiel wäre hilfreich.

Danke.

K

Antwort

1

Ich lösen das gleiche Problem dieses Wochenende :-). Ich möchte einen einfachen TV-Tuner/Player machen. Die direkte Show scheint der letzte Teil der Entwicklung zu sein, da Sie Daten vom USB-Dongle bekommen müssen.

Ich habe viel gesucht, aber wie Sie geschrieben haben, gibt es leider fast keine Reiseführer. Ich denke jedoch, Sie könnten bei MS-Seite - Microsoft TV Technologies: https://msdn.microsoft.com/en-us/library/windows/desktop/dd695086%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 beginnen und konzentrieren sich auf Unified Tuning-Modell, das zum Microsoft Unified Tuning-Modell führt, wo einige Hinweise sind, wie Sie. Jedoch prettey engmaschig über Beispiele von Code und Details ... Dies basiert auf MFC mit OLE (ich bin ziemlich neu in dieser Technologie).

Momentan arbeite ich an Tuning Spaces, leider gibt es einige Fallstricke, als Registry-Berechtigungen (das habe ich noch nicht gelöst). Später sollten Sie über Filter & Pins wissen, während Sie schreiben. Siehe https://msdn.microsoft.com/en-us/library/dd377601(v=vs.85).aspx. Leider habe ich keine Ahnung, wie man eine Grafik für DVB-T erstellt. Wie auch immer, auf meinem Entwickler. Desktop mit Win 10 stürzt der GraphEdit ab, wenn ich die Direct Show Filter öffne (wahrscheinlich der gleiche Grund, warum der aktuelle SW der DVB-T HW abstürzt). Ich fand interessante Blog mit alternativen Grafikeditor: https://en.wikipedia.org/wiki/GraphStudio - überprüfen Sie externe Links. Das neuere GraphStudioNext sieht ebenfalls vielversprechend aus (ich habe das noch nicht ausprobiert).

So habe ich gerade angefangen, hoffe das hat geholfen, wenn Sie noch interessiert sind. Wenn Sie mehr Erfahrung haben, sind alle Ratschläge willkommen! :-)

Mein Testcode (funktioniert noch nicht richtig!) Ist unten. Inspiriert von ITuner::put_TuneRequest() call ignored

hCo = CoInitializeEx(nullptr, COINIT::COINIT_APARTMENTTHREADED); 

if (hCo == S_OK) 
{ 
    IErrorInfo* pIErrorInfo = nullptr; 
    HRESULT hr = S_FALSE; 

    // Create the SystemTuningSpaces container. 
    PQTuningSpaceContainer pTuningSpaceContainer; // PQTuningSpaceContaineris typedef of CComQIPtr<ITuningSpace 
    hr = pTuningSpaceContainer.CoCreateInstance(__uuidof(SystemTuningSpaces)); 
    if (SUCCEEDED(hr)) 
    { 
     // Get the enumerator for the collection. 
     CComPtr<IEnumTuningSpaces> pTuningSpaceEnum; 
     hr = pTuningSpaceContainer->get_EnumTuningSpaces(&pTuningSpaceEnum); 
     if (SUCCEEDED(hr)) 
     { 
      // Loop through the collection. 
      PQTuningSpace pTuningSpace; 
      while (S_OK == pTuningSpaceEnum->Next(1, &pTuningSpace, nullptr)) 
      { 
       BSTR bstrDVBValue; 
       pTuningSpace->get_UniqueName(&bstrDVBValue); 
       printf("%S\n", bstrDVBValue); 
       pTuningSpace->get_FriendlyName(&bstrDVBValue); 
       printf("%S\n", bstrDVBValue); 
       pTuningSpace->get_NetworkType(&bstrDVBValue); 
       printf("%S\n\n", bstrDVBValue); 
       // pTuningSpace points to the next tuning space. 
       // You can query this pointer for derived interfaces. 
       pTuningSpace.Release(); 
      } 
     } 
    } 

    PQDVBTuningSpace pDVBTuningSpace; 
    WCHAR szDVBNameU[64] = L"DVB-T"; 
    WCHAR szDVBNameF[64] = L"Local DVB-T Digital Antenna"; 
    // WCHAR szDVBNetworkType[64] = L"{B2F3A67C-29DA-4C78-8831-091ED509A475}"; 
    WCHAR szDVBNetworkType[64] = L"{216C62DF-6D7F-4e9a-8571-05F14EDB766A}"; // DVB-T Network type 

    hr = pDVBTuningSpace.CoCreateInstance(__uuidof(DVBTuningSpace)); 
    if (FAILED(hr)) 
    { 
     printf("Failed to create system tuning spaces object."); 
     return; 
    } 

    hr = pDVBTuningSpace->put_SystemType(DVBSystemType::DVB_Terrestrial); 
    if (FAILED(hr)) 
    { 
     printf("Failed to put system type of tuning space."); 
     return; 
    } 

    hr = pDVBTuningSpace->put_NetworkType(szDVBNetworkType); 
    if (FAILED(hr)) 
    { 
     printf("Failed to put network type of tuning space."); 
     return; 
    } 

    BSTR bstrDVBNetworkType = SysAllocString(szDVBNetworkType); 
    hr = pDVBTuningSpace->put_NetworkType(bstrDVBNetworkType); 
    SysFreeString(bstrDVBNetworkType); 
    if (FAILED(hr)) 
    { 
     printf("Failed to put network type of tuning space."); 
     return; 
    } 

    BSTR bstrDVBName = nullptr; 
    bstrDVBName = SysAllocString(szDVBNameU); 
    hr = pDVBTuningSpace->put_UniqueName(bstrDVBName); 
    SysFreeString(bstrDVBName); 

    bstrDVBName = SysAllocString(szDVBNameF); 
    hr = pDVBTuningSpace->put_FriendlyName(bstrDVBName); 
    SysFreeString(bstrDVBName); 

    if (FAILED(hr)) 
    { 
     printf("Failed to put name of tuning space."); 
     return; 
    } 

    PQDVBTLocator pDVBTLocator; 
    hr = pDVBTLocator.CoCreateInstance(__uuidof(DVBTLocator)); 
    hr = pDVBTLocator->put_CarrierFrequency(538000); 
    hr = pDVBTLocator->put_Bandwidth(8); 
    hr = pDVBTuningSpace->put_DefaultLocator(pDVBTLocator); 
    if (FAILED(hr)) 
    { 
     printf("Failed to put locator of tuning space."); 
     return; 
    } 

    VARIANT tiIndex = {}; 
    //PQTuningSpaceContainer pTuningSpaceContainer; 
    //hr = pTuningSpaceContainer.CoCreateInstance(__uuidof(SystemTuningSpaces)); 
    hr = pTuningSpaceContainer->Add(pDVBTuningSpace, &tiIndex); // #fix needed: registry permissions 
    if (hr == HRESULT_FROM_WIN32(ERROR_DUP_NAME)) 
    { 
     CComPtr<IEnumTuningSpaces> pTuningSpaceEnum; 
     hr = pTuningSpaceContainer->get_EnumTuningSpaces(&pTuningSpaceEnum); 
     if (SUCCEEDED(hr)) 
     { 
      // Loop through the collection. 
      PQTuningSpace pTuningSpace; 
      tiIndex.intVal = 0; 
      while (S_OK == pTuningSpaceEnum->Next(1, &pTuningSpace, nullptr)) 
      { 
       CComBSTR name; 
       hr = pTuningSpace->get_UniqueName(&name); 
       if (SUCCEEDED(hr)) 
       { 
        if (name == szDVBNameU) 
        { 
         hr = pTuningSpaceContainer->put_Item(tiIndex, pDVBTuningSpace); // #fix needed: E_INVALIDARG One or more arguments are invalid. 
         break; 
        } 
       } 

       tiIndex.intVal++; 
       pTuningSpace.Release(); 
      } 
     } 
    } 

    PQTuneRequest pTuneRequest; 
    hr = pDVBTuningSpace->CreateTuneRequest(&pTuneRequest); 
    if (FAILED(hr)) 
    { 
     printf("Failed to create tune request."); 
     return; 
    } 

    PQDVBTuneRequest pDVBTuneRequest(pTuneRequest); 
    if (pDVBTuneRequest) 
    { 
     hr = pDVBTuneRequest->put_SID(-1); 
     hr = pDVBTuneRequest->put_TSID(-1); 
     hr = pDVBTuneRequest->put_ONID(-1); 
    } 

    CComPtr<IGraphBuilder> pGraph; 
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX::CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); 

    CComPtr<IBaseFilter> pNetworkProvider; 
    GUID CLSIDNetworkType; 
    hr = pDVBTuningSpace->get__NetworkType(&CLSIDNetworkType); 
    hr = CoCreateInstance(CLSIDNetworkType, NULL, CLSCTX::CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pNetworkProvider); 
    hr = pGraph->AddFilter(pNetworkProvider, L"Network Provider"); 

    //// Query for ITuner. 
    CComQIPtr<ITuner> pTuner(pNetworkProvider); 
    if (pTuner) 
    { 
     // Submit the tune request to the network provider. 
     hr = pTuner->put_TuneRequest(pTuneRequest); 
    } 

    // TODO: What next??? 

    CoUninitialize(); 

EDIT: https://github.com/dgis/CodeTV (geprüft und funktioniert für mich)

+0

Vielen Dank für all diese Infos:

dies viel helfen könnte. Ich werde es versuchen. – Kattabomane