【发布时间】:2013-11-24 01:09:12
【问题描述】:
我正在尝试通过相机的 PreviewCall back(onPreviewFrame) 使用 MediaCodec 对每秒 30 帧的视频进行编码。我编码的视频总是播放得很快(这是不希望的)。 因此,我尝试通过设置一个 int frameCount 变量来记住它的计数来检查进入我的相机预览的帧数。我期望的是每秒 30 帧,因为我将相机的预览设置为 30 fps 预览(如下所示)。我回来的结果不一样。 我调用了 onPreviewFrame 回调 10 秒,我得到的 frameCount 数只有 100 帧左右。这很糟糕,因为我期待 300 帧。我的相机参数设置正确吗?这是Android相机预览回调的限制吗?如果这是对Android Camera的预览回调的限制,那么还有没有其他的camera回调可以以每秒30帧的速度返回camera的图像数据(nv21,yuv,yv12)?
感谢您阅读并花时间提供帮助。我将不胜感激任何 cmets 和意见。
这是一个使用相机的 onPreviewFrame 编码的视频示例:
http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPictureSize(previewWidth,previewHeight);
parameters.setPreviewSize(previewWidth, previewHeight);
// parameters.setPreviewFpsRange(30000,30000);
parameters.setPreviewFrameRate(30);
mCamera.setParameters(parameters);
mCamera.setPreviewCallback(previewCallback);
mCamera.setPreviewDisplay(holder);
【问题讨论】:
-
不同的设备有不同的功能。 30fps 是否在 developer.android.com/reference/android/hardware/… 返回的范围内?
-
我的设备返回了 5000-30000 的范围,我想我现在的问题是如何固定速率以使其不会一直变化?
-
除了camera onPreviewFrame回调还有其他方法可以获取camera frame数据吗?
-
您可以像 OpenCV 一样使用本机摄像头接口,而不是 onPreviewFrame(),但它并不更可靠、速度不快且不受官方支持。它不会克服可变范围问题。如果你可以使用硬件编码器,我只推荐这种方式用于视频录制,它可以读取内核地址空间中的相机缓冲区。
标签: android android-camera android-mediacodec