Vorschau von TV-Audio
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]
Um die TV-Audiovorschau anzuzeigen, leiten Sie den Audiodecoder-Pin am Kreuzleistenfilter an den Audiotuner-Pin weiter. Um das Audio stummzuschalten, leiten Sie den Audiodecoder-Pin an -1 weiter, wie in der folgenden Abbildung dargestellt. (Querleistenfilter werden unter Arbeiten mit Querleisten beschrieben.)
Der grundlegende Ansatz sieht wie folgt aus:
- Verwenden Sie die ICaptureGraphBuilder2::FindInterface-Methode , um den Querleistenfilter zu suchen.
- Verwenden Sie die IAMCrossbar::get_CrossbarPinInfo-Methode , um die Eingabe- und Ausgabepins des Querleistenfilters aufzulisten. Suchen Sie nach einem Audiodecoder-Ausgabepin und einem Audiotuner-Eingabestift.
- Wenn Sie die richtigen Pins gefunden haben, rufen Sie IAMCrossbar::Route auf, um die Pins weiterzuleiten. Wenn dies nicht der Fall ist, suchen Sie Upstream nach einer anderen Querleiste, und wiederholen Sie den Vorgang.
- Um das Audio stummzuschalten, leiten Sie den Audiodecoder-Pin an -1 weiter.
Die meisten TV-Tuner verwenden einen einzelnen Querleistenfilter, einige verwenden jedoch zwei Querleistenfilter. Daher müssen Sie möglicherweise nach einer zweiten Querleiste suchen, wenn die erste fehlschlägt.
Hinweis
Anders als erwartet ist kein Audioaufnahmefilter oder Audiorenderer erforderlich, um die Audiovorschau anzuzeigen, da eine physische Verbindung zwischen dem Tuner Karte und dem Sound Karte besteht.
Der folgende Code zeigt diese Schritte ausführlicher. Zunächst sehen Sie hier eine Hilfsfunktion, die einen Querleistenfilter nach einem angegebenen Pintyp durchsucht:
HRESULT FindCrossbarPin(
IAMCrossbar *pXBar, // Pointer to the crossbar.
PhysicalConnectorType PhysicalType, // Pin type to match.
PIN_DIRECTION Dir, // Pin direction.
long *pIndex) // Receives the index of the pin, if found.
{
BOOL bInput = (Dir == PINDIR_INPUT ? TRUE : FALSE);
// Find out how many pins the crossbar has.
long cOut, cIn;
HRESULT hr = pXBar->get_PinCounts(&cOut, &cIn);
if (FAILED(hr)) return hr;
// Enumerate pins and look for a matching pin.
long count = (bInput ? cIn : cOut);
for (long i = 0; i < count; i++)
{
long iRelated = 0;
long ThisPhysicalType = 0;
hr = pXBar->get_CrossbarPinInfo(bInput, i, &iRelated,
&ThisPhysicalType);
if (SUCCEEDED(hr) && ThisPhysicalType == PhysicalType)
{
// Found a match, return the index.
*pIndex = i;
return S_OK;
}
}
// Did not find a matching pin.
return E_FAIL;
}
Die nächste Funktion versucht, das Audio abhängig vom Wert des bActivate-Parameters zu aktivieren oder stummzuschalten. Sie durchsucht den angegebenen Querleistenfilter nach den erforderlichen Pins. Wenn sie nicht gefunden werden können, wird ein Fehlercode zurückgegeben.
HRESULT ConnectAudio(IAMCrossbar *pXBar, BOOL bActivate)
{
// Look for the Audio Decoder output pin.
long i = 0;
HRESULT hr = FindCrossbarPin(pXBar, PhysConn_Audio_AudioDecoder,
PINDIR_OUTPUT, &i);
if (SUCCEEDED(hr))
{
if (bActivate) // Activate the audio.
{
// Look for the Audio Tuner input pin.
long j = 0;
hr = FindCrossbarPin(pXBar, PhysConn_Audio_Tuner,
PINDIR_INPUT, &j);
if (SUCCEEDED(hr))
{
return pXBar->Route(i, j);
}
}
else // Mute the audio
{
return pXBar->Route(i, -1);
}
}
return E_FAIL;
}
Die nächste Funktion durchsucht das Filterdiagramm nach einem Kreuzleistenfilter. Wenn es eine findet, versucht es, das Audio (mit der vorherigen Funktion) zu aktivieren oder stummzuschalten. Wenn dieser Vorgang fehlschlägt, sucht die Methode Upstream nach einer zweiten Querleiste und versucht es erneut. Einen allgemeineren Ansatz zum Verwalten mehrerer Querleistenfilter in einem Diagramm finden Sie in der CCrossbar-Klasse in der AmCap-Beispielanwendung.
HRESULT ActivateAudio(ICaptureGraphBuilder2 *pBuild, IBaseFilter *pSrc,
BOOL bActivate)
{
// Search upstream for a crossbar.
IAMCrossbar *pXBar1 = NULL;
HRESULT hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pSrc,
IID_IAMCrossbar, (void**)&pXBar1);
if (SUCCEEDED(hr))
{
hr = ConnectAudio(pXBar1, bActivate);
if (FAILED(hr))
{
// Look for another crossbar.
IBaseFilter *pF = NULL;
hr = pXBar1->QueryInterface(IID_IBaseFilter, (void**)&pF);
if (SUCCEEDED(hr))
{
// Search upstream for another one.
IAMCrossbar *pXBar2 = NULL;
hr = pBuild->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pF,
IID_IAMCrossbar, (void**)&pXBar2);
pF->Release();
if (SUCCEEDED(hr))
{
hr = ConnectAudio(pXBar2, bActivate);
pXBar2->Release();
}
}
}
pXBar1->Release();
}
return hr;
}
Der folgende Code zeigt, wie Sie diese Funktionen aufrufen:
// Build the analog TV graph (not shown).
// Activate the audio.
hr = ActivateAudio(pBuild, pCap, TRUE);
// Later, mute the audio.
hr = ActivateAudio(pBuild, pCap, FALSE);
Beachten Sie, dass diese Beispielfunktionen viele der gleichen Funktionsaufrufe wiederholen. Beispielsweise werden die Querleistenstifte jedes Mal aufgelistet. In einer echten Anwendung können Sie einige dieser Informationen zwischenspeichern.
Zugehörige Themen