Lettura di file con lettore sincrono
[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita da Lettore Sorgente e Scrittore Sink. lettore di origine e sink writer sono stati ottimizzati per Windows 10 e Windows 11. Microsoft raccomanda fortemente che il nuovo codice utilizzi il Source Reader e il Sink Writer invece del 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 il lettore sincrono per leggere un file ASF usando chiamate sincrone anziché i metodi asincroni nell'oggetto reader. L'uso di chiamate sincrone riduce il numero di thread necessari per leggere un file. Il lettore asincrono usa più thread per l'elaborazione dei flussi. Per i file con più flussi, il numero di thread usati può diventare molto grande. Il lettore sincrono usa un solo thread.
Il lettore sincrono è stato progettato per soddisfare le esigenze di creazione di contenuti e applicazioni di modifica dei file. È possibile usare il lettore sincrono per altre applicazioni, ma la relativa funzionalità è limitata.
Il lettore sincrono può aprire file locali o file in una rete usando il nome del percorso UNC (ad esempio "\\someshare\somedirectory\somefile.wmv"). Non è possibile trasmettere i file al lettore sincrono o aprire file da un percorso Internet. Il lettore sincrono fornisce anche il supporto per l'uso dell'interfaccia IStream COM come origine.
Il lettore sincrono offre maggiore versatilità per il recupero di campioni da un file ASF rispetto al lettore asincrono. Il lettore sincrono può recapitare campioni in base al numero di flusso e all'output. I campioni recapitati dal numero di flusso possono essere compressi o non compressi. Il lettore sincrono può anche passare dal recapito compresso al recapito non compresso durante la riproduzione; questa funzionalità è nota come "modifica rapida". Questa funzionalità consente a un'applicazione di modifica di leggere il contenuto basato su Windows Media e passarlo direttamente al writer finché non viene raggiunto un frame desiderato. A questo punto l'applicazione può indicare al lettore di iniziare a distribuire contenuto non compresso, che l'applicazione può quindi modificare e passare al writer per la ricompressione. Al termine della modifica dei fotogrammi specificati, l'applicazione può indicare al lettore di iniziare a distribuire di nuovo fotogrammi compressi.
La funzionalità di base dell'oggetto lettore sincrono può essere suddivisa nei passaggi seguenti. In questi passaggi "l'applicazione" fa riferimento al programma scritto con Windows Media Format SDK.
- L'applicazione passa al lettore sincrono il nome di un file da leggere. Quando il lettore sincrono apre il file, assegna un numero di output a ogni flusso. Se il file usa l'esclusione reciproca, il lettore assegna un singolo output per tutti i flussi che si escludono a vicenda.
- L'applicazione ottiene informazioni sulla configurazione dei vari output del lettore. Le informazioni raccolte consentiranno all'applicazione di eseguire correttamente il rendering degli esempi multimediali.
- L'applicazione inizia a richiedere campioni, uno alla volta, dal lettore sincrono. Il lettore sincrono fornisce ogni esempio in un oggetto buffer per il quale fornisce l'interfaccia INSSBuffer.
- L'applicazione è responsabile della visualizzazione dei dati dopo che sono stati forniti dal lettore. Windows Media Format SDK non fornisce routine di rendering. In genere, le applicazioni useranno altri SDK per eseguire il rendering dei dati, ad esempio Microsoft Direct X SDK o le funzioni multimediali di Microsoft Windows Platform SDK.
Questi passaggi sono illustrati nell'applicazione di esempio WMSyncReader. Per altre informazioni, vedere Applicazioni di esempio.
Il lettore sincrono supporta anche funzionalità più avanzate. Il lettore sincrono consente di eseguire le operazioni seguenti:
- Specificare un intervallo di campioni da recuperare in base al tempo o al numero di fotogramma.
- Selezione del flusso di controllo per flussi che si escludono a vicenda.
- Aprire un file usando l'interfaccia COM standard IStream.
- Legge i dati del profilo dall'intestazione del file.
- Legge i metadati dall'intestazione del file.
- Passare tra gli esempi di flusso e di output durante la riproduzione.
- Passare tra campioni di flusso compressi e non compressi durante la riproduzione.
Le sezioni seguenti descrivono in dettaglio l'uso dell'oggetto lettore sincrono.
- Per creare un lettore sincrono e aprire un file
- Per trovare numeri di flusso e numeri di uscita
- Per recuperare esempi multimediali con il lettore sincrono
- eseguire la ricerca in base al tempo usando il lettore sincrono
- eseguire la ricerca in base al numero di fotogrammi usando il lettore sincrono
- eseguire la ricerca in base al codice ora SMPTE usando il lettore sincrono
- Per recuperare esempi di flusso con il lettore sincrono
- Per recuperare esempi compressi con il lettore sincrono
esempio di codice
Il codice di esempio seguente illustra come leggere esempi da un file ASF usando il lettore sincrono. Specifica per numero di frame un intervallo di campioni da distribuire.
IWMSyncReader* pSyncReader = NULL;
INSSBuffer* pMyBuffer = NULL;
QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;
// Initialize COM.
hr = CoInitialize(NULL);
// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);
// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");
// TODO: Identify the properties for each output. This works
// exactly as it does with the asynchronous reader.
// Specify a playback range from frame number 100 of the video
// stream to the end of the file. Assume that the video stream
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);
// Loop through all the samples in the specified range.
do
{
// Get the next sample, regardless of its stream number.
hr = pSyncReader->GetNextSample(0,
&pMyBuffer,
&cnsSampleTime,
&cnsSampleDuration,
&dwFlags,
&dwOutputNumber,
NULL);
if(SUCCEEDED(hr))
{
// TODO: Process the sample in whatever way is appropriate
// to your application. When finished, clean up.
pMyBuffer->Release();
pMyBuffer = NULL;
cnsSampleTime = 0;
cnsSampleDuration = 0;
dwFlags = 0;
dwOutputNumber = 0;
}
}
while (SUCCEEDED(hr));
pSyncReader->Release();
pSyncReader = NULL;
Argomenti correlati
-
Interfaccia IWMSyncReader