Android中的H264编码器?

11

我在尝试修复一个简单的视频录制应用程序时遇到了一些问题*. 我认为我按照步骤的顺序来执行了。以下是给我带来问题的代码部分的简化版本。此代码仅在按下按钮后作为回调执行:

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编码的视频。

顺便说一下,我正在三星Galaxy I-7500上进行测试,运行的是froyo。我认为Galaxy I-9000也有同样的问题。

对我而言令人困惑的是,根据这里的文档:http://developer.android.com/guide/appendix/media-formats.html,不应支持MPEG_4_SP编码,而H264从honeycomb开始支持。那么为什么使用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/


请注意,任何给定的移动设备可能支持表格中未列出的其他格式或文件类型。 - Stefan H Singer
1
设备支持 H.264 录制吗?您可以使用设备上的默认相机或随 Android 源代码提供的相机应用进行测试。您还可以尝试将音频编解码器格式更改为 AAC,而不是 AMR。因为文档中说它只能与 AAC 结合使用(此信息在您提供的链接中)。 - bluefalcon
2个回答

7
您已经提到,只有运行honeycomb及更高版本的设备才支持H.264编码,目前只有平板电脑符合此要求。如果您需要H.264,您应该测试prepare failed并告诉用户该设备不受支持,或更好地使用市场过滤器阻止不支持H.264的设备。或者,您可以为Android编译ffmpeg,就像其他几个项目所做的那样。请查看以下链接:

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

http://bambuser.com/opensource

FFmpeg on Android


0

你也可以使用JCodec

它支持Android,并且有一些示例。 使用Gradle编译它的最佳方法是:

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

但是,如果您需要最新的改进和错误修复,则需要从最新的提交中进行编译(自2016年以来还没有新版本发布)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接