【发布时间】:2016-07-17 05:39:18
【问题描述】:
我使用以下代码设置了预览回调
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(final byte[] bytes, Camera camera) {
if (recording == true) {
count++;
Log.e("frame","frame number is "+count);
if(mThread.isAlive()) {
encode(bytes);
}
}
}
});
我还添加了 10 个回调缓冲区,并且为了打开相机,我使用了另一个线程来提高帧率:
public void newOpenCamera() {
if (mThread == null) {
mThread = new CameraHandlerThread();
}
synchronized (mThread) {
mThread.openCamera();
}
}
private static void oldOpenCamera() {
try {
c = Camera.open(1);
Camera.Parameters parameters = c.getParameters();
parameters.set("orientation", "portrait");
parameters.setJpegQuality(100);
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPreviewSize(640, 480);
for(int i=0;i<10;i++){
byte[] buffer = new byte[(ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())*640*480)/8+1];
c.addCallbackBuffer(buffer);
}
parameters.setPreviewFrameRate(30);
parameters.setPreviewFpsRange(30000,30000);
c.setParameters(parameters);
}
catch (RuntimeException e) {
Log.e("camera", "failed to open front camera");
}
}
public CameraHandlerThread mThread = null;
public static class CameraHandlerThread extends HandlerThread {
Handler mHandler = null;
CameraHandlerThread() {
super("CameraHandlerThread");
start();
mHandler = new Handler(getLooper());
}
synchronized void notifyCameraOpened() {
notify();
}
public void openCamera() {
mHandler.post(new Runnable() {
@Override
public void run() {
oldOpenCamera();
notifyCameraOpened();
}
});
}
}
但结果没有任何变化。 15 秒视频的 onpreviewframe 中的帧数约为 150。有没有办法将帧数固定为 30 fps?
【问题讨论】:
-
任何在软件中对来自相机的大帧数据(即
byte[])进行操作的东西迟早会达到性能极限。你想做什么? -
编码字节并写入文件。
标签: android android-camera android-mediacodec