在Android的H264编码器?

我试图修复一个简单的video录制应用程序*时遇到了一些问题。 我想我正确地按照步骤顺序。 以下是给我的问题的部分代码的简化。 一旦按下button,该代码仅作为callback执行:

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

这里我不明白的重要的事情是,每当我把video编码器是MPEG_4_S它的作品。 另一方面,每当我把编码器是H264它只是没有。 问题是,这段代码只是一个更大的项目的一部分,其余的这种预计这个video编码与h264。

我正在testing三星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) 

*实际上,这个应用程序比这个更复杂一些,因为它也通过局域网传输video,但是我所关心的这个部分与此无关。 您可以在这里查看这个互动项目: http : //code.google.com/p/ipcamera-for-android/

Solutions Collecting From Web of "在Android的H264编码器?"

正如你已经写过H.264编码支持,只能从运行蜂窝的设备和更高版本,目前只意味着平板电脑。 如果你需要H.264,你应该testing准备失败 ,告诉用户该设备不支持或更好地阻止没有使用H.264市场filter的设备。 或者你可以编译Android的ffmpeg – 像其他几个项目一样。 看看这些链接:

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

http://bambuser.com/opensource

Android上的FFmpeg

你也可以使用JCodec

它支持Android,并有less量样品。 用Gradle编译的最好方法是:

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

但是对于最新的改进和错误修复,您需要从最新的提交进行编译(2016年还没有新的版本)