Laden...

Dvb-t

Erstellt von ScToSh vor 19 Jahren Letzter Beitrag vor 16 Jahren 13.465 Views
ScToSh Themenstarter:in
98 Beiträge seit 2004
vor 19 Jahren
Dvb-t

Hi,

bin nun endlich stolzer Besitzer einer DVB-T Karte.

Hat von euch schon mal jmenad versucht eine Anwendung für eine DVB-T karte zuschreiben???

Ich hab leider keine AHnung wo ich nur ansatzweise anfangen sollte. 🤔

Über eine rege Teilanhme würde ich mich natürlich freuen 😉

19 Beiträge seit 2005
vor 19 Jahren

Hi,

würde auch gerne etwas in der Richtung realisieren, jedoch für DVB-S.

Habe auch keinen Plan, wie ich da ansetzen soll.

Kann irgendeiner helfen ?

S
127 Beiträge seit 2004
vor 19 Jahren

Ich weiß zwar nicht ob es hilft, aber ich weiß das die TV-Karten (digitale / analoge) als Netzwerkarten erkannt werden. Und auch eine IP-Adresse haben.
Das ist zwar VB Code aber damit konnte ich meine TV-Karte (analog) bzw. eine WebCam ansprechen. Die Ansteuerung erfolgt über die Windows-API und den Treibern
Vielleicht hilft es.


Option Strict On
Option Explicit On
Module Module1

#Region "konstante Variablen"
    Public Const WS_CHILD As Integer = &H40000000
    Public Const WS_VISIBLE As Integer = &H10000000
    Public Const SWP_NOMOVE As Short = &H2S
    Public Const SWP_NOZORDER As Short = &H4S
    Public Const HWND_BOTTOM As Short = 1
    Public Const WM_USER As Short = &H400S

    Public Const WM_CAP_START As Short = WM_USER
    Public Const WM_CAP_SET_CALLBACK_ERROR As Integer = WM_CAP_START + 2
    Public Const WM_CAP_SET_CALLBACK_STATUS As Integer = WM_CAP_START + 3
    Public Const WM_CAP_SET_CALLBACK_YIELD As Integer = WM_CAP_START + 4
    Public Const WM_CAP_SET_CALLBACK_FRAME As Integer = WM_CAP_START + 5
    Public Const WM_CAP_SET_CALLBACK_VIDEOSTREAM As Integer = WM_CAP_START + 6
    Public Const WM_CAP_SET_CALLBACK_WAVESTREAM As Integer = WM_CAP_START + 7

    Public Const WM_CAP_DRIVER_CONNECT As Integer = WM_CAP_START + 10
    Public Const WM_CAP_DRIVER_GET_CAPS As Integer = WM_CAP_START + 14
    Public Const WM_CAP_DLG_VIDEOFORMAT As Integer = WM_CAP_START + 41
    Public Const WM_CAP_DLG_VIDEOSOURCE As Integer = WM_CAP_START + 42
    Public Const WM_CAP_DLG_VIDEODISPLAY As Integer = WM_CAP_START + 43
    Public Const WM_CAP_SET_PREVIEW As Integer = WM_CAP_START + 50
    Public Const WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP_START + 52
    Public Const WM_CAP_GET_STATUS As Integer = WM_CAP_START + 54
    Public Const WM_CAP_SET_CALLBACK_CAPCONTROL As Integer = WM_CAP_START + 85
#End Region

#Region "Strukturen"
    Structure CAPDRIVERCAPS
        Dim wDeviceIndex As Integer ' Treiber index in der System.ini
        Dim fHasOverlay As Integer ' Unterstützt die Hardware die overlay-Methode?
        Dim fHasDlgVideoSource As Integer ' Hat der Treiber einen "Quelle-Dialog"?
        Dim fHasDlgVideoFormat As Integer ' Hat der Treiber einen "Format-Dialog"?
        Dim fHasDlgVideoDisplay As Integer ' Hat der Treiber einen "Externen Ausgang-Dialog"?
        Dim fCaptureInitialized As Integer ' Ist der Treiber einsatzbereit?
        Dim fDriverSuppliesPalettes As Integer ' Unterstützt der Treiber Paletten?
        Dim hVideoIn As Integer ' Treiber Eingangs Kanal
        Dim hVideoOut As Integer ' Treiber Ausgangs Kanal
        Dim hVideoExtIn As Integer ' Externer Treiber Eingang
        Dim hVideoExtOut As Integer ' Externer Treiber Ausgang
    End Structure

    Structure CAPSTATUS
        Dim uiImageWidth As Integer ' Breite des Bildes
        Dim uiImageHeight As Integer ' Höhe des Bildes
        Dim fLiveWindow As Integer ' Vorschau des Bildes?
        Dim fOverlayWindow As Integer ' Jetzt das Bild overlayen?
        Dim fScale As Integer ' Bild auf Fenster Grösse skalieren?
        Dim ptScroll As POINTAPI ' Scroll Postiton
        Dim fUsingDefaultPalette As Integer ' Standart Treiber Palette benutzen?
        Dim fAudioHardware As Integer ' Ist die Audio Hardware verfügbar?
        Dim fCapFileExists As Integer ' existiert die Capture-Datei?
        Dim dwCurrentVideoFrame As Integer ' # der aufgenommen Video-Bilder
        Dim dwCurrentVideoFramesDropped As Integer ' # der nicht aufgenommen Video-Bilder
        Dim dwCurrentWaveSamples As Integer ' # der aufgenommen Audio Spuren
        Dim dwCurrentTimeElapsedMS As Integer ' Länge der aufgenommen Sequenz
        Dim hPalCurrent As Integer ' Wird die aktuelle Palette bereits benutzt?
        Dim fCapturingNow As Integer ' Wird bereits aufgenommen?
        Dim dwReturn As Integer ' Fehler-Variable für auftretende Fehler
        Dim wNumVideoAllocated As Integer ' Aktuelle Grösse des Video Buffers
        Dim wNumAudioAllocated As Integer ' Aktuelle Grösse des Audio Buffers
    End Structure

    Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
    End Structure
#End Region

#Region "Windows-API"
    Public Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As Integer
    Public Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short, ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer As Integer) As Boolean
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Short, ByRef lParam As Object) As Integer
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
#End Region

#Region "Weitere Funktionen"
    Function capDriverConnect(ByVal lwnd As Integer, ByVal i As Short) As Boolean
        'Verbinder ein Aufnahmefenster zum Aufnahmetreiber
        capDriverConnect = CBool(SendMessage(lwnd, WM_CAP_DRIVER_CONNECT, i, New Object()))
    End Function

    Function capDriverGetCaps(ByVal lwnd As Integer, ByRef s As Object, ByVal wSize As Short) As Boolean
        'Gibt die Verfügbarkeit der Videohardware an
        capDriverGetCaps = CBool(SendMessage(lwnd, WM_CAP_DRIVER_GET_CAPS, wSize, s))
    End Function

    Function capGetStatus(ByVal lwnd As Integer, ByRef s As Object, ByVal wSize As Short) As Boolean
        'Status des Videofensters bekommen
        capGetStatus = CBool(SendMessage(lwnd, WM_CAP_GET_STATUS, wSize, s))
    End Function

    Function capDlgVideoFormat(ByVal lwnd As Integer) As Boolean
        '"Format" Dialog der Videoquelle anzeigen
        capDlgVideoFormat = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEOFORMAT, 0, New Object()))
    End Function

    Function capDlgVideoSource(ByVal lwnd As Integer) As Boolean
        '"Quelle" Dialog des Videoeingangs anzeigen
        capDlgVideoSource = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEOSOURCE, 0, New Object()))
    End Function

    Function capDlgVideoDisplay(ByVal lwnd As Integer) As Boolean
        '"Options"Dialog anzeigen (Helligkeit, Kontrast, etc)
        capDlgVideoDisplay = CBool(SendMessage(lwnd, WM_CAP_DLG_VIDEODISPLAY, 0, New Object()))
    End Function

    Function capPreview(ByVal lwnd As Integer, ByVal f As Boolean) As Boolean
        'Video Stream starten
        capPreview = CBool(SendMessage(lwnd, WM_CAP_SET_PREVIEW, CShort(f), New Object()))
    End Function

    Function capPreviewRate(ByVal lwnd As Integer, ByVal wMS As Short) As Boolean
        'Vorschau Rate (Schnelligkeit der neuen Bilder) feststellen
        capPreviewRate = CBool(SendMessage(lwnd, WM_CAP_SET_PREVIEWRATE, wMS, New Object()))
    End Function

    Function capSetCallbackOnError(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird bei einem AVICap Fehler aufgerufen
        capSetCallbackOnError = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_ERROR, 0, lpProc))
    End Function

    Function capSetCallbackOnStatus(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird bei einer Statusveränderung des Anzeigefensters aufgerufen
        capSetCallbackOnStatus = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_STATUS, 0, lpProc))
    End Function

    Function capSetCallbackOnYield(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn ein Fehler während der Aufnahme auftritt
        capSetCallbackOnYield = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_YIELD, 0, lpProc))
    End Function

    Function capSetCallbackOnFrame(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, die Bilder anzuzeigen
        capSetCallbackOnFrame = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_FRAME, 0, lpProc))
    End Function

    Function capSetCallbackOnVideoStream(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn der Videobuffer voll ist
        capSetCallbackOnVideoStream = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, lpProc))
    End Function

    Function capSetCallbackOnWaveStream(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'wird aufgerufen, wenn ein neuer Audio Buffer verfügbar ist
        capSetCallbackOnWaveStream = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, lpProc))
    End Function

    Function capSetCallbackOnCapControl(ByVal lwnd As Integer, ByRef lpProc As Object) As Boolean
        'Aufnahme-Steuerungs Makro
        capSetCallbackOnCapControl = CBool(SendMessage(lwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, lpProc))
    End Function
#End Region

End Module

Ich habe noch mal ein Beispiel angehangen, konnte es leider auf nicht testen da mir eine Tv-Karte, WebCam fehlt am Rechner.

Na ja ich hoffe das ich euch helfen konnte.

19 Beiträge seit 2005
vor 19 Jahren

Hi suny,

danke für die Antwort.

Wenn ich das richtig sehe, sprichst du in deinem Beispiel deine TV Karte als Capture Device an. Wenn ich mich nicht irre, wird das leider mit meiner WinTV Nova-s nicht funktionieren. 🙁

S
127 Beiträge seit 2004
vor 19 Jahren

Ja tue ich.

Sorry, war ein versuch.

19 Beiträge seit 2005
vor 19 Jahren

Trotzdem danke.

137 Beiträge seit 2005
vor 19 Jahren

Für Linux scheint es einen "Treiber" zu geben: http://www.linuxtv.org/. Vielleicht bringen Dich die Sourcen weiter 😉

K
20 Beiträge seit 2005
vor 17 Jahren

hallo,

ich hab soeben diesen Thread gefunden und wollte mal fragen ob sich irgendwie was in dem Bereich getan hat?
Hat wer bereits es hinbekommen seine DVB-T Karte anzusteuern oder ist nichts weiter passiert?
Fallst ja, würde ich mich für das Thema ebenfalls interessieren...

Danke 🙂

Gruß
K2k

6.862 Beiträge seit 2003
vor 17 Jahren

In anderen Foren gibts für sowas die goldene Schauffel 😉

Ich verschiebe es mal eher in Grafik u. Sound, denke passt da besser hin.

Baka wa shinanakya naoranai.

Mein XING Profil.

1.373 Beiträge seit 2004
vor 17 Jahren

Hallo,

Dein Stichwort dürfte wohl DiectShow + BDA sein (vorausgesetzt, deine Karte hat einen BDA Treiber). DirectShow.NET hat sogar ein funktionierendes(!) Beispiel dafür. Ich habe eine Terratec Cinergy 1400 DVB-T, damit geht es (wenn man die BDA Treiber installiert).

Viele Grüße,
Andre

K
20 Beiträge seit 2005
vor 17 Jahren

super, danke 🙂
muss jetzt nur noch die ganzen einstellungen (ONID/TSID/SID) für Wien herausfinden... hab gerade über ne Stunde gesucht aber leider nichts gefunden 🙁
Hmm... muss vielleicht nach einer Software suchen, die das anzeigen kann... oder kennt vielleicht wer bereits eine?

Gruß
K2k

1.373 Beiträge seit 2004
vor 17 Jahren

Hallo,

Schau mal in das Forum von digitalfernsehen.de ( http://forum.digitalfernsehen.de/forum/ ), da wissen die über sowas immer spitz Bescheid. Vielleicht gibt es da auch DVB-T Senderlisten für Österreich, fang am besten in diesem Thread an. Andererseits sollte doch bei deinem DVB-T Gerät auch eine Software zum Anschauen dabeigewesen sein, mit der du bei dir nach Sendern suchen kannst.

Vielleicht etwas Offtopic: wenn du ein gutes Programm suchst zum Anschauen und Aufnehmen, schau dir mal DVBViewer an. Kostet nicht viel (15€ IIRC) und ist (vor allem mit dem Videorecorder Plugin) einfach nur zu empfehlen. Ich habe meinen Code sogar bereits zugeschickt bekommen, als das Geld noch nicht mal überwiesen war. Achte aber darauf, dass deine Karte/dein Stick unterstützt wird.

Viele Grüße,
Andre

K
20 Beiträge seit 2005
vor 17 Jahren

Danke für den Tipp mit dem DVBViewer!
Auf der Seite habe ich ein anderes Freeware Tool gefunden und zwar Transedit MMC, damit kann man die Frequenzen durchsuchen und erhält alle notwendigen Infos, also auch was ich gesucht hab für Österreich:


Freq: 	794MHz
ONID: 	8232
TSID: 	100
SID: 	10120 ATV
	10101 ORF1
	10102 ORF2 W
	10122 ORF2 N

Leider geht mit meinen DVB-T USB-Sticks (MSI Digi Vox Mini und MSI Digi Vox Mini SL) das Beispiel nicht, erhalte immer die Exception "This application only support the 2 filters BDA scheme", was auch immer das bedeutet. Kenne mich leider mit dem DirectShow.NET überhaupt nicht aus. Aber beide DVB-T Karten haben, soviel ich weiß, BDA Treiber

Vielleicht hatte wer schon mal den Fehler und kann mir sagen was des sein könnte?! Ob es an meinen DVB-T Sticks liegt, den Treibern oder ist es was ganz anderes?

Besten Dank 🙂

K2k

1.373 Beiträge seit 2004
vor 17 Jahren

Laut http://www.dvbviewer.com/forum/index.php?showtopic=9117 sollen deine Digi Vox Mini Sticks mit DVBViewer laufen, weshalb sie ja eigentlich BDA Treiber haben müssten. Schau mal auf der CD nach. Oder laufen sie nur nicht mit dem Beispiel-Programm?

Viele Grüße,
Andre

K
20 Beiträge seit 2005
vor 17 Jahren

genau - sie laufen nur nicht mit dem Beispiel Programm... hier erhalte ich die Exception und beim Debugen hab ich festgestellt, dass er ja die Karte und alles andere auch findet, nur wird dann folgendes

  // Connect it to the MPEG-2 Demux
            hr = capBuilder.RenderStream(null, null, this.capture, null, this.mpeg2Demux);

ausgeführt und hier erhalte ich als Rückgabewert einen undefinierten Wert. Darauf hin schmeißt er mir die Exception

 // BDA also support 3 filter scheme (never show it in real life).
              throw new ApplicationException("This application only support the 2 filters BDA scheme");

DEr gesamte Code sieht wie folgt aus:

private void AddAndConnectBDABoardFilters()
    {
      int hr = 0;
      DsDevice[] devices;

      ICaptureGraphBuilder2 capBuilder = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();
      capBuilder.SetFiltergraph(this.graphBuilder);

      try
      {
        // Enumerate BDA Source filters category and found one that can connect to the network provider
        devices = DsDevice.GetDevicesOfCat(FilterCategory.BDASourceFiltersCategory);
        for(int i = 0; i < devices.Length; i++)
        {
          IBaseFilter tmp;

          hr = graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, devices[i].Name, out tmp);
          DsError.ThrowExceptionForHR(hr);

          hr = capBuilder.RenderStream(null, null, this.networkProvider, null, tmp);
          if (hr == 0)
          {
            // Got it !
            this.tuner = tmp;
            break;
          }
          else
          {
            // Try another...
            hr = graphBuilder.RemoveFilter(tmp);
            Marshal.ReleaseComObject(tmp);
          }
        }
        // Assume we found a tuner filter...

        // Then enumerate BDA Receiver Components category to found a filter connecting 
        // to the tuner and the MPEG2 Demux
        devices = DsDevice.GetDevicesOfCat(FilterCategory.BDAReceiverComponentsCategory);

        for(int i = 0; i < devices.Length; i++)
        {
          IBaseFilter tmp;

          hr = graphBuilder.AddSourceFilterForMoniker(devices[i].Mon, null, devices[i].Name, out tmp);
          DsError.ThrowExceptionForHR(hr);

          hr = capBuilder.RenderStream(null, null, this.tuner, null, tmp);
          if (hr == 0)
          {
            // Got it !
            this.capture = tmp;

            // Connect it to the MPEG-2 Demux
            hr = capBuilder.RenderStream(null, null, this.capture, null, this.mpeg2Demux);
            if (hr < 0)
              // BDA also support 3 filter scheme (never show it in real life).
              throw new ApplicationException("This application only support the 2 filters BDA scheme");

            break;
          }
          else
          {
            // Try another...
            hr = graphBuilder.RemoveFilter(tmp);
            Marshal.ReleaseComObject(tmp);
          }
        }
      }
      finally
      {
        Marshal.ReleaseComObject(capBuilder);
      }
    }

Danke 🙂

Gruß
K2k

C
366 Beiträge seit 2005
vor 17 Jahren

Hi,

ich habe eine TechniSAT SkyStar 2 und bei mir geht die Demoanwendung auch nicht. DVBViewerTE + BDA-Treiber geht, die Karte ist als BDA-Device im Gerätemanager aber wenn ich bei DTV Viewer einen Sender einstellen will, kommt folgende Exception.
Was kann ich dagegen tun?

mfg
Capt.Iglo

K
1 Beiträge seit 2008
vor 16 Jahren
grund der exception

ist zwar schon was her aber nur falls es einen interessieren sollte warum wieso
die exception kommt/ kamm

Das Bda Sample aus dem 1.5 sample package möchte treiber haben welches aus 2 filtern besteht 1 tuner filter und einen capture filter ( reiner BDA )

in der jetzigen version des directshowlib sample package 2.0 können es auch mini bda treiber sein

tuner und capture zusammen gefasst zu einem filter obwohl dieser eine einmal unter capture und einmal unter reciver erscheint ( miniBDA )

hoffe das ich hiermit nachfolgenden suchenden etwas helfen konnte

139 Beiträge seit 2006
vor 16 Jahren

Wenn ihr wirklich hinterher seid und langewile habt, würde ich euch raten mal bei mediaportal (http://www.team-mediaportal.com) vorbei zu schauen. Das Projekt ist OpenSource und es werden mehr Karten, egal ob DVB-S, DVB-T oder DVB-C, als vom Windows Media Center unterstützt (zumal MCE nichtmal mit DVB-C Karten umgehen kann). Der Code ist relativ gut zu verstehen, wenn man sich eingelesen hat. Was ihr ja "nur" braucht ist der TV-Server, der zeichnet die Programme auf und verteilt an Clients.

Vielleicht hilft es ja 😉

Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen