使用QUALITY_HIGH在samsung S2上调用mediaRecorder.stop()时崩溃

时间:2013-11-06 08:56:49

标签: android samsung-mobile mediarecorder android-mediarecorder

我正在尝试使用MediaRecorder对象来记录我的设备上可用的最高质量的视频,即三星S2。但是使用我当前的代码,我在调用MediaRecorder.close()时看到挂起,然后手机崩溃(LOGCAT:http://pastebin.com/yzqWqta3

当CamcorderProfile设置为QUALITY_LOW时,我有一段工作代码,但是同样的代码导致设备崩溃(需要重启电源),摄像机配置文件更改为QUALITY_HIGH。

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);

以及之后设置为记录器对象;

recorder.setProfile(camcorderProfile);

但是,在调用MediaRecorder.stop()之后,以下内容会导致崩溃;

camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

我的代码基于这个项目(来自Android Pro Media的人 - Shawn van Every)https://github.com/vanevery/Custom-Video-Capture-with-Preview.git

原始形式的代码也导致录像机在Mediarecorder#start()上崩溃(LOGCAT:http://pastebin.com/L2ahkj82),我不得不使用此线程中的建议来应用三星特定的修复程序;  “[问]无法在Galaxy Sii上录制Hi Def视频”; http://forum.xda-developers.com/showthread.php?t=1104970&page=8

 Camera.Parameters p = camera.getParameters();

 // http://forum.xda-developers.com/showthread.php?t=1104970&page=8
 p.set( "cam_mode", 1 ); // green mess in video file without this
 p.setFocusMode(Parameters.FOCUS_MODE_AUTO);    // works  

 p.setPreviewSize(camcorderProfile.videoFrameWidth, camcorderProfile.videoFrameHeight);
 p.setPreviewFrameRate(camcorderProfile.videoFrameRate);

 camera.setParameters(p);
 camera.setDisplayOrientation(0);

 camera.setPreviewDisplay(holder);
 camera.startPreview();

然而,使用上面的代码我得到了崩溃,或者应用程序停止响应; LOGCAT http://pastebin.com/D7Ap7yQZ

检查设备支持1920/1080或QUALITY_HIGH一般

库存相机应用程序支持在1920x1080内以“超精细”的方式录制,但分辨率是明确设置的,我猜相应的参数是从已知的良好设置推断出来的,而不是来自QUALITY_HIGH CamcorderProfile

然而,Play商店中有other apps支持1920x1080,可以从第三方(可能无法访问三星专有文档)在S2上工作,因此应该可以通过以下方式复制QUALITY_HIGH:明确设置每个参数,或者发现三星未记录的bef * ckery。

设备内省

三星SII似乎支持使用QUALITY_HIGH;

Log.v(LOGTAG, "has Profile QUALITY HIGH? : "+ 
CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH));

返回此内容;

V/VIDEOCAPTURE( 7897): has Profile QUALITY HIGH? : true

和Android文档表明“QUALITY_HIGH”是一个预定义的配置文件,表示与最高可用分辨率相对应的级别。

int   QUALITY_HIGH    Quality level corresponding to the highest available resolution.

http://developer.android.com/reference/android/media/CamcorderProfile.html#QUALITY_HIGH

注释

  1. 今天早上我的工厂重置了手机
  2. 我尝试了另一种SD卡,并在同一个地方遇到同样的崩溃
  3. 这可能是硬件问题。我还没有找到另一个三星S2进行测试。
  4. 相关SO问题

    还有其他有关在三星S2上录制HIGH QUALITY视频的问题,但没有一个有答案,所以我创建了这个以捕捉我的日志和代码

    Video recorded with Android MediaRecorder is corrupted on Samsung Galaxy S2"

    Samsung Galaxy SIII mediaRecorder() issues. (Corrupt Video)

    可能的解决方案

    这个问题和答案似乎解决了同样的问题,但我不能使用给出的代码示例来复制他们的结果; CamcorderProfile.QUALITY_HIGH resolution produces green flickering video

    指向thread on xda的链接,其中包含一些详细的分析

2 个答案:

答案 0 :(得分:0)

可能是您的三星S2不支持高品质!
请参阅此post 有一种方法可以迭代支持的配置文件,在设置质量之前尝试这样做。

答案 1 :(得分:0)

我设法从Shawn Every的“Android Pro Media”中获取示例代码,并在here和dicussion here

的帮助下工作

主要问题是使用三星未记录的参数废话,并将PreviewSize设置为与视频帧大小相同;评论如下;

Camera.Parameters p = camera.getParameters();

// Samsung Galaxy hack for HD video
p.set("cam_mode", 1);

// It is required to set the previewSize tto the same as the Video frame height x width
p.setPreviewSize(camcorderProfile.videoFrameWidth,
                    camcorderProfile.videoFrameHeight);


...</snip>

camera.setParameters(p);

这是示例代码(由于此时仿真器限制,它只能在真实设备上运行)

https://github.com/tolland/Custom-Video-Capture-with-Preview

生成具有这些属性的文件;

$ mplayer -vo null -ao null -frames 0 -identify videocapture-2024713075.3gp | egrep "(ID_VID)"
...
ID_VIDEO_ID=0
ID_VIDEO_FORMAT=H264
ID_VIDEO_BITRATE=13773800
ID_VIDEO_WIDTH=1920
ID_VIDEO_HEIGHT=1080
ID_VIDEO_FPS=24.750
ID_VIDEO_ASPECT=1.7778
ID_VIDEO_CODEC=ffh264