Necesito una forma de controlar el flash de la cámara en un dispositivo Android mientras está grabando video. Estoy haciendo una aplicación de luz estroboscópica, y tomar videos con una luz estroboscópica intermitente daría como resultado la capacidad de grabar objetos que se mueven a altas velocidades, como una hoja de ventilador.Activación de la cámara Flash durante la grabación de video
El flash solo se puede habilitar iniciando una vista previa de video y configurando FLASH_MODE_TORCH en los parámetros de la cámara. Que se vería así:
Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();
Una vez iniciada la vista previa, que puede voltear ese parámetro de ida y vuelta para encender la luz de encendido y apagado. Esto funciona bien hasta que intento grabar un video. El problema es que para poder entregar la cámara al MediaRecorder, primero tengo que desbloquearlo.
MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);
Después de ese desbloqueo, ya no puedo cambiar los parámetros de la cámara y, por lo tanto, no tengo forma de cambiar el estado del flash.
No sé si es realmente posible hacer esto ya que no soy el mejor en java-piratería, pero aquí es lo que sé:
- Camera.unlock() es un nativo método, por lo que no puede ver realmente el mecanismo detrás de la forma en que me encierra a cabo
- Camera.Parameter tiene un HashMap que contiene todos sus parámetros
- Camera.setParameters (parámetros) realiza el HashMap, la convierte en una cadena, y lo pasa a un método nativo
- Puedo eliminar todos los parámetros, pero TORCH-MODE del HashMap y la cámara fija la aceptará
Por lo tanto, todavía puede acceder a la cámara, pero no va a escuchar nada de lo cuento. (Que es una especie de la finalidad del Camera.unlock())
Editar:
Después de examinar el código nativo, puedo ver que en CameraService.cpp mis llamadas a Camera.setParameters (parámetros) son rechazados porque mi ID de proceso no coincide con la ID de proceso que el servicio de la cámara tiene en el registro. Entonces parece que ese es mi obstáculo.
Edit2:
Parecería que la MediaPlayerService es el servicio principal que toma el control de la cámara cuando un vídeo está grabando. No sé si es posible, pero si de alguna manera pudiera comenzar ese servicio en mi propio proceso, debería poder omitir la llamada Camera.unlock().
Edit3:
Una última opción sería si pudiera de alguna manera obtener un puntero a la CameraHardwareInterface. Por lo que parece, esta es una interfaz específica del dispositivo y probablemente no incluya las comprobaciones PID. El principal problema con esto es que el único lugar donde puedo encontrar un puntero está en CameraService, y CameraService no está hablando.
Edit4: (varios meses después)
En este punto, creo que no es posible hacer lo que yo quería. No quiero eliminar la pregunta sobre la posibilidad de que alguien la responda, pero no estoy buscando activamente una respuesta. (Sin embargo, recibir una respuesta válida sería increíble.)
Realmente no veo por qué piensas que esto es posible. Yo esperaría que la grabación de video tomara el control completo de la cámara. Se requeriría una codificación especial para permitir que otra cosa controle la cámara al mismo tiempo. –
Estoy totalmente de acuerdo, no creo que sea posible en este punto tampoco, solo estoy dejando la pregunta aquí en este momento, en caso de que alguien encuentre milagrosamente la manera. – thepenguin77