6

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

这行得通,但随后我发出一个开始录制的命令,而且似乎我不再有预览回调了。

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

4

3 回答 3

5

我很长一段时间都没有使用 Android 相机。然而,据我记忆

1) 录制时不会调用 onPreviewCallback

它在几个问题中提到:

未调用相机 onPreviewFrame 如何在录制视频时显示实时过滤的相机预览?

2)我看到它是在 SipDroid 和其他几个 Android SIP 客户端中处理的(这是 1-2 年前,所以这种方法可能已经过时了):

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

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

于 2013-04-28T01:28:01.277 回答
1

您可以在调用 media recorder.start() 后调用这些方法,如下所示:

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

原因:

  1. 调用camera.unlock()后,另一个进程(这里是媒体记录器进程)可能会使用摄像头;该过程完成后,您必须重新连接到相机,这将重新获得锁定并允许您继续使用相机。
  2. 然后在相机重新连接后重新注册surfaceview帧数据回调,因为重新连接后它的某些状态可能会改变。

在我的应用程序中,我曾经遇到过和你一样的问题,我通过这个解决了它。希望它能解决你的问题!

于 2016-01-04T10:08:30.613 回答
0

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

我最终找到的修复是在 mediaRecorder.start() 之后添加对 setPreviewCallback 的调用,在 mediaRecorder.stop() 之后添加另一个调用。不确定这是否正确,但它适用于正在测试的 Razr MI。

于 2013-05-28T10:26:58.477 回答