6

Vorrei offrire agli utenti un'opzione per impostare risoluzioni diverse.setVideoSize() si blocca con risoluzioni elevate

Ho provato questa soluzione

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); 
.... 
.... 
mCamera.unlock(); 
recorder.setCamera(mCamera); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setProfile(camcorderProfile); 

Ha funzionato perfettamente: qualità piacevole e tutto ...

Quando ho impostato a

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P); 

con FLASH su, il video è uscito con colori verdastri e altri strani colori.

Ho letto online e la gente ha detto che è perché QUALITY_480P probabilmente non è supportato sul mio telefono. Ok, rende i sensi.

Pertanto, ho iniziato a lavorare sulla diversa soluzione, così ho provato ....

recorder.setVideoSize(640, 480); 

ha funzionato grande,

ma il video sembrava molto brutto.

Successivamente, ho controllato per un elenco di video supportati.

List<Size> GetSupportedVideosResolutions = params.getSupportedVideoSizes(); 

Risoluzione: 1280x720 è nella lista, in modo da

Ho cercato di impostare la seguente:

recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setVideoSize(1280,720); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 

Mi ha dato un errore di RuntimeException.

La domanda è

Perché non può farmi impostare le risoluzioni più alte che sono disponibili al telefono?

Qualsiasi aiuto sarebbe molto apprezzato,

Grazie.

Edit: aggiunte log degli errori

04-18 17:40:07.391: E/AndroidRuntime(30191): java.lang.RuntimeException: start failed. 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.media.MediaRecorder.start(Native Method) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at test.com.VideoActivity.prepare_StartRecorder(VideoActivity.java:1009) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at test.com.VideoActivity.Recorder_Start_Stop(VideoActivity.java:1102) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at test.com.VideoActivity$6.onClick(VideoActivity.java:246) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.view.View.performClick(View.java:4489) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.widget.CompoundButton.performClick(CompoundButton.java:104) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.view.View$PerformClick.run(View.java:18803) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.os.Handler.handleCallback(Handler.java:730) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.os.Looper.loop(Looper.java:137) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at android.app.ActivityThread.main(ActivityThread.java:5493) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at java.lang.reflect.Method.invokeNative(Native Method) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at java.lang.reflect.Method.invoke(Method.java:525) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 
04-18 17:40:07.391: E/AndroidRuntime(30191): at dalvik.system.NativeStart.main(Native Method) 
+0

Poiché 720p è 1280x720, cosa ti aspettavi diverso dal tuo ultimo blocco di codice rispetto al primo blocco di codice che hai detto funzionava bene? IOW, se vuoi output 1280x720, hai già un codice funzionante per questo. Oltre a ciò, non possiamo aiutarti con un'eccezione a meno che non pubblichi la traccia dello stack e indicherai quali linee in quella traccia dello stack corrispondono a quali linee del tuo codice nella tua domanda. – CommonsWare

+0

Grazie per il commento. Mi piace dare agli utenti la possibilità di scegliere diverse risoluzioni. 720P era il codice difficile. 720P potrebbe non essere supportato su un altro dispositivo. Inoltre, ho detto che c'era un problema con 480P con il flash acceso. Potrei provare 1920x1080 e lo stesso errore. – Iam1414

+0

Quale dispositivo stai testando? –

risposta

3

ho capito quale fosse il problema. Questo può aiutare qualcun altro. Ho finito con:

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); 
recorder.setVideoSize(1280, 720); //NEEDED or it will crash 

Codice:

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_720P); 
.... 
.... 
mCamera.unlock(); 
recorder.setCamera(mCamera); 
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); 
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT); 
recorder.setProfile(camcorderProfile); 
recorder.setVideoSize(1280 720); //NEEDED or it will crash 
.... 
... 

// o

CamcorderProfile.get(CamcorderProfile.QUALITY_1080P); 
recorder.setProfile(camcorderProfile); 
recorder.setVideoSize(1920, 1080); //NEEDED or it will crash 
0

SOLUZIONE: la risposta di Iam1414 è corretta.

Sono stato a questo tutto il giorno e, per quanto ridicolo, la sua tecnica funziona.

Stavo tentando di registrare in 4k (3840 x 2160), ero sicuro che il dispositivo avesse anche l'abilità, ma continuava a limitarmi a 1080 e si sarebbe schiantato su qualcosa di più alto. La soluzione era come menzionata da Iam1414.

-set il profilo
-set le dimensioni del video

profile = CamcorderProfile.get(CamcorderProfile.QUALITY_2160P); 
recorder.setProfile(profile); 
recorder.setVideoSize(3820, 2160); //NEEDED or it will crash 

impostazione Purtroppo il profilo mi blocca in a codifica H264 e non mi ha permesso di impostare il mio encoder alla mia encoder H265 dopo. Quindi spero che ci sia una soluzione anche per questo.

Iam1414, grazie. Ti voterei se avessi il rappresentante :)

Modifica: questo è un errore molto strano. È come se non avessi più bisogno di usare la soluzione alternativa. Sono in grado di registrare in 2160p semplicemente utilizzando il profilo corrispondente. Investigherò ulteriormente se continuerà ad essere un problema.