BitmapFactory.decodeByteArray () возвращает ПУСТОЙ УКАЗАТЕЛЬ

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

private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback() 
{
        public void onPreviewFrame( byte[] data, Camera Cam ) {
                Log.d("CombineTestActivity", "Preview started");
                Log.d("CombineTestActivity", "Data length = " 
                        + data.length );
                currentprev = BitmapFactory.decodeByteArray( data, 0, 
                        data.length );

               if( currentprev == null )
                   Log.d("CombineTestActivity", "currentprev is null" );

                Log.d("CombineTestActivity", "Preview Finished" );

        }
};

длина данных всегда стала otu то же 576 000.

Также я попытался изменить параметры камеры, таким образом, изображение возвращается как различные форматы. Вот то, на что похоже, когда я делаю это.

mCamera = Camera.open();
camParam = mCamera.getParameters();
camParam.setPreviewFormat( ImageFormat.RGB_565 );
mCamera.setParameters( camParam );
    mCamera.setPreviewCallback( mPrevCallback );

Однако и когда я изменяю формат предварительного просмотра и когда я оставляю его как его значение по умолчанию NV21, BitmapFactory.decodeByteArray возвращается как пустой указатель. Я также попытался изменить формат предварительного просмотра на тип JPEG. Я даже получаю оператор отладки в ddms, это - то, что я получаю

"D/skia (14391):---SkImageDecoder:: Factory возвратил пустой указатель"

20
задан Pentium10 27 July 2010 в 11:00
поделиться

1 ответ

Я пытаюсь сделать то же самое. Основываясь на обсуждениях здесь и здесь, похоже, что людям не повезло получить decodeByteArray() для обработки формата NV21 с Android 2.1/2.2.Это определенно не работает в моем эмуляторе или на моем Droid Incredible, хотя я думаю, что это вызывает собственный код, поэтому он может работать на некоторых телефонах в зависимости от драйверов?

В качестве альтернативы вы можете попробовать декодировать NV21 самостоятельно в Java (см. ссылку выше для примера), хотя, по-видимому, он слишком медленный, чтобы его можно было использовать в большинстве случаев. Мне не очень повезло, пытаясь заставить CameraPreview отправлять другой формат, и я ожидаю, что это будет проблематично при попытке написать код, переносимый на другое оборудование. Если вы написали методы декодирования NV21 в NDK, вы можете немного увеличить частоту кадров.

По-видимому, при попытке обработки CameraPreview возникают проблемы со стабильностью из-за условий гонки, хотя я сам не подтверждал наличие этой проблемы. Я думаю, вы могли бы избежать этого, а также немного увеличить частоту кадров, используя метод обратного вызова буферизованного предварительного просмотра setPreviewCallbackWithBuffer(), который был добавлен в Android 2.1/2.2. Это было добавлено в 2.1, но оставалось скрытым до 2.2. Чтобы использовать его в версии 2.1, вам нужно взломать укрытие.

Некоторые люди предлагают использовать MediaRecorder вместо CameraPreview. К сожалению, MediaRecorder предоставляет еще меньше возможностей для получения кадров предварительного просмотра, чем CameraPreview, поэтому я не могу рекомендовать этот путь.

3
ответ дан 29 November 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: