Android: я хочу записать дополнительный канал видео низкого качества и отправить его в отдельных пакетах. Является ли это возможным? Как бы вы подошли к этому? - PullRequest
5 голосов
/ 15 февраля 2012

По сути, я хочу иметь возможность посылать несколько секунд с задержкой «живого» фида менее чем за 3g.Это нормально, если это очень низкое качество.При необходимости я мог бы даже использовать 4-битную шкалу серого (хотя 128-256 цветов было бы предпочтительнее).Я был бы готов пойти так низко, как 160x120 при> 1fps, если это необходимо.Полностью несжатый при этих самых грубых настройках означает пересыщенное соединение с низкой пропускной способностью.

Стоит ли рассматривать просто снимки как изображения?Кто-нибудь знаком с возможностями Bitmapfactory в отношении файлов JPEG самого низкого качества?

Стоит ли смотреть на PNG или GIF?Насколько я понимаю, твердые поля работают лучше с ними.Я не уверен, что могу сильно зависеть от сплошных полей, кроме хорошей части неба, так как я стремлюсь контролировать беспилотник, который посылает обратно «видео».Поддельное видео с задержкой в ​​несколько секунд прекрасно и даже предпочтительнее, так как я ожидаю частой потери и восстановления подключения к серверу.

Я получаю 128К на «3g» с приличным сигналом, но не могу точно зависеть оттот.Я могу выполнить любое необходимое декодирование на стороне сервера - это не должно быть проблемой.

Поэтому я прошу вас, Stack, вы хотите видеть со своего смартфона через Интернет и не можете зависеть от хорошего соединения.Как вы к этому подходите?

1 Ответ

1 голос
/ 21 мая 2012

Я думаю, что самым простым подходом будет захват изображений предварительного просмотра и их отправка.

Вот хороший фрагмент кода, который я нашел для захвата изображения предварительного просмотра в формате JPEG.Это красиво и быстро и должно соответствовать вашим потребностям.Я также использовал его для загрузки, так что мне нужен был очень маленький размер файла.

При выводе изображений 1920x1080 размер файла был где-то между 150-300 КБ.

    camera.setOneShotPreviewCallback(new PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                try {
                    Camera.Parameters parameters = camera.getParameters();
                    Size size = parameters.getPreviewSize();
                    YuvImage image = new YuvImage(data, parameters.getPreviewFormat(),
                            size.width, size.height, null);
                    File file = new File(getCacheDir().getPath() + "/out.jpg");
                    FileOutputStream filecon = new FileOutputStream(file);
                    image.compressToJpeg(
                            new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
                            filecon);
                } catch (FileNotFoundException e) {
                }
            }
        });

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

Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
imageWidth = previewSizes.get(0).width;
imageHeight = previewSizes.get(0).height;
parameters.setPreviewSize(imageWidth, imageHeight);
camera.setParameters(parameters);
...