0

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

当 CamcorderProfile 设置为 QUALITY_LOW 时,我有一段工作代码,但是同样的代码会导致设备崩溃(需要重新启动才能恢复),Camcorder Profile 更改为 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

原始形式的代码也会导致记录器崩溃(LOGCAT:http ://pastebin.com/L2ahkj82 )Mediarecorder#start(),我不得不使用这个线程中的建议来应用三星特定的修复;“ [Q] 无法在 Galaxy Sii 上录制高清视频”; 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 商店中还有其他支持 1920x1080 的应用程序,它们可以在来自第 3 方的 S2 上运行(他们可能无法访问三星专有文档),因此应该可以通过显式设置每个参数来复制 QUALITY_HIGH,或者揭开三星的无证bf*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 进行测试。

相关的 SO 问题

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

使用 Android MediaRecorder 录制的视频在三星 Galaxy S2 上已损坏”

三星 Galaxy SIII mediaRecorder() 问题。(腐败视频)

可能的解决方案

这个 SO question and answer 似乎解决了同样的问题,但我无法使用给出的代码示例复制他们的结果; CamcorderProfile.QUALITY_HIGH 分辨率产生绿色闪烁视频

xda上有一个帖子的链接,里面有一些详细的分析

4

2 回答 2

0

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

于 2013-11-06T09:01:09.360 回答
0

我设法从 Shawn Every 的“Android Pro Media”中获得了示例代码,并在此处提供了一些帮助,此处进行了讨论

主要问题是使用三星无证参数废话,以及将 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
于 2013-11-06T12:23:45.060 回答