İlk olarak - bir süredir bunun üzerinde çalışıyor ve birkaç çözüm denedim, bu yüzden bana google'da bulduğunuz ilk bağlantıyı göndermeyin. Yapmam gereken şeyAndroid: kamera önizlemesini geri arama ile nasıl görüntüleyebilirim?
el kamera geri arama kullanarak kameradan önizleme görüntülemek istediğiniz, oldukça basit ve gerçek bir cihazda en az 15fps almak istiyorum. Renklere bile ihtiyacım yok, sadece gri tonlamalı görüntüyü önizlemem gerekiyor. Fotoğraf makinesinin görüntüleri YUV biçimindedir ve bir şekilde işlem yapmanız gerekir, bu da ana performans sorunudur. Ben, bu camera.setPreviewCallback daha hızlıdır) Ben camera.setPreviewCallbackWithBuffer (kullanıyorum Her durumda API 8.
kullanıyorum(). Önizlemeyi görüntülemiyorsam, yaklaşık 24 fps bulamıyorum. Yani sorun yok.
ben bu çözümleri denedim:
1. Ekran kamera önizleme bir Bitmap olarak bir SurfaceView üzerinde. Çalışıyor, ancak performans yaklaşık 6 fps.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
bir doku olarak bir GLSurfaceView üzerinde
2. Ekran kamera önizleme. Burada sadece parlaklık verileri (greyscale image) görüntüleniyordum, ki bu oldukça kolaydır, her karede sadece bir arraycopy() gerektirir. Yaklaşık 12 fps alabiliyorum, ancak önizlemede bazı filtreler kullanmam gerekiyor ve öyle görünüyor ki, OpenGL ES 1'de hızlı bir şekilde yapılamıyor. Bu yüzden bu çözümü kullanamıyorum. Bunun bazı detayları another question. YUV verilerini işlemek için NDK kullanarak (GL) SurfaceView üzerinde
3. Ekran kamera önizleme. Bazı C işlevi ve NDK kullanan bir here çözümü buluyorum. Ama ben onu kullanmayı başaramadım, here some more details. Ama yine de, bu çözüm ByteBuffer'ı OpenGL'de bir doku olarak görüntülemeye döndürmek için yapılır ve önceki denemeden daha hızlı olmayacaktır. Bu yüzden, canvas.drawBitmap() ile çizilebilen int [] dizisini döndürmek için bunu değiştirmek zorundayım, ancak bunu yapmak için C'yi anlamıyorum.
Yani, denediğim denemelerde eksik veya bazı iyileştirmeler yapmanın başka bir yolu var mı?
Cevabınız için teşekkürler!
Teşekkürler, ancak gerçekten geri çağırma ve görüntüleri manuel olarak kullanmam gerekiyor. Sadece gri tonlamalı görüntüye ihtiyacım yok, daha fazla filtre kullanıyorum, bu soruda bahsetmedim ... –