Condividi tramite


Trasmissione di dati ASF

Questo argomento descrive come inviare dati ASF in una rete usando il protocollo HTTP. L'invio di file in rete richiede l'uso dell'oggetto writer, pertanto è necessario avere una conoscenza generale di questo oggetto prima di leggere questo argomento. Per altre informazioni, vedere Scrittura di file ASF.

Se si inizia con i dati non compressi, eseguire le operazioni seguenti:

  1. Creare l'oggetto writer chiamando la funzione WMCreateWriter . Questa funzione restituisce un puntatore IWMWriter .

    IWMWriter *pWriter;
    hr = WMCreateWriter(NULL, &pWriter);
    
  2. Creare l'oggetto sink di rete chiamando la funzione WMCreateWriterNetworkSink , che restituisce un puntatore IWMWriterNetworkSink .

    IWMWriterNetworkSink *pNetSink;
    hr = WMCreateWriterNetworkSink(&pNetSink);
    
  3. Chiamare IWMWriterNetworkSink::Open nel sink di rete e specificare il numero di porta da aprire; ad esempio 8080. Facoltativamente, chiamare IWMWriterNetworkSink::GetHostURL per ottenere l'URL dell'host. I client accederanno al contenuto da questo URL. È anche possibile chiamare IWMWriterNetworkSink::SetMaximumClients per limitare il numero di client.

    DWORD dwPortNum = 8080;
    hr = pNetSink->Open( &dwPortNum)
    
  4. Collegare il sink di rete al writer chiamando IWMWriterAdvanced::AddSink nel writer, con un puntatore all'interfaccia IWMWriterNetworkSink del sink di rete.

    IWMWriterAdvanced *pWriterAdvanced;
    hr = pWriter->QueryInterface(IID_IWMWriterAdvanced, ( void** ) pWriterAdvanced );
    if (SUCCEEDED(hr))
    {
        pWriterAdvanced->AddSink(pNetSink);
    }
    
  5. Impostare il profilo ASF chiamando il metodo IWMWriter::SetProfile nell'oggetto writer, con un puntatore IWMProfile . Per informazioni sulla creazione di un profilo, vedere Utilizzo dei profili.

  6. Facoltativamente, specificare i metadati usando l'interfaccia IWMHeaderInfo nel writer.

  7. Chiamare IWMWriter::BeginWriting nel writer.

    hr = pWriter->BeginWriting();
    
  8. Per ogni esempio, chiamare il metodo IWMWriter::WriteSample . Specificare il numero di flusso, l'ora di presentazione, la durata dell'esempio e un puntatore al buffer di esempio. Il metodo WriteSample comprime gli esempi.

  9. Al termine, chiama IWMWriter::EndWriting sul writer.

    hr = pWriter->EndWriting();
    
  10. Chiamare IWMWriterAdvanced::RemoveSink nel writer per scollegare l'oggetto sink di rete.

    hr = pWriterAdvanced->RemoveSink(pNetSink);
    
  11. Chiamare IWMWriterNetworkSink::Close nel sink di rete per rilasciare la porta.

    hr = pNetSink->Close();
    

Un altro modo per trasmettere contenuto ASF in una rete consiste nel leggerlo da un file ASF esistente. L'esempio WMVNetWrite fornito nell'SDK illustra questo approccio. Oltre ai passaggi elencati in precedenza, eseguire le operazioni seguenti:

  1. Creare un oggetto lettore e chiamare il metodo Open con il nome del file.

  2. Chiamare IWMReaderAdvanced::SetManualStreamSelection sull'oggetto lettore, con il valore TRUE. Ciò consente all'applicazione di leggere ogni flusso nel file, inclusi i flussi con esclusione reciproca.

  3. Eseguire una query sul lettore per l'interfaccia IWMProfile . Usare questo puntatore quando si chiama IWMWriter::SetProfile sull'oggetto writer (passaggio 5 della procedura precedente).

  4. Per ogni flusso definito nel profilo, chiamare IWMProfile::GetStream per ottenere il numero di flusso. Passare questo numero di flusso al metodo IWMReaderAdvanced::SetReceiveStreamSamples del lettore. Questo metodo informa il lettore di recapitare campioni compressi, anziché decodificarli. Gli esempi verranno recapitati all'applicazione tramite il metodo di callback IWMReaderCallbackAdvanced::OnStreamSample .

    È necessario ottenere informazioni sui codec per ogni flusso letto non compresso e aggiungerlo all'intestazione prima della trasmissione. Per ottenere le informazioni sul codec, chiamare IWMHeaderInfo2::GetCodecInfoCount e IWMHeaderInfo2::GetCodecInfo per enumerare i codec associati al file nel lettore. Selezionare le informazioni sul codec corrispondenti alla configurazione del flusso. Impostare quindi le informazioni sul codec nel writer chiamando IWMHeaderInfo3::AddCodecInfo, passando le informazioni ottenute dal lettore.

  5. Dopo aver impostato il profilo nel writer, chiamare IWMWriter::GetInputCount nel writer per ottenere il numero di input. Per ogni input, chiamare IWMWriter::SetInputProps con il valore NULL. Ciò indica all'oggetto writer che l'applicazione fornirà campioni compressi, pertanto il writer non deve usare codec per comprimere i dati. Assicurarsi di chiamare SetInputProps prima di chiamare BeginWriting.

  6. Facoltativamente, copiare gli attributi dei metadati dal lettore al writer

  7. Poiché gli esempi del lettore sono già compressi, usare il metodo IWMWriterAdvanced::WriteStreamSample per scrivere gli esempi, anziché il metodo WriteSample . Il metodo WriteStreamSample ignora le normali procedure di compressione dell'oggetto writer.

  8. Quando il lettore raggiunge la fine del file, invia una notifica WMT_EOF all'applicazione.

Inoltre, l'applicazione deve guidare l'orologio sull'oggetto lettore, in modo che il lettore estrae i dati dal file il più rapidamente possibile. A tale scopo, chiamare il metodo IWMReaderAdvanced::SetUserProvidedClock nel lettore, con il valore TRUE. Dopo che il lettore invia la notifica di WMT_STARTED, chiama IWMReaderAdvanced::D eliverTime e specifica l'intervallo di tempo che il lettore deve recapitare. Al termine della lettura, il lettore chiama il metodo di callback IWMReaderCallbackAdvanced::OnTime dell'applicazione. L'applicazione deve chiamare di nuovo DeliverTime per leggere l'intervallo di tempo successivo. Ad esempio, per leggere dal file in intervalli di un secondo:

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

Invio di dati ASF tramite una rete

Uso dei sink writer