Я использую 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 возвратил пустой указатель"
Я пытаюсь сделать то же самое. Основываясь на обсуждениях здесь и здесь, похоже, что людям не повезло получить 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
, поэтому я не могу рекомендовать этот путь.