Lettura di file con lettore sincrono
[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 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 e modifica dei file delle applicazioni. È 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 file al lettore sincrono o aprire file da un percorso Internet. Il lettore sincrono fornisce anche il supporto per l'uso dell'interfaccia COM IStream 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ò fornire esempi in base al numero di flusso e all'output. Gli esempi recapitati dal numero di flusso possono essere compressi o non compressi. Il lettore sincrono può anche passare tra il recapito compresso e non compresso durante la riproduzione; questa funzionalità è nota come "modifica rapida". Questa funzionalità consente a un'applicazione di modifica di leggere contenuto basato su Windows Media e passarla direttamente al writer fino a quando non viene raggiunto un frame desiderato. A quel 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 nuovamente fotogrammi compressi.
La funzionalità più di base dell'oggetto lettore sincrono può essere suddivisa nella procedura seguente. In questi passaggi "l'applicazione" fa riferimento al programma scritto usando 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 reciprocamente esclusivi.
- L'applicazione ottiene informazioni sulla configurazione dei vari output dal lettore. Le informazioni raccolte consentiranno all'applicazione di eseguire correttamente il rendering degli esempi multimediali.
- L'applicazione inizia a richiedere esempi, 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 del rendering dei dati dopo che viene recapitata 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 del SDK per piattaforma Windows Microsoft.
Questi passaggi vengono 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 esempi da recuperare in base al tempo o al numero di frame.
- Controllare la selezione del flusso per flussi esclusivi a vicenda.
- Aprire un file usando l'interfaccia COM standard, IStream.
- Leggere i dati del profilo dall'intestazione del file.
- Leggere i metadati dall'intestazione del file.
- Passare tra esempi di flusso e output durante la riproduzione.
- Passare tra esempi di flusso compressi e non compressi durante la riproduzione.
Le sezioni seguenti descrivono l'uso dell'oggetto lettore sincrono in dettaglio.
- Per creare un lettore sincrono e aprire un file
- Per trovare numeri di flusso e numeri di output
- Per recuperare esempi multimediali con il lettore sincrono
- Per cercare in base al tempo usando il lettore sincrono
- Per cercare in base al numero di frame usando il lettore sincrono
- Per cercare il codice ora SMPTE usando il lettore sincrono
- Per recuperare esempi di flusso con il lettore sincrono
- Per recuperare esempi compressi con il lettore sincrono
Codice di esempio
Il codice di esempio seguente illustra come leggere esempi da un file ASF usando il lettore sincrono. Specifica in base al numero di fotogrammi 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