Freigeben über


Übertragungen von ASF-Daten

In diesem Thema wird beschrieben, wie ASF-Daten mithilfe des HTTP-Protokolls über ein Netzwerk gesendet werden. Das Senden von Dateien über ein Netzwerk erfordert die Verwendung des Writer-Objekts. Daher sollten Sie vor dem Lesen dieses Themas über ein allgemeines Verständnis dieses Objekts verfügen. Weitere Informationen finden Sie unter Schreiben von ASF-Dateien.

Wenn Sie mit unkomprimierten Daten beginnen, gehen Sie wie folgt vor:

  1. Erstellen Sie das Writer-Objekt, indem Sie die WMCreateWriter-Funktion aufrufen. Diese Funktion gibt einen IWMWriter-Zeiger zurück.

    IWMWriter *pWriter;
    hr = WMCreateWriter(NULL, &pWriter);
    
  2. Erstellen Sie das Netzwerksenkenobjekt, indem Sie die WMCreateWriterNetworkSink-Funktion aufrufen, die einen IWMWriterNetworkSink-Zeiger zurückgibt.

    IWMWriterNetworkSink *pNetSink;
    hr = WMCreateWriterNetworkSink(&pNetSink);
    
  3. Rufen Sie IWMWriterNetworkSink::Open in der Netzwerksenke auf, und geben Sie die zu öffnende Portnummer an. beispiel: 8080. Rufen Sie optional IWMWriterNetworkSink::GetHostURL auf, um die URL des Hosts abzurufen. Clients greifen über diese URL auf den Inhalt zu. Sie können auch IWMWriterNetworkSink::SetMaximumClients aufrufen, um die Anzahl der Clients einzuschränken.

    DWORD dwPortNum = 8080;
    hr = pNetSink->Open( &dwPortNum)
    
  4. Fügen Sie die Netzwerksenke an den Writer an, indem Sie IWMWriterAdvanced::AddSink auf dem Writer mit einem Zeiger auf die IWMWriterNetworkSink-Schnittstelle der Netzwerksenke aufrufen.

    IWMWriterAdvanced *pWriterAdvanced;
    hr = pWriter->QueryInterface(IID_IWMWriterAdvanced, ( void** ) pWriterAdvanced );
    if (SUCCEEDED(hr))
    {
        pWriterAdvanced->AddSink(pNetSink);
    }
    
  5. Legen Sie das ASF-Profil fest, indem Sie die IWMWriter::SetProfile-Methode für das writer-Objekt mit einem IWMProfile-Zeiger aufrufen. Informationen zum Erstellen eines Profils finden Sie unter Arbeiten mit Profilen.

  6. Geben Sie optional Metadaten mithilfe der IWMHeaderInfo-Schnittstelle auf dem Writer an.

  7. Rufen Sie IWMWriter::BeginWriting für den Writer auf.

    hr = pWriter->BeginWriting();
    
  8. Rufen Sie für jedes Beispiel die IWMWriter::WriteSample-Methode auf. Geben Sie die Datenstromnummer, die Präsentationszeit, die Dauer des Beispiels und einen Zeiger auf den Beispielpuffer an. Die WriteSample-Methode komprimiert die Beispiele.

  9. Wenn Sie fertig sind, rufen Sie IWMWriter::EndWriting für den Writer auf.

    hr = pWriter->EndWriting();
    
  10. Rufen Sie IWMWriterAdvanced::RemoveSink für den Writer auf, um das Netzwerksenkenobjekt zu trennen.

    hr = pWriterAdvanced->RemoveSink(pNetSink);
    
  11. Rufen Sie IWMWriterNetworkSink::Close in der Netzwerksenke auf, um den Port freizugeben.

    hr = pNetSink->Close();
    

Eine weitere Möglichkeit zum Streamen von ASF-Inhalten über ein Netzwerk besteht darin, sie aus einer vorhandenen ASF-Datei zu lesen. Das WMVNetWrite-Beispiel im SDK veranschaulicht diesen Ansatz. Führen Sie zusätzlich zu den zuvor aufgeführten Schritten die folgenden Schritte aus:

  1. Erstellen Sie ein Reader-Objekt, und rufen Sie die Open-Methode mit dem Namen der Datei auf.

  2. Rufen Sie IWMReaderAdvanced::SetManualStreamSelection für das Readerobjekt mit dem Wert TRUE auf. Dadurch kann die Anwendung jeden Datenstrom in der Datei lesen, einschließlich Streams mit gegenseitigem Ausschluss.

  3. Fragen Sie den Reader nach der IWMProfile-Schnittstelle ab. Verwenden Sie diesen Zeiger, wenn Sie IWMWriter::SetProfile für das Writer-Objekt aufrufen (Schritt 5 in der vorherigen Prozedur).

  4. Rufen Sie für jeden im Profil definierten Stream IWMProfile::GetStream auf, um die Streamnummer zu erhalten. Übergeben Sie diese Streamnummer an die IWMReaderAdvanced::SetReceiveStreamSamples-Methode des Lesers. Diese Methode informiert den Leser, komprimierte Beispiele zu übermitteln, anstatt sie zu decodieren. Die Beispiele werden der Anwendung über die IWMReaderCallbackAdvanced::OnStreamSample-Rückrufmethode der Anwendung übermittelt.

    Sie müssen Codecinformationen für jeden Datenstrom abrufen, den Sie unkomprimiert lesen, und sie vor der Übertragung dem Header hinzufügen. Rufen Sie zum Abrufen der Codecinformationen IWMHeaderInfo2::GetCodecInfoCount und IWMHeaderInfo2::GetCodecInfo auf, um die Codecs aufzulisten, die der Datei im Reader zugeordnet sind. Wählen Sie die Codecinformationen aus, die der Streamkonfiguration entsprechen. Legen Sie dann die Codecinformationen im Writer fest, indem Sie IWMHeaderInfo3::AddCodecInfo aufrufen und die vom Reader abgerufenen Informationen übergeben.

  5. Nachdem Sie das Profil für den Writer festgelegt haben, rufen Sie IWMWriter::GetInputCount für den Writer auf, um die Anzahl der Eingaben abzurufen. Rufen Sie für jede Eingabe IWMWriter::SetInputProps mit dem Wert NULL auf. Dies gibt dem Writer-Objekt an, dass die Anwendung komprimierte Beispiele bereitstellt, sodass der Writer keine Codecs zum Komprimieren der Daten verwenden muss. Stellen Sie sicher, dass Sie SetInputProps aufrufen, bevor Sie BeginWriting aufrufen.

  6. Kopieren Sie optional die Metadatenattribute vom Reader in den Writer.

  7. Da die Beispiele aus dem Reader bereits komprimiert sind, verwenden Sie die IWMWriterAdvanced::WriteStreamSample-Methode , um die Beispiele zu schreiben, anstelle der WriteSample-Methode . Die WriteStreamSample-Methode umgeht die üblichen Komprimierungsprozeduren des Writer-Objekts.

  8. Wenn der Reader das Ende der Datei erreicht, sendet er eine WMT_EOF Benachrichtigung an die Anwendung.

Darüber hinaus sollte die Anwendung die Uhr für das Reader-Objekt steuern, damit der Reader Daten so schnell wie möglich aus der Datei abruft. Rufen Sie hierzu die IWMReaderAdvanced::SetUserProvidedClock-Methode für den Reader mit dem Wert TRUE auf. Nachdem der Leser die WMT_STARTED Benachrichtigung gesendet hat, rufen Sie IWMReaderAdvanced::D eliverTime auf, und geben Sie das Zeitintervall an, das der Leser liefern soll. Nachdem der Leser dieses Zeitintervalls gelesen hat, ruft er die IWMReaderCallbackAdvanced::OnTime-Rückrufmethode der Anwendung auf. Die Anwendung sollte DeliverTime erneut aufrufen, um das nächste Zeitintervall zu lesen. Wenn Sie beispielsweise in Intervallen von einer Sekunde aus der Datei lesen möchten:

// 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;
}

Senden von ASF-Daten über ein Netzwerk

Arbeiten mit Writer-Senken