Condividi tramite


Condivisione dei dati tra flussi

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Nota

Queste API sono deprecate. Le applicazioni devono usare il filtro Sample Grabber o implementare un filtro personalizzato per ottenere dati da un grafico di filtro DirectShow.

 

L'elaborazione di dati multimediali richiede in genere una grande quantità di risorse di sistema; pertanto, è consigliabile evitare di copiare i dati ogni volta che è possibile. L'architettura di streaming supporta esempi di flusso condivisi, un meccanismo che sposta i dati da un flusso a un altro senza copiarlo. Questo buffer consente il trasporto efficiente dei dati tra due flussi anche se il flusso di destinazione non supporta in modo specifico il formato dati sottostante.

Si supponga, ad esempio, che si disponga di un flusso multimediale con tre flussi di dati: video e audio e dati URL contrassegnati in modo da corrispondere al contenuto video. Si vuole scrivere un'applicazione che aggiunge un avviso di copyright su ogni fotogramma video e scrive i dati in un altro flusso per l'archiviazione, ma l'applicazione non comprende alcun formato di dati tranne il flusso video. Per il flusso video, si crea un esempio collegato alla superficie DirectDraw desiderata. È quindi possibile creare un flusso di output chiamando il metodo IDirectDrawMediaStream::CreateSample con tale puntatore alla stessa superficie o IMediaStream::CreateSharedSample. In entrambi i casi, i flussi di input e di output condividono la superficie DirectDraw. Poiché si capisce il formato video, è possibile accedere a questa superficie in base alle esigenze.

Per recuperare gli altri puntatori di flusso di origine (audio e URL), enumerare il flusso del contenitore di origine e i puntatori di recupero ai flussi non video. Ognuno di questi flussi di origine ha un flusso di output associato nel contenitore di flusso di output. Recuperare questi puntatori di output chiamando il metodo IMultiMediaStream::GetMediaStream nel contenitore di output con ognuno dei puntatori di flusso di origine. Questo processo è descritto nella seguente procedura.

  1. Chiamare IMultiMediaStream::EnumMediaStreams per recuperare un puntatore a un flusso di origine. Assicurarsi che non sia il flusso video, perché l'applicazione conosce già il formato.
  2. Chiamare IMultiMediaStream::GetMediaStream nel flusso del contenitore di output con il puntatore dal passaggio 1. Restituisce un puntatore al flusso di output desiderato.
  3. Chiamare AllocateSample nel flusso di origine.
  4. Chiamare CreateSharedSample nel flusso di output.
  5. Chiamare Update nel flusso di origine per leggere i dati.
  6. Chiamare Update nel flusso di output per scrivere i dati.

Ripetere questi passaggi per ogni flusso il cui formato non è supportato. Al termine dell'aggiornamento di entrambi gli esempi, il flusso di output contiene tutti i dati dal flusso di origine e viene eseguito.