Aggiunta di informazioni di flusso al sink del file ASF
Il sink di file ASF è un'implementazione di IMFMediaSink fornita da Media Foundation che un'applicazione può usare per archiviare i dati multimediali ASF in un file. Per informazioni sul modello a oggetti di ASF Media Sinks e sull'utilizzo generale, vedere Sink multimediali ASF.
Dopo aver creato un'istanza del sink di file, è necessario configurarla prima di compilare la topologia. Il sink di file deve conoscere i flussi nel file di output, le informazioni sulla modalità di codifica e i metadati. In questo argomento viene descritto il processo di aggiunta del flusso nel sink di file.
Aggiunta di flussi nel sink del file ASF
Il sink di file deve conoscere i flussi di output e le relative proprietà in modo che possa generare di conseguenza esempi di output e aggiungerli al file ASF di output. Queste impostazioni vengono scritte nell'oggetto intestazione ASF finale.
Per impostare le informazioni sul flusso, è necessario avere un riferimento all'oggetto ContentInfo ASF del sink di file. Per informazioni, vedere Creazione del sink di file ASF.
La procedura seguente riepiloga i passaggi generali per la configurazione del flusso tramite l'oggetto profilo ASF.
Per configurare le informazioni sul flusso nel sink del file ASF
Creare un oggetto profilo ASF chiamando MFCreateASFProfile.
Per ogni flusso nel file di output, creare un tipo di supporto per il flusso di destinazione da aggiungere nel sink di file. Il tipo di supporto deve essere compatibile con i tipi di output supportati dai codificatori Windows Media.
Per informazioni sull'aggiunta di flussi audio al profilo, vedere Creazione di flussi audio per la codifica ASF.
Per informazioni sull'aggiunta di flussi video al profilo, vedere Creazione di flussi video per la codifica ASF.
Creare flussi in base ai tipi di supporti creati nel passaggio 2 chiamando IMFASFProfile::CreateStream.
Assegnare un numero di flusso per il flusso appena creato chiamando il puntatore all'interfaccia IMFASFStreamConfig ricevuto nel passaggio 3.
Facoltativamente, configurare il flusso con le informazioni seguenti:
- Parametri bucket persi impostando gli attributi: MF_ASFSTREAMCONFIG_LEAKYBUCKET1 o MF_ASFSTREAMCONFIG_LEAKYBUCKET2
- Estensione del payload, esclusione reciproca chiamando i metodi IMFASFStreamConfig .
Facoltativamente, impostare le dimensioni dei pacchetti di dati per il profilo impostando MF_ASFPROFILE_MINPACKETSIZE e MF_ASFPROFILE_MAXPACKETSIZE attributi. Il profilo ASF espone l'interfaccia IMFAttributes , a cui un'applicazione può ottenere riferimento chiamando IMFASFProfile::QueryInterface.
Impostare le informazioni di codifica per il flusso nel sink di file. Descritto in Impostazione delle proprietà nel sink di file.
Aggiungere il flusso al profilo chiamando IMFASFProfile::SetStream.
Associare il profilo all'oggetto ContentInfo chiamando IMFASFContentInfo::SetProfile.
Per modificare un flusso esistente, l'applicazione può ottenere un riferimento all'interfaccia IMFASFStreamConfig del flusso e riconfigurarla in base ai requisiti. Per aggiungere o rimuovere flussi, l'applicazione deve chiamare IMFASFProfile::RemoveStream. Per applicare queste modifiche, modificare o rimuovere il flusso, è necessario impostare di nuovo il profilo nell'oggetto ContentInfo. In questo modo viene sovrascritto il profilo esistente già associato all'oggetto ContentInfo.
//-------------------------------------------------------------------
// CreateVideoStream
// Create an video stream and add it to the profile.
//
// pProfile: A pointer to the ASF profile.
// wStreamNumber: Stream number to assign for the new stream.
// pType: A pointer to the source's video media type.
//-------------------------------------------------------------------
HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
if (!pProfile)
{
return E_INVALIDARG;
}
if (wStreamNumber < 1 || wStreamNumber > 127 )
{
return MF_E_INVALIDSTREAMNUMBER;
}
HRESULT hr = S_OK;
IMFMediaType* pVideoType = NULL;
IMFASFStreamConfig* pVideoStream = NULL;
UINT32 dwBitRate = 0;
//Create a new video type from the source type
hr = CreateCompressedVideoType(pType, &pVideoType);
if (FAILED(hr))
{
goto done;
}
//Create a new stream with the video type
hr = pProfile->CreateStream(pVideoType, &pVideoStream);
if (FAILED(hr))
{
goto done;
}
//Set a valid stream number
hr = pVideoStream->SetStreamNumber(wStreamNumber);
if (FAILED(hr))
{
goto done;
}
//Add the stream to the profile
hr = pProfile->SetStream(pVideoStream);
if (FAILED(hr))
{
goto done;
}
wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);
done:
SafeRelease(&pVideoStream);
SafeRelease(&pVideoType);
return hr;
}
Enumerazione dei sink di flusso
Per ogni flusso nel profilo di cui è a conoscenza l'oggetto ContentInfo, il sink del file ASF crea e aggiunge un sink di flusso che contiene tutte le proprietà del flusso codificato. Il sink di file ASF è progettato per contenere flussi fissi. Ciò significa che non è possibile aggiungere o rimuovere flussi chiamando IMFMediaSink::AddStreamSink o IMFMediaSink::RemoveStreamSink. Queste chiamate nel sink di file hanno esito negativo con il codice di errore MF_E_STREAMSINKS_FIXED. L'aggiunta o la rimozione di flussi nel profilo non aggiunge o rimuove automaticamente i sink del flusso nel sink del file. È necessario eliminare l'istanza esistente del file e ricrearla con nuove informazioni sul flusso se i flussi nel profilo sono stati modificati.
La procedura seguente riepiloga i passaggi generali per l'enumerazione dei sink di flusso nel sink del file ASF.
Per enumerare i sink di flusso
Chiamare IMFMediaSink::GetStreamSinkCount per ottenere il numero totale di sink di flusso nel sink del file ASF.
Scorrere i sink del flusso ang ottenere un riferimento all'interfaccia GetStreamSinkByIndex del sink di flusso.
-oppure-
Chiamare IMFMediaSink::GetStreamSinkById per ottenere il sink di flusso specificando il numero di flusso. Ogni sink di flusso viene identificato con il numero di flusso impostato durante la creazione del flusso nel profilo.
Se si sta creando una topologia parziale per la codifica di un file multimediale, è necessario aggiungere il sink di file alla topologia come nodo della topologia di output. È possibile farlo specificando ogni sink di vapore nel sink di file o impostando l'oggetto di attivazione del sink di file e gli identificatori del sink di flusso. Per altre informazioni e un esempio di codice, vedere Creazione di nodi di output.
Argomenti correlati