10

我正在构建一个相机应用程序,其中不断捕获视频并将其保存到 SD 卡中。视频很短(几分钟),它们的长度是用 setMaxDuration() 预设的。

整个过程运行良好,而主要活动在前台。但是,当我进行其他活动(例如设置)时,视频录制仅在后台工作,直到达到最大持续时间。文件已保存,但无法启动新序列,因为 prepare() 失败,显然是因为 setPreviewDisplay() 不喜欢没有合适的表面来附加。

我尝试使用虚拟 Surface、虚拟 SurfaceHolder、lockCanvas() 和其他各种技巧,但没有任何效果。有没有办法在没有有效表面的情况下初始化 MediaRecorder?

4

4 回答 4

4

Unfortunately it is still a requirement for you to preview onto a valid surface in order to record video (Android SDK 1.6 thru 2.2). There is an enhancement request logged to remove this restriction http://code.google.com/p/android/issues/detail?id=9570

于 2010-08-05T07:29:56.783 回答
1

您只需要MediaCodec通过添加以下行来创建一个表面:

Surface  mySurface = MediaCodec.createPersistentInputSurface();
mMediaRecorder.setPreviewDisplay(mySurface);

...

mMediaRecorder.prepare();
于 2019-01-15T20:53:49.180 回答
0

我认为IP 网络摄像头应用程序可以做到这一点,虽然我不知道怎么做。也许它只适用于> = 2.3。我不确定我看到它在哪个版本上运行。我问了一个问题以了解它是如何工作的。

于 2011-12-10T02:29:00.267 回答
-1

你在实现 Surface 回调吗?

为什么需要在没有有效表面的情况下初始化 MediaRecorder?

即使您离开主要活动,您也应该进行录制吗?还是在其他活动产生之前记录停止?

于 2010-07-12T08:13:39.927 回答