H264 в 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()); } } 

Важная вещь, которую я не понимаю здесь, заключается в том, что всякий раз, когда я устанавливаю видеокодер в MPEG_4_S, он работает. С другой стороны, всякий раз, когда я помещаю кодировщик в H264, он просто не делает этого. Проблема в том, что этот фрагмент кода является лишь частью более крупного проекта, а остальная часть его ожидает, что это видео будет закодировано h264.

Я тестирую на Samsung Galaxy I-7500, работая на froyo. И я думаю, что у Galaxy I-9000 такая же проблема.

Меня озадачивает то, что согласно этой документации прямо здесь: http://developer.android.com/guide/appendix/media-formats.html , кодировка MPEG_4_SP не должна поддерживаться вообще, а H264 поддерживается сотовой. Так почему же он работает с MPEG_4_SP? И можно ли работать с H264?

Ошибка, которую я получаю, не совсем понятна.

 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) 

* На самом деле, приложение немного сложнее, чем просто, поскольку оно также передает потоковое видео по локальной сети, но часть, которую я здесь касаюсь, не имеет к этому никакого отношения. Вы можете проверить этот интересный проект здесь: http://code.google.com/p/ipcamera-for-android/

Solutions Collecting From Web of "H264 в Android?"

Как вы уже писали, поддержка кодирования H.264 может ожидаться только от устройств, работающих сотовой и более поздней, что в настоящее время означает только планшеты. Если вам нужен H.264, вы должны протестировать неудачу подготовки и сообщить пользователю, что устройство не поддерживается или лучше блокировать устройства без использования H.264 с использованием рыночных фильтров. Или вы можете скомпилировать ffmpeg для android – как это делают некоторые другие проекты. Посмотрите на эти ссылки:

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

http://bambuser.com/opensource

FFmpeg на Android

Вы также можете использовать JCodec

Он поддерживает Android и имеет несколько образцов для него. Лучший способ скомпилировать его с Gradle:

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

Но для последних улучшений и исправлений ошибок вам необходимо скомпилировать последние коммиты (до 2016 года не существует новой версии)