Difusión de datos de ASF
En este tema se describe cómo enviar datos de ASF a través de una red mediante el protocolo HTTP. El envío de archivos a través de una red requiere el uso del objeto writer, por lo que debe tener una comprensión general de este objeto antes de leer este tema. Para obtener más información, vea Escribir archivos ASF.
Si va a empezar con datos sin comprimir, haga lo siguiente:
Cree el objeto writer llamando a la función WMCreateWriter . Esta función devuelve un puntero IWMWriter .
IWMWriter *pWriter; hr = WMCreateWriter(NULL, &pWriter);
Cree el objeto receptor de red llamando a la función WMCreateWriterNetworkSink , que devuelve un puntero IWMWriterNetworkSink .
IWMWriterNetworkSink *pNetSink; hr = WMCreateWriterNetworkSink(&pNetSink);
Llame a IWMWriterNetworkSink::Open en el receptor de red y especifique el número de puerto que se va a abrir; por ejemplo, 8080. Opcionalmente, llame a IWMWriterNetworkSink::GetHostURL para obtener la dirección URL del host. Los clientes tendrán acceso al contenido desde esta dirección URL. También puede llamar a IWMWriterNetworkSink::SetMaximumClients para restringir el número de clientes.
DWORD dwPortNum = 8080; hr = pNetSink->Open( &dwPortNum)
Conecte el receptor de red al escritor llamando a IWMWriterAdvanced::AddSink en el escritor, con un puntero a la interfaz IWMWriterNetworkSink del receptor de red.
IWMWriterAdvanced *pWriterAdvanced; hr = pWriter->QueryInterface(IID_IWMWriterAdvanced, ( void** ) pWriterAdvanced ); if (SUCCEEDED(hr)) { pWriterAdvanced->AddSink(pNetSink); }
Establezca el perfil de ASF llamando al método IWMWriter::SetProfile en el objeto writer, con un puntero IWMProfile . Para obtener información sobre cómo crear un perfil, vea Trabajar con perfiles.
Opcionalmente, especifique los metadatos mediante la interfaz IWMHeaderInfo en el escritor.
Llame a IWMWriter::BeginWriting en el escritor.
hr = pWriter->BeginWriting();
Para cada ejemplo, llame al método IWMWriter::WriteSample . Especifique el número de secuencia, el tiempo de presentación, la duración del ejemplo y un puntero al búfer de ejemplo. El método WriteSample comprime los ejemplos.
Cuando haya terminado, llame a IWMWriter::EndWriting en el escritor.
hr = pWriter->EndWriting();
Llame a IWMWriterAdvanced::RemoveSink en el escritor para desasociar el objeto receptor de red.
hr = pWriterAdvanced->RemoveSink(pNetSink);
Llame a IWMWriterNetworkSink::Close en el receptor de red para liberar el puerto.
hr = pNetSink->Close();
Otra manera de transmitir contenido de ASF a través de una red es leerlo desde un archivo ASF existente. El ejemplo WMVNetWrite proporcionado en el SDK muestra este enfoque. Además de los pasos enumerados anteriormente, haga lo siguiente:
Cree un objeto lector y llame al método Open con el nombre del archivo.
Llame a IWMReaderAdvanced::SetManualStreamSelection en el objeto lector, con el valor TRUE. Esto permite a la aplicación leer todas las secuencias del archivo, incluidas las secuencias con exclusión mutua.
Consulte el lector para la interfaz IWMProfile . Use este puntero al llamar a IWMWriter::SetProfile en el objeto writer (paso 5 del procedimiento anterior).
Para cada secuencia definida en el perfil, llame a IWMProfile::GetStream para obtener el número de secuencia. Pase este número de secuencia al método IWMReaderAdvanced::SetReceiveStreamSamples del lector. Este método informa al lector para entregar muestras comprimidas, en lugar de descodificarlas. Los ejemplos se entregarán a la aplicación a través del método de devolución de llamada IWMReaderCallbackAdvanced::OnStreamSample de la aplicación.
Debe obtener información de códec para cada secuencia que lea sin comprimir y agregarla al encabezado antes de la difusión. Para obtener la información del códec, llame a IWMHeaderInfo2::GetCodecInfoCount e IWMHeaderInfo2::GetCodecInfo para enumerar los códecs asociados al archivo en el lector. Seleccione la información del códec que coincida con la configuración del flujo. A continuación, establezca la información del códec en el escritor llamando a IWMHeaderInfo3::AddCodecInfo, pasando la información obtenida del lector.
Después de establecer el perfil en el escritor, llame a IWMWriter::GetInputCount en el escritor para obtener el número de entradas. Para cada entrada, llame a IWMWriter::SetInputProps con el valor NULL. Esto indica al objeto writer que la aplicación entregará muestras comprimidas, por lo que el escritor no tiene que usar ningún códec para comprimir los datos. Asegúrese de llamar a SetInputProps antes de llamar a BeginWriting.
Opcionalmente, copie los atributos de metadatos del lector al escritor.
Dado que los ejemplos del lector ya están comprimidos, use el método IWMWriterAdvanced::WriteStreamSample para escribir los ejemplos, en lugar del método WriteSample . El método WriteStreamSample omite los procedimientos de compresión habituales del objeto writer.
Cuando el lector llega al final del archivo, envía una notificación WMT_EOF a la aplicación.
Además, la aplicación debe controlar el reloj en el objeto lector, de modo que el lector extraiga los datos del archivo lo antes posible. Para ello, llame al método IWMReaderAdvanced::SetUserProvidedClock en el lector, con el valor TRUE. Después de que el lector envíe la notificación de WMT_STARTED, llame a IWMReaderAdvanced::D eliverTime y especifique el intervalo de tiempo que debe entregar el lector. Una vez que el lector haya terminado de leer este intervalo de tiempo, llama al método de devolución de llamada IWMReaderCallbackAdvanced::OnTime de la aplicación. La aplicación debe llamar a DeliverTime de nuevo para leer el siguiente intervalo de tiempo. Por ejemplo, para leer desde el archivo en intervalos de un segundo:
// 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;
}
Temas relacionados