Share via


Per scrivere esempi

[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.

Dopo aver identificato e configurato gli input per il file che si sta scrivendo, è possibile iniziare a passare esempi al writer. È consigliabile passare esempi in ordine di presentazione, se possibile, per rendere il processo di scrittura più efficiente.

Prima di passare tutti gli esempi, è necessario impostare il writer per accettarli chiamando IWMWriter::BeginWriting.

Per passare un esempio al writer, seguire questa procedura:

  1. Allocare un buffer e recuperare un puntatore all'interfaccia INSSBuffer chiamando IWMWriter::AllocateSample.
  2. Recuperare l'indirizzo del buffer creato nel passaggio 1 chiamando INSSBuffer::GetBuffer.
  3. Copiare i dati di esempio nel percorso del buffer, assicurandosi che l'esempio passato si adatta al buffer allocato. È possibile usare qualsiasi funzione di copia della memoria per copiare i dati. Una scelta comune è memcpy, inclusa nella libreria di runtime C standard.
  4. Aggiornare la quantità di dati usati nel buffer per riflettere le dimensioni effettive dell'esempio chiamando INSSBuffer::SetLength.
  5. Passare l'interfaccia del buffer al writer insieme al numero di input e all'ora di esempio usando il metodo IWMWriter::WriteSample . Tutti gli esempi audio per un input rappresentano la stessa durata del contenuto, quindi è possibile calcolare il tempo di esempio aggiungendo la durata dell'esempio a un totale in esecuzione. Per il video è necessario calcolare il tempo in base alla frequenza dei fotogrammi.

WriteSample funziona in modo asincrono e potrebbe non terminare la scrittura dei dati dal buffer prima che l'applicazione sia pronta per chiamare di nuovo il metodo. Pertanto, è importante chiamare AllocateSample una volta per ogni chiamata a WriteSample. Tuttavia, è possibile rilasciare l'interfaccia INSSBuffer immediatamente dopo aver chiamato WriteSample.

Al termine del passaggio di esempi, chiamare IWMWriter::EndWriting.

Nota È importante che gli esempi di tutti i flussi nel file vengano passati al writer nella sincronizzazione tra loro. Ovvero, ogni volta che è possibile passare esempi al writer nell'ordine di presentazione all'interno della tolleranza di sincronizzazione specificata in IWMWriterAdvanced::SetSyncTolerance. I risultati migliori vengono ottenuti quando i dati vengono recapitati a ogni flusso in unità di un secondo o meno.

I flussi devono anche terminare contemporaneamente. Ad esempio, non è consigliabile scrivere un file con un flusso audio lungo 45 secondi e un flusso video di 50 secondi. Se si codifica tale file con input non invariati, alcuni dei dati audio alla fine del flusso verranno eliminati (anche se è il flusso più breve). Per rendere funzionante la codifica dei file, è necessario aggiungere 5 secondi di silenzio all'input audio in modo che un flusso non termina diversi secondi prima di un altro. Non è necessario che i tipi di flusso con esempi intermittenti, ad esempio flussi di testo o immagine, vengano riempiti in questo modo. I flussi dei comandi script devono anche seguire tutte queste regole.

Interfaccia INSSBuffer

Interfaccia IWMWriter

Scrittura di file ASF