Dela via


Sändning av ASF-data

[Funktionen som är associerad med den här sidan, Windows Media Format 11 SDK, är en äldre funktion. Det har ersatts av Source Reader och Sink Writer. Source Reader och Sink Writer har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder Source Reader och Sink Writer i stället för Windows Media Format 11 SDK, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Det här avsnittet beskriver hur du skickar ASF-data över ett nätverk med hjälp av HTTP-protokollet. Att skicka filer via ett nätverk kräver att skrivarobjektet används, så du bör ha en allmän förståelse för det här objektet innan du läser det här ämnet. Mer information finns i Skrivning av ASF-filer.

Om du börjar med okomprimerade data gör du följande:

  1. Skapa skrivarobjektet genom att anropa funktionen WMCreateWriter. Den här funktionen returnerar en IWMWriter- pekare.

    IWMWriter *pWriter;
    hr = WMCreateWriter(NULL, &pWriter);
    
  2. Skapa nätverksmottagareobjektet genom att anropa funktionen WMCreateWriterNetworkSink, som returnerar en IWMWriterNetworkSink- pekare.

    IWMWriterNetworkSink *pNetSink;
    hr = WMCreateWriterNetworkSink(&pNetSink);
    
  3. Anropa IWMWriterNetworkSink::Öppna på nätverksmottagaren och ange det portnummer som ska öppnas, till exempel 8080. Du kan också anropa IWMWriterNetworkSink::GetHostURL för att hämta värdens URL. Klienter kommer åt innehållet från den här URL:en. Du kan också anropa IWMWriterNetworkSink::SetMaximumClients för att begränsa antalet klienter.

    DWORD dwPortNum = 8080;
    hr = pNetSink->Open( &dwPortNum)
    
  4. Koppla nätverksmottagaren till skrivaren genom att anropa IWMWriterAdvanced::AddSink på skrivaren, med en pekare till nätverksmottagarens IWMWriterNetworkSink-gränssnittet.

    IWMWriterAdvanced *pWriterAdvanced;
    hr = pWriter->QueryInterface(IID_IWMWriterAdvanced, ( void** ) pWriterAdvanced );
    if (SUCCEEDED(hr))
    {
        pWriterAdvanced->AddSink(pNetSink);
    }
    
  5. Ange ASF-profilen genom att anropa metoden IWMWriter::SetProfile på skrivarobjektet med en IWMProfile- pekare. Information om hur du skapar en profil finns i Arbeta med profiler.

  6. Du kan också ange metadata med hjälp av gränssnittet IWMHeaderInfo på skrivaren.

  7. Ring IWMWriter::BeginWriting på skrivaren.

    hr = pWriter->BeginWriting();
    
  8. För varje exempel anropar du metoden IWMWriter::WriteSample. Ange strömnumret, presentationstiden, varaktigheten för exemplet och en pekare till exempelbufferten. Metoden WriteSample komprimerar exemplen.

  9. När du är klar anropar du IWMWriter::EndWriting på skrivaren.

    hr = pWriter->EndWriting();
    
  10. Anropa IWMWriterAdvanced::RemoveSink på skrivarenheten för att koppla från nätverksanslutningsobjektet.

    hr = pWriterAdvanced->RemoveSink(pNetSink);
    
  11. Anropa IWMWriterNetworkSink::Stäng på nätverksmottagaren för att släppa porten.

    hr = pNetSink->Close();
    

Ett annat sätt att strömma ASF-innehåll via ett nätverk är att läsa det från en befintlig ASF-fil. WMVNetWrite-exemplet i SDK visar den här metoden. Utöver stegen som angavs tidigare gör du följande:

  1. Skapa ett läsarobjekt och anropa metoden Öppna med namnet på filen.

  2. Anropa IWMReaderAdvanced::SetManualStreamSelection på läsarobjektet med värdet TRUE. På så sätt kan programmet läsa alla strömmar i filen, inklusive strömmar med ömsesidigt undantag.

  3. Fråga läsaren om gränssnittet IWMProfile. Använd den här pekaren när du anropar IWMWriter::SetProfile på skrivarobjektet (steg 5 i föregående procedur).

  4. För varje ström som definieras i profilen anropar du IWMProfile::GetStream för att hämta strömnumret. Skicka det här strömnumret till läsarens IWMReaderAdvanced::SetReceiveStreamSamples-metoden. Den här metoden informerar läsaren om att leverera komprimerade exempel i stället för att avkoda dem. Exemplen levereras till programmet via programmets IWMReaderCallbackAdvanced::OnStreamSample återanropsmetod.

    Du måste hämta codec-information för varje ström som du läser okomprimerad och lägga till den i rubriken före sändning. Om du vill hämta kodinformationen anropar du IWMHeaderInfo2::GetCodecInfoCount och IWMHeaderInfo2::GetCodecInfo för att räkna upp de codecs som är associerade med filen i läsaren. Välj den codec-information som matchar strömkonfigurationen. Ange sedan kodinformationen i skrivaren genom att anropa IWMHeaderInfo3::AddCodecInfooch skicka informationen som hämtats från läsaren.

  5. När du har angett profilen på skrivaren anropar du IWMWriter::GetInputCount på skrivaren för att hämta antalet indata. För varje indata anropar du IWMWriter::SetInputProps med värdet NULL. Detta indikerar för skrivarobjektet att programmet levererar komprimerade exempel, så skrivaren behöver inte använda några codecs för att komprimera data. Se till att anropa SetInputProps innan du anropar BeginWriting.

  6. Du kan också kopiera metadataattributen från läsaren till skrivaren

  7. Eftersom exemplen från läsaren redan är komprimerade använder du metoden IWMWriterAdvanced::WriteStreamSample för att skriva exemplen i stället för metoden WriteSample. Metoden WriteStreamSample kringgår skrivarobjektets vanliga komprimeringsprocedurer.

  8. När läsaren når slutet av filen skickar den ett WMT_EOF meddelande till programmet.

Dessutom bör programmet köra klockan på läsarobjektet, så att läsaren hämtar data från filen så snabbt som möjligt. Det gör du genom att anropa metoden IWMReaderAdvanced::SetUserProvidedClock på läsaren med värdet TRUE. När läsaren har skickat WMT_STARTED-meddelandet anropar du IWMReaderAdvanced::DeliverTime och anger det tidsintervall som läsaren bör använda. När läsaren är klar med att läsa det här tidsintervallet anropas programmets IWMReaderCallbackAdvanced::OnTime återanropsmetod. Programmet bör anropa DeliverTime- igen för att läsa nästa tidsintervall. Om du till exempel vill läsa från filen med en sekunds intervall:

// Initial call to DeliverTime.
QWORD m_qwTime = 10000000; // 1 second.
hr = m_pReaderAdvanced->DeliverTime(m_qwTime);

// In the callback:
HRESULT CNetWrite::OnTime(QWORD cnsCurrentTime, void *pvContext)
{
    HRESULT hr = S_OK;
    // Continue calling DeliverTime until the end of the file.
    if(!m_bEOF)
    {
        m_qwTime += 10000000; // 1 second.
        hr = m_pReaderAdvanced->DeliverTime(m_qwTime);
    }
    return S_OK;
}

skicka ASF-data via ett nätverk

Arbeta med skrivarmottagare