录制视频时保持预览回调?

时间:2013-04-23 08:09:47

标签: android camera android-mediarecorder

我目前正在使用onPreviewCallback,因此我可以在预览时从相机捕获帧并通过http流式传输。

虽然有效,但后来我发出命令开始录制,似乎我没有预览回调了。

那么,如何保留预览回调,以便我可以将帧从表面发送到我的服务器并在设备上录制视频?

3 个答案:

答案 0 :(得分:5)

我在Android相机上工作了很长时间。但是,我记得

1)录制时未调用onPreviewCallback

在几个问题中提到过:

Camera onPreviewFrame not called How to show real time filtered camera preview while recording videos?

2)我看到它是在SipDroid和其他几个Android SIP客户端跟进的情况下处理的(这是1 - 2年前,因此这种方法可能已经过时):

  • 创建了一个管道
  • 管道的接收套接字包装在FileDescriptor中并传递给MediaRecorder setOutputFile
  • 不断在线程中读取管道的发送套接字。
  • 这样您就可以收到写入文件的内容
  • 现在,问题是如何处理内容(因为,它是H.263或H.264编码并且可以与声音混合,如果你用声音录制视频)。
  • 有一些启发式算法可以解析内容(但是,它的屁股很痛苦)

3)您可以使用onPreviewFrame +启动AudioRecorder并自行编码(使用ffmpeg或类似的东西)到mp4文件。这样您就不需要启动MediaRecorder录制。

答案 1 :(得分:1)

您可以在调用media recorder.start()之后调用这些方法:

camera.reconnect();
camera.setPreviewCallback();
surfaceview.getHolder().addCallback();

原因:

  1. 调用camera.unlock()后,另一个进程(这里是媒体记录器进程)可能会使用摄像头;完成此过程后,您必须重新连接相机,重新获取锁定并允许您继续使用相机。
  2. 然后在摄像机后重新注册surfaceview帧数据回调 重新连接,因为重新连接后可能会更改某些状态。
  3. 我的应用程序中出现了与您相同的问题,我通过此修复了问题。希望它可以解决你的问题!

答案 2 :(得分:0)

一旦我让相机和MediaRecorder开始并停止录制而不会崩溃(这并不容易)我仍然遇到了你所描述的问题,预览回调将停止被调用。

我最终发现的修复是在mediaRecorder.start()之后添加对setPreviewCallback的调用,在mediaRecorder.stop()之后添加另一个调用。不确定这是否正确,但它对我正在测试的Razr M起作用。