Sto tentando di consentire agli utenti di registrare video di dimensioni diverse rispetto all'anteprima sullo schermo che possono vedere durante la registrazione. Questo sembra essere possibile dal this documentation concerning the getSupportedVideoSizes
function in cui si afferma:Registrare video con dimensioni di anteprima diverse rispetto al file video risultante
Se l'elenco restituito non è nullo, l'elenco restituito conterrà al almeno una dimensione e una delle dimensioni della lista deve essere restituito passato al MediaRecorder. setVideoSize() per l'applicazione videocamera se la videocamera viene utilizzata come sorgente video. In questo caso, la dimensione dell'anteprima può essere diversa dalla risoluzione del video registrato durante la registrazione video.
Questo suggerisce che alcuni telefoni torneranno nulla da questa fn (nella mia esperienza il Galaxy SIII fa), ma per coloro che non lo fanno, è possibile fornire un'anteprima con una risoluzione diversa rispetto al video vero e proprio. Questa comprensione è corretta? Alcuni telefoni consentono il comportamento e altri no?
Un tentativo di soluzione:
Nella funzione official description of the setPreviewDisplay
, che viene utilizzato nella lengthy process of setting up for video recording, si afferma che:
Se questo metodo viene chiamato con superficie null o non chiamato affatto , media , il registratore non cambia la superficie di anteprima della telecamera.
Questo sembra essere quello che voglio, ma sfortunatamente se lo faccio, l'intero processo di registrazione video è completamente incasinato. Suppongo che questa funzione non possa essere superata o non richiamata affatto durante il processo di registrazione del video. Forse in altri contesti questo va bene. Sfortunatamente, questo non sembra aiutarmi.
I miei passaggi successivi sono di esaminare TextureView
s e utilizzare un'anteprima Texture in contrasto con un'implementazione tipica di SurfaceView per utilizzare openGL per estendere la trama alla dimensione desiderata diversa dalla risoluzione effettiva (e ritagliare qualsiasi eccesso sullo schermo), quindi su Costruisci una superficie per la funzione setPreviewDisplay
con il costruttore Surface(SurfaceTexture surfaceTexture)
per una superficie. Vorrei evitare l'uso di un TextureView
a causa di incompatibilità sotto ICS, e anche perché questo aggiunge una notevole complessità.
Questo sembra un processo delicato, ma spero che qualcuno possa offrire qualche consiglio in questo settore.
Grazie.
Potete chiarire cosa significa "completamente incasinato"? –
Se ricordo correttamente, significava che la superficie di anteprima diventava nera e nulla è stato registrato. –