Configurazione di profili e altre proprietà dei file ASF
[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.
Gli elementi seguenti descrivono come eseguire varie attività correlate alla creazione di file ASF. Alcune interfacce menzionate in questo argomento sono documentate nella documentazione di Windows Media Format SDK.
Creazione di un profilo
I profili ASF vengono illustrati in dettaglio in Windows Media Format SDK; essenzialmente, descrivono gli attributi di un file di formato Windows Media, ad esempio velocità di bit, numero e tipo di flussi e qualità di compressione. Il filtro usa il profilo per determinare il tipo di file di Formato di Windows Media da scrivere, il numero di pin di input che deve essere configurato e i tipi di supporti che possono accettare.
Per creare un profilo personalizzato, usare Windows Media Format SDK direttamente per creare un oggetto profile manager usando la funzione WMCreateProfileManager . Creare quindi il profilo e passarlo al writer ASF WM usando il metodo IConfigASFWriter::ConfigureFilterUsingProfile . Questo è l'unico modo per configurare il filtro con un profilo che usa i codec Windows Media Audio e Video 9 Series. I profili di sistema per le versioni precedenti di questi codec possono essere aggiunti usando il metodo IConfigASFWriter::ConfigureFilterUsingProfileGuid .
È possibile reimpostare il profilo mentre i pin di input del filtro sono connessi, purché il nuovo profilo non richieda altri pin di input. Ad esempio, se si modifica il profilo da un profilo audio di solo input a un profilo audio e video a due input, solo il pin audio verrà riconnesso e non verrà creato alcun nuovo pin per il flusso video.
Aggiunta di metadati
Per aggiungere metadati a un file, eseguire una query sul filtro writer WM ASF per l'interfaccia IWMHeaderInfo . Dopo aver assegnato un profilo, usare i metodi di interfaccia IWMHeaderInfo per scrivere i metadati.
Indicizzazione di un file
Il writer WM ASF crea file indicizzati in modo temporale per impostazione predefinita. Per creare un file indicizzato in frame, usare il metodo IConfigAsfWriter::SetIndexMode per disabilitare tutti gli indici, quindi creare il file. Al termine, usare Windows Media Format SDK direttamente per creare un indice basato su frame per il file.
codifica Two-Pass
La codifica a due passaggi è supportata solo nei codec Windows Media della versione 8 e versioni successive. Inserire il writer WM ASF in modalità pre-elaborazione chiamando IConfigAsfWriter2::SetParam e specificando AM_CONFIGASFWRITER_PARAM_MULTIPASS nel parametro dwParam e TRUE nel parametro dwParam1 .
Eseguire quindi il grafico del filtro. Quando vengono eseguiti tutti i passaggi di pre-elaborazione (in genere verrà eseguito un solo passaggio di pre-elaborazione), l'applicazione riceverà un evento EC_PREPROCESS_COMPLETE dal filtro. Quando questo evento viene ricevuto, usare IMediaSeeking::SetPositions per reimpostare il puntatore di flusso all'inizio ed eseguire di nuovo il grafico del filtro. Dopo l'ultimo passaggio (in genere il secondo passaggio), l'applicazione riceverà un evento EC_COMPLETE per firmare che il processo di codifica è stato completato. Se un passaggio di pre-elaborazione viene annullato prima che venga ricevuto l'evento EC_PREPROCESS_COMPLETE , chiamare IConfigAsfWriter2::ResetMultiPassState per reimpostare il filtro prima di tentare un'altra esecuzione di pre-elaborazione.
È necessario impostare il parametro AM_CONFIGASFWRITER_PARAM_MULTIPASS su FALSE solo se si vuole mettere il filtro fuori dalla modalità di pre-elaborazione completamente.
Importante
È responsabilità dell'applicazione abilitare la modalità di pre-elaborazione in base al profilo che verrà usato per la codifica. Alcuni profili richiedono la codifica a due passaggi; se si tenta di codificare un file con un profilo di questo tipo e non si imposta AM_CONFIGASFWRITER_PARAM_MULTIPASS su TRUE, verrà generato un errore di EC_USERABORT . Per altre informazioni, vedere la documentazione di Windows Media Format SDK.
Recupero e impostazione delle proprietà del buffer in fase di esecuzione
In alcuni scenari, ad esempio se si vuole forzare l'inserimento di fotogrammi chiave durante la scrittura di un file, un'applicazione potrebbe dover ottenere o impostare informazioni su un buffer di Windows Media in fase di esecuzione. Il lettore WM ASF e il writer WM ASF supportano entrambi un meccanismo di callback che consente a un'applicazione di accedere all'interfaccia INSSBuffer3 in ogni singolo buffer multimediale durante la lettura o la scrittura di file. Le applicazioni possono usare questa interfaccia per designare esempi specifici come fotogrammi chiave, impostare codici di tempo SMPTE, specificare le impostazioni interlacciate o aggiungere qualsiasi tipo di dati privati a un flusso.
Usare l'interfaccia IAMWMBufferPass per registrare i callback dal pin che gestisce il flusso video. Il pin chiamerà il metodo IAMWMBufferPassCallback::Notify per ogni buffer.
Pixel non quadrati
Il writer WM ASF si connette a un filtro upstream, ad esempio il decodificatore DV, che restituisce le informazioni sulle proporzioni dei pixel. Il writer WM ASF scriverà queste informazioni come estensioni dell'unità dati per ogni esempio nel file.
Quando il lettore WM ASF rileva le informazioni sulle proporzioni dei pixel nell'intestazione del file o nelle estensioni dell'unità dati per gli esempi, offrirà un formato VIDEOINFOHEADER2 come prima scelta nel pin di output. I membri dwPictAspectRatioX e dwPictAspectRatioY della struttura, che descrivono le proporzioni del rettangolo video, verranno corretti correttamente per tenere conto della proporzioni dei pixel.
Gestione del formato interlacciato
Se si acquisisce un video interlacciato da un televisore o da una fotocamera DV, è possibile conservare il video originale come campi indipendenti se si prevede che il file codificato venga riprodotto in un televisore o in un altro dispositivo di visualizzazione interlacciato. I monitoraggi computer sono dispositivi di analisi progressiva. Se si denterlace un video e quindi riinterlacarlo per la riproduzione in una televisione, alcune perdite di dati verranno sostenute. In un file ASF le informazioni di interlacciamento vengono archiviate come estensioni di unità dati applicabili all'applicazione usando il metodo IAMWMBufferPassCallback descritto in precedenza. Per codificare un file che mantiene le impostazioni interlace originali, seguire questa procedura:
Implementare una classe che supporta IAMWMBufferPassCallback e scrivere una funzione Notify che imposta i flag interlacciati per ogni esempio. Questa funzione verrà chiamata dal writer WM ASF prima di elaborare ogni esempio.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format. BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST; HRESULT hr = S_OK; hr = pNSSBuffer3->SetProperty( WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size );
Impostare le estensioni dell'unità dati nel profilo prima di passare il profilo al filtro.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
Dopo aver configurato il filtro con il profilo, ottenere l'interfaccia IWMWriterAdvanced2 dal writer WM ASF e chiamare il metodo SetInputSettings .
``
``
// Must do this first. hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile); CComPtr<IServiceProvider> pProvider; CComPtr<IWMWriterAdvanced2> pWMWA2; hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider), (void**)&pProvider); if (SUCCEEDED(hr)) { hr = pProvider->QueryService(IID_IWMWriterAdvanced2, IID_IWMWriterAdvanced2, (void**)&pWMWA2); } BOOL pValue = TRUE; // Set the first parameter to your actual input number. hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding, WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));
Argomenti correlati