He tenido algunos problemas al intentar arreglar una sencilla aplicación de grabación de video *. Creo que seguí la secuencia de pasos correctamente. Lo siguiente es una simplificación de la parte del código que me está dando problemas. Este código se ejecuta sólo como una devolución de llamada una vez que se pulsa un botón:H264 encoder in android?
if (mRecorder != null){
mRecorder.reset();
mRecorder.release();
}
mRecorder = new MediaRecorder();
if(mViewer.hasSurface){
mRecorder.setPreviewDisplay(mViewer.holder.getSurface());
Log.d(TAG,"Surface has been set");
}
try {
Log.d(TAG,"Sleeping for 4000 mili");
Thread.sleep(4000);
Log.d(TAG,"Waking up");
} catch (InterruptedException e) {
Log.e(TAG,"InterruptedException");
e.printStackTrace();
}
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setVideoFrameRate(12);
mRecorder.setVideoSize(176, 144);
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setMaxDuration(MAX_DURATION_TEST);
String targetFile = "/sdcard/webcamera/temp.mp4";
File localFile = new File(targetFile);
if(localFile.exists()){
Log.d(TAG,"Local file exists");
}else{
Log.d(TAG,"Local file does not exist");
}
mRecorder.setOutputFile(targetFile);
try {
mRecorder.prepare();
bPrepared = true;
Log.i(TAG,"prepared");
return;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG ,"IOException");
Log.e(TAG,"Message: "+e.getMessage());
StackTraceElement[] array = e.getStackTrace();
for(StackTraceElement element : array){
Log.e(TAG,""+element.toString());
}
}
La cosa importante que no entiendo es que cada vez que pongo el codificador de vídeo para ser MPEG_4_S funciona. Por otro lado cada vez que puse el codificador en H264 simplemente no lo hace. El problema es que este fragmento de código es solo parte de un proyecto más grande, y el resto espera que este video esté codificado con h264.
estoy probando en un Samsung Galaxy I-7500, que se ejecuta en froyo por cierto. Y creo que el Galaxy I-9000 tiene el mismo problema.
Lo desconcertante para mí es que de acuerdo con esta documentación aquí: http://developer.android.com/guide/appendix/media-formats.html, la codificación MPEG_4_SP no debe admitirse en absoluto, mientras que H264 es compatible desde honeycomb. Entonces, ¿por qué está funcionando con MPEG_4_SP en absoluto? y es posible hacer que funcione con H264?
El error que obtengo no es muy claro.
07-11 00:01:40.626: ERROR/MediaSource(1386): Message: prepare failed.
07-11 00:01:40.766: ERROR/MediaSource(1386): android.media.MediaRecorder._prepare(Native Method)
07-11 00:01:40.766: ERROR/MediaSource(1386): android.media.MediaRecorder.prepare(MediaRecorder.java:508)
07-11 00:01:40.766: ERROR/MediaSource(1386): com.appdh.webcamera.MediaSource.prepareOutput(MediaSource.java:74)
07-11 00:01:40.766: ERROR/MediaSource(1386): com.appdh.webcamera.MainActivity.startDetectCamera(MainActivity.java:312)
* En realidad, la aplicación es un poco más complicado que eso, ya que también lo hace el flujo de vídeo a través de LAN, pero la parte que me preocupa aquí no tiene nada que ver con eso. Puede comprobar este proyecto interesing aquí: http://code.google.com/p/ipcamera-for-android/
"Tenga en cuenta que cualquiera fijada el dispositivo móvil puede proporcionar soporte para formatos adicionales o tipos de archivos que no figuran en la tabla ". –
¿Admite el dispositivo la grabación H.264? Puede probarlo con la cámara predeterminada en el dispositivo o la aplicación de cámara que viene con la fuente de Android. También puede intentar cambiar el formato del codificador de audio a AAC en lugar de AMR, ya que el documento dice que se puede combinar con AAC solamente (esta información se encuentra en el enlace que ha proporcionado). – bluefalcon