2016-04-18 39 views
7

Sto scrivendo un'applicazione su OS X, che acquisirà fotogrammi dalla fotocamera. È possibile impostare le impostazioni di acquisizione usando la proprietà AVCaptureDevice.activeFormat? Ho provato questo, ma non ha funzionato (preset di sessione lo sostituisce).Registrazione AV acquisizione video con risoluzione personalizzata

Ho trovato che su IOS è possibile impostare SessionPreset in AVCaptureSession a AVCaptureSessionPresetInputPriority.

Lo scopo principale è scegliere risoluzioni video più dettagliate rispetto alle preimpostazioni.

+0

Aggiunto una taglia visto che sono molto interessato alla risposta a questa domanda. In particolare, sto vedendo che non importa quale formato metto in AVCaptureDevice activeFormat la risoluzione che esce dall'anteprima non cambia. AVCaptureSessionPresetInputPriority non è definito su mac osx, tuttavia activeFormat è. Questo significa che activeFormat non è effettivamente supportato? Non riesco a trovare la documentazione su questo. –

risposta

6

In macOS (a differenza di iOS), una sessione di acquisizione può configurare automaticamente il formato di acquisizione dopo aver apportato le modifiche. Per impedire modifiche automatiche al formato di cattura utilizzare il metodo lockForConfiguration(). Quindi chiamare il metodo beginConfiguration(), impostare le proprietà (scegliere una preimpostazione su una dozzina, ad esempio AVCaptureSessionPresetiFrame960x540) e successivamente chiamare il metodo commitConfiguration(). Alla fine è necessario inserire unlockForConfiguration() dopo aver modificato le proprietà di un dispositivo.

o seguire questi passaggi:

  1. chiamata lockForConfiguration() di acquisire l'accesso esclusivo alla proprietà di configurazione del dispositivo.

  2. Modificare la proprietà activeFormat del dispositivo (come indicato sopra & di seguito).

  3. Iniziare l'acquisizione con il metodo startRunning() della sessione.

  4. Sbloccare il dispositivo con unlockForConfiguration().

startRunning() e stopRunning() metodi devono essere richiamati per avviare ed arrestare il flusso dei dati dagli ingressi alle uscite, rispettivamente.

È inoltre necessario chiamare lockForConfiguration() prima di chiamare il metodo AVCaptureSessionstartRunning(), o preimpostato della sessione sarà ignorare il formato attivo selezionato sul dispositivo di acquisizione.

Tuttavia, si potrebbe tenere su un blocco, senza rilasciare che il blocco, se si richiedono le proprietà della periferica per rimanere invariati.

Ecco i dettagli nella documentazione dello sviluppatore lockForConfiguration().

Se si tenta di impostare il formato attivo su uno non presente nei formati accessibili, verrà generato un valore invalidArgumentException.

enter image description here

Inoltre, c'è una spiegazione come modificare le proprietà: macOS AVFoundation Video Capture

In AVCaptureDevice Ci sono due proprietà. formati e activeFormat. il formato restituirà un NSArrary di AVCaptureDeviceFormat con contiene tutti i formati esposti dalla camma. Seleziona un qualsiasi formato da questo elenco e impostalo su activeFormat.Assicurati di aver impostato il formato dopo aver ricevuto l'accesso esclusivo al dispositivo chiamando AVCaptureDevice lockForConfigration. Dopo aver impostato il formato, rilasciare il blocco con AVCaptureDevice unlockForConfigration. Quindi avviare AVCaptureSession che fornirà i fotogrammi video del formato impostato.

AVCaptureFormat è un wrapper per CMFormatDescription. CMVideoFotmatDescription è la sottoclasse concreta di CMFormatDescription. Utilizzare CMVideoFormatDescriptionGetDimentions() per ottenere la larghezza e l'altezza nel formato impostato. Utilizzare CMFormatDescriptionGetMediaSubType() per ottenere il codec video. Per i fotmat video codec per lo più è yuvs o vuy2. Per i formati compressi, h264, dmb1 (mjpeg) e molti altri.

- Questa è una citazione del user692178

+0

Come la domanda descrive, il formato attivo sembra essere sovrascritto dal preset di sessione. Se si imposta activeFormat su un dispositivo, quindi stampare il formato attivo, è possibile vedere la modifica riflessa. Se si inizia a eseguire una sessione, il formato attivo ritorna a quello che esegue il mapping alla preselezione della sessione e il formato attivo che è stato esplicitamente impostato da noi viene perso non appena viene chiamato startRunning. La domanda è questa: come possiamo effettivamente utilizzare activeFormat su mac osx? Il preset di sessione ha sempre la priorità. –

+0

@DisplayName "In AVCaptureDevice ci sono due proprietà: i formati e il formato activeFormat restituirà un NSArrary di AVCaptureDeviceFormat con contiene tutti i formati esposti dalla camma. Seleziona un qualsiasi formato da questo elenco e impostalo su activeFormat. formato dopo aver ricevuto l'accesso esclusivo al devl chiamando AVCaptureDevice lockForConfigration.Dopo aver impostato il formato rilasciare il blocco con AVCaptureDevice unlockForConfigration, quindi avviare AVCaptureSession che fornirà i frame video del formato impostato. " – andy

+0

Sì, sto usando lockForConfiguration. Sì, sto impostando activeFormat utilizzando un formato dall'elenco restituito dai formati. No, i frame video restituiti non sono del formato impostato. –

Problemi correlati