Per creare file ASF tramite codec di terze parti

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita da Lettore di origine e Writer sink. Lettore di origine e Writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi Lettore di origine e Writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

È possibile usare Windows Media Format SDK per creare file ASF che contengono supporti digitali codificati con qualsiasi codec scelto. Quando si usa un codec diverso da uno incluso in questo SDK, è necessario eseguire la procedura seguente.

  1. Codificare il contenuto con il codec desiderato.
  2. Trovare o creare un valore GUID per identificare il contenuto codificato con il codec usato nel passaggio 1.
  3. Creare un nuovo profilo o modificare un profilo esistente da usare con il contenuto codificato.
    • Creare un flusso per il contenuto codificato con il tipo principale appropriato. Per altre informazioni sui tipi di supporti principali, vedere Tipi di supporti. Usare il GUID identificato nel passaggio 2 come sottotipo multimediale.
    • Impostare la frequenza di bit e la finestra del buffer per il flusso su valori che non comportano il overflow del buffer. È consigliabile ottenere questi valori dal codec al momento della codifica. I componenti del runtime SDK controllano i valori della finestra bitrate/buffer e rilasciano esempi se necessario per rendere i dati specificati adatti a questi valori. Se si impostano i valori in modo errato, il file non verrà trasmesso correttamente, causando una riproduzione scarsa.
    • Per i flussi video, è necessario impostare il membro biCompression della struttura BITMAPINFOHEADER contenuta nella struttura WMVIDEOINFOHEADER sul valore FOURCC appropriato per il contenuto. Questo valore deve essere uguale ai primi quattro byte del GUID del sottotipo. Ad esempio, se biCompression è MAKEFOURCC('T','E','S','T')=0x54455354, il GUID del sottotipo inizierà così: 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
  4. Creare un oggetto writer e caricare il profilo creato nel passaggio precedente. Per altre informazioni sulla scrittura di file, vedere Scrittura di file ASF.
  5. Eseguire il ciclo attraverso gli input del file e assegnare le proprietà di input per ogni oggetto normalmente. Per altre informazioni sugli input, vedere Uso degli input. Per il flusso codificato con un codec di terze parti, impostare il puntatore dell'interfaccia IWMInputMediaProps su NULL prima di chiamare IWMWriter::BeginWriting.
  6. Usare il nuovo profilo creato nel passaggio precedente per scrivere il file. Passare gli esempi compressi usando IWMWriterAdvanced::WriteStreamSample anziché IWMWriter::WriteSample. Per il video, è necessario specificare quali esempi sono fotogrammi chiave passando WM_SF_CLEANPOINT come parametro dwFlags .

Per elaborare e decomprimere il flusso codificato con un codec di terze parti, è necessario leggere esempi di flusso compressi. L'applicazione di lettura deve gestire anche la decompressione di esempio per il flusso.

Inserimento di flussi MPEG-2 in ASF

Nota

Questo argomento si applica alle applicazioni che usano Windows Media Format SDK per inserire MPEG-2 (o altri formati di compressione che usano frame B) nel contenitore di file ASF.

 

L'oggetto writer richiede che tutti gli esempi di input dispongano di timestamp e presuppone che ogni esempio di input disponga di una presentazione successiva a quella precedente. Anche se praticamente tutti i video non compressi e anche alcuni flussi video compressi soddisfano queste condizioni, i flussi MPEG-2 non devono essere compressi. In MPEG-2 non tutti gli esempi vengono contrassegnati come timestamp e quando sono presenti fotogrammi B, l'ordine di decodifica di esempio non corrisponde all'ordine di rendering. Quando l'oggetto writer rileva esempi non ordinati, li riorganizza nell'ordine "corretto". Pertanto, per archiviare i flussi MPEG-2 in modo nativo (non decodificato) in un contenitore ASF, è necessario eseguire la procedura seguente:

Quando si scrive il file:

  1. Aggiungere un'estensione dell'unità dati a dimensioni fisse (DUE) a ogni esempio di input che conterrà una struttura che contiene i valori di inizio e ora di arresto mpeg effettivi per l'ora di inizio e ora di arresto per l'esempio. Usare -1 per questi valori se l'esempio non ha un timestamp.
  2. Assegnare all'oggetto writer i timestamp di input fittizi che aumentano sempre in modo da scrivere gli esempi nel file esattamente nello stesso ordine in cui vengono ricevuti. I timestamp fittizi devono corrispondere approssimativamente ai tempi di presentazione effettivi, come medio nel tempo. I timestamp fittizi formeranno la sequenza temporale di ricerca, quindi se si differenziano rispetto ai timestamp in tempo reale, le operazioni di ricerca sul file produrranno risultati imprevisti. Tuttavia, una quantità limitata di jitter tra i tempi di esempio non influisce seriamente sulle operazioni di ricerca.

Quando si legge il file:

  • Per ogni esempio letto dal file, esaminare due. Se contiene un'ora di inizio maggiore o uguale a zero, copiare tale valore nel timestamp per l'esempio di output prima che venga recapitato al decodificatore. Impostare tutti gli altri timestamp negli esempi di output su NULL. In DirectShow questa operazione viene eseguita chiamando IMediaSample::SetTime(NULL,NULL).

Contenuto del buffering

Interfaccia IWMWriter

Interfaccia IWMWriterAdvanced

Per distribuire esempi compressi con il lettore asincrono

Per recuperare esempi di flusso con il lettore sincrono

WMVIDEOINFOHEADER

Uso dei profili

Scrittura di file ASF