在 android 中使用 nanohttpd 将相机图片流式传输为 mjpeg
camera picture streaming as mjpeg with nanohttpd in android
我创建了一个应用程序并使用 nanohttpd 我可以从 phone 获取信息。我可以在后台打开相机并拍照。但我无法通过 nanohttpd 将其作为 motion jpeg 流式传输。
我已经在网上搜索了答案,但不幸的是,我没有找到任何成功的方法。我找到了很多方法和开源项目(ipweb-cam、spydroid),但它们对我没有帮助。
请帮帮我
对于那些对答案感兴趣并需要一些代码的人,请看这里:
cameraObject.setPreviewCallback(new Camera.PreviewCallback(){
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
try {
if (cameraObject.getParameters().getPreviewFormat() == ImageFormat.NV21) {
timestampBeforecompression = SystemClock.uptimeMillis();
yuvImage = new YuvImage(data, imageFormat, width, height, null);
yuvImage.compressToJpeg(rect, 75, mByteArrayOutputStream);
frameToStream = mByteArrayOutputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(frameToStream, 0, frameToStream.length);
mByteArrayOutputStream.reset();
bitmap = Bitmap.createScaledBitmap(bitmap, 320, 240, true);
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, mByteArrayOutputStream);
frameToStream = null;
frameToStream = mByteArrayOutputStream.toByteArray();
compressionMillis = SystemClock.uptimeMillis() - timestampBeforecompression;
if (125 - compressionMillis > 0) {
SystemClock.sleep(125 - compressionMillis);
}
if (mJpegStream != null) {
mJpegStream.streamJpeg(frameToStream, frameToStream.length, Long.MIN_VALUE);
}
if (mByteArrayOutputStream != null) {
mByteArrayOutputStream.reset();
}
frameToStream = null;
}
} catch (Exception e) {
System.out.println("Oops: " + e.getMessage());
}
}
});
请注意,您可以省略 compressionMillis 和 System.sleep()。我是用它们来控制帧率的,如果有什么误解欢迎留言
我创建了一个应用程序并使用 nanohttpd 我可以从 phone 获取信息。我可以在后台打开相机并拍照。但我无法通过 nanohttpd 将其作为 motion jpeg 流式传输。
我已经在网上搜索了答案,但不幸的是,我没有找到任何成功的方法。我找到了很多方法和开源项目(ipweb-cam、spydroid),但它们对我没有帮助。
请帮帮我
对于那些对答案感兴趣并需要一些代码的人,请看这里:
cameraObject.setPreviewCallback(new Camera.PreviewCallback(){
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
try {
if (cameraObject.getParameters().getPreviewFormat() == ImageFormat.NV21) {
timestampBeforecompression = SystemClock.uptimeMillis();
yuvImage = new YuvImage(data, imageFormat, width, height, null);
yuvImage.compressToJpeg(rect, 75, mByteArrayOutputStream);
frameToStream = mByteArrayOutputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(frameToStream, 0, frameToStream.length);
mByteArrayOutputStream.reset();
bitmap = Bitmap.createScaledBitmap(bitmap, 320, 240, true);
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, mByteArrayOutputStream);
frameToStream = null;
frameToStream = mByteArrayOutputStream.toByteArray();
compressionMillis = SystemClock.uptimeMillis() - timestampBeforecompression;
if (125 - compressionMillis > 0) {
SystemClock.sleep(125 - compressionMillis);
}
if (mJpegStream != null) {
mJpegStream.streamJpeg(frameToStream, frameToStream.length, Long.MIN_VALUE);
}
if (mByteArrayOutputStream != null) {
mByteArrayOutputStream.reset();
}
frameToStream = null;
}
} catch (Exception e) {
System.out.println("Oops: " + e.getMessage());
}
}
});
请注意,您可以省略 compressionMillis 和 System.sleep()。我是用它们来控制帧率的,如果有什么误解欢迎留言