2011-07-11 13 views
10

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/

+0

"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 ". –

+1

¿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

Respuesta

6

Como ya escribió H.264 codificación puede solamente esperar de los dispositivos que ejecutan de nido de abeja y más tarde, lo que significa actualmente sólo tabletas. Si necesita H.264, debe probar preparar el error y decirle al usuario que el dispositivo no es compatible o bloquear mejor los dispositivos sin H.264 usando filtros de mercado. O puede compilar ffmpeg para Android, como muchos otros proyectos. Echar un vistazo a estos enlaces:

http://odroid.foros-phpbb.com/t338-ffmpeg-compiled-with-android-ndk

http://bambuser.com/opensource

FFmpeg on Android

0

También puede utilizar JCodec

Es compatible con Android y tienen pocas muestras para ella. La mejor manera de compilarlo con Gradle es:

compile 'com.github.jcodec:jcodec:0.2.0-vg4' 

pero para las últimas mejoras y error que corrige necesidad de compilar a partir últimas confirmaciones (todavía no hay una nueva versión de 2016)

Cuestiones relacionadas