Необходимо понять какой-то код Java

Я довольно новичок в программировании на Android, но я быстро участвую. Поэтому я нашел интересную часть кода здесь: http://code.google.com/p/camdroiduni/source/browse/trunk/code/eclipse_workspace/camdroid/src/de/aes/camdroid/CameraView.java

И речь идет о прямой трансляции с камеры вашего устройства в ваш браузер.

Но я хочу знать, как работает код.

Это то, что я хочу понять:

1) Как они перетекают в веб-браузер. Я понимаю, что они отправляют файл index.html на ip-адрес устройства (на Wi-Fi), и этот файл перезагружает страницу каждую секунду. Но как они отправляют файл index.html на нужный IP-адрес с сокетами?

2) http://code.google.com/p/camdroiduni/wiki/Status#save_pictures_frequently. Здесь они упоминают, что используют видео, но я все еще убежден, что они фотографируют и отправляют их, поскольку я не вижу медиа-рекордер в любом месте ,

Теперь мой вопрос заключается в том, как они продолжают отправлять и сохранять эти изображения в папку SD (я думаю). Я думаю, что это сделано с этим кодом, но как это работает. Как и в c.takepicture, потребуется много времени, чтобы сохранить и начать предварительный просмотр снова, так что это не вариант для livestream.

public synchronized byte[] getPicture() { try { while (!isPreviewOn) wait(); isDecoding = true; mCamera.setOneShotPreviewCallback(this); while (isDecoding) wait(); } catch (Exception e) { return null; } return mCurrentFrame; } private LayoutParams calcResolution (int origWidth, int origHeight, int aimWidth, int aimHeight) { double origRatio = (double)origWidth/(double)origHeight; double aimRatio = (double)aimWidth/(double)aimHeight; if (aimRatio>origRatio) return new LayoutParams(origWidth,(int)(origWidth/aimRatio)); else return new LayoutParams((int)(origHeight*aimRatio),origHeight); } private void raw2jpg(int[] rgb, byte[] raw, int width, int height) { final int frameSize = width * height; for (int j = 0, yp = 0; j < height; j++) { int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; for (int i = 0; i < width; i++, yp++) { int y=0; if(yp < raw.length) { y = (0xff & ((int) raw[yp])) - 16; } if (y < 0) y = 0; if ((i & 1) == 0) { if(uvp<raw.length) { v = (0xff & raw[uvp++]) - 128; u = (0xff & raw[uvp++]) - 128; } } int y1192 = 1192 * y; int r = (y1192 + 1634 * v); int g = (y1192 - 833 * v - 400 * u); int b = (y1192 + 2066 * u); if (r < 0) r = 0; else if (r > 262143) r = 262143; if (g < 0) g = 0; else if (g > 262143) g = 262143; if (b < 0) b = 0; else if (b > 262143) b = 262143; rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff); } } } @Override public synchronized void onPreviewFrame(byte[] data, Camera camera) { int width = mSettings.PictureW() ; int height = mSettings.PictureH(); // API 8 and above // YuvImage yuvi = new YuvImage(data, ImageFormat.NV21 , width, height, null); // Rect rect = new Rect(0,0,yuvi.getWidth() ,yuvi.getHeight() ); // OutputStream out = new ByteArrayOutputStream(); // yuvi.compressToJpeg(rect, 10, out); // byte[] ref = ((ByteArrayOutputStream)out).toByteArray(); // API 7 int[] temp = new int[width*height]; OutputStream out = new ByteArrayOutputStream(); // byte[] ref = null; Bitmap bm = null; raw2jpg(temp, data, width, height); bm = Bitmap.createBitmap(temp, width, height, Bitmap.Config.RGB_565); bm.compress(CompressFormat.JPEG, mSettings.PictureQ(), out); /*ref*/mCurrentFrame = ((ByteArrayOutputStream)out).toByteArray(); // mCurrentFrame = new byte[ref.length]; // System.arraycopy(ref, 0, mCurrentFrame, 0, ref.length); isDecoding = false; notify(); } 

Я действительно надеюсь, что кто-то может объяснить эти вещи как можно лучше. Это было бы очень оценено.

Хорошо, если кто-то интересуется, у меня есть ответ.

Код повторно принимает моментальный снимок из предварительного просмотра камеры, используя setOneShotPreviewCallback () для вызова onPreviewFrame (). Кадр поставляется в формате YUV, поэтому raw2jpg () преобразует его в 32-битный ARGB для jpeg-кодировщика. NV21 – это планарный формат YUV, как описано здесь.

GetPicture () вызывается, предположительно, приложением, и создает данные jpeg для изображения в массиве private byte mCurrentFrame и возвращает этот массив. Что произойдет, если впоследствии это не фрагмент кода. Обратите внимание, что getPicture () выполняет пару wait () s. Это связано с тем, что код сбора изображений работает в отдельном потоке, чем в приложении.

В Основной деятельности публичный статический байт CurrentJPEG получает это: cameraFrame.getPicture (); В public void run (). В этом веб-сервисе он отправляется с сокетом в желаемый ip.

Поправьте меня если я ошибаюсь.

Теперь я все еще удивляюсь, как изображение отображается в браузере как изображение, потому что вы отправляете ему данные байта вправо? Проверьте это: http://code.google.com/p/camdroiduni/source/browse/trunk/code/eclipse_workspace/camdroid/src/de/aes/camdroid/WebServer.java

Ничто в этом коде не отправляет какие-либо данные на какой-либо URL-адрес. Метод getPicture возвращает байтовый массив, который, вероятно, используется в качестве выходного потока в каком-либо другом методе / классе, который затем направляет его в веб-службу через какой-то протокол (вероятно, UDP).