2015-05-29 35 views
5

Tôi biết câu hỏi này đã được hỏi trước, tuy nhiên, tôi không thể tìm thấy bất kỳ giải pháp nào hoạt động.Nexus 6 Camera phía trước lộn ngược

Máy ảnh mặt trước Nexus 6 luôn hiển thị lộn ngược trong ứng dụng của tôi. Một số giải pháp là sử dụng "setDisplayOrientation", lật máy ảnh trên màn hình. Tuy nhiên, chúng tôi mã hóa video với frames nhận được từ onPreviewFrame.

Theo số Android SDK Documentation, setDisplayOrientation không thực sự thay đổi byte[] trong onPreviewFrame.

Điều này không ảnh hưởng đến thứ tự của mảng byte được truyền trong onPreviewFrame (byte [], Camera), ảnh JPEG hoặc video đã ghi. Phương thức này không được phép gọi trong khi xem trước.

Nếu nó không phải là tốt để có được camera phía trước Nexus 6onPreviewFrame khung trong correct orientation, các fastest cách để lật từng khung hình, mà không bị tụt fps là gì.

Cảm ơn!

+0

Bạn có thể hiển thị mã của mình không? – Raptor

+0

Tôi không thể .. Hoạt động của máy ảnh có một vài dòng 1000 mà tôi cần phải trải qua. Có thực sự không có gì đặc biệt về nó mặc dù. Đặt kích thước xem trước 720p trên máy ảnh mặt trước bằng cách sử dụng api Camera ban đầu (Not Camera2). Camera phía trước trên Nexus 6 là điện thoại duy nhất mà chúng tôi đã thấy. Tìm kiếm nhanh trên Google cho thấy đó là lỗi Nexus 6. Ngay cả Instagram và Snapchat đã có vấn đề này tại một số điểm (mặc dù họ dường như đã cố định nó). Tôi nghi ngờ họ cần các khung hình thô từ onPreviewFrame mặc dù. – tylerjroach

+0

Tôi sẽ cố gắng phát triển Nexus 6 vào ngày mai và tạo ứng dụng máy ảnh bị tước xuống với sự cố. Đây là ưu tiên hàng đầu của một người nổi tiếng gần đây đã sử dụng ứng dụng và .. tất nhiên anh có Nexus 6. – tylerjroach

Trả lời

2

Tôi đã có thể giải quyết vấn đề này và giữ fps cao bằng cách sử dụng mở cv để lật khung.

yuvimage = opencv_core.IplImage.create(frame.getWith/2, frame.getHeight/2 * 3/2, IPL_DEPTH_8U, 1); 
yuvimage.getByteBuffer().clear(); 
yuvimage.getByteBuffer().put(halveYUV420(frame.getData(), frame.getWidth(), frame.getHeight())); 
rgbimage = opencv_core.IplImage.create(frame.getWidth/2, frame.getHeight/2, IPL_DEPTH_8U, 3); 
rgbimage.getByteBuffer().clear(); 
opencv_imgproc.cvCvtColor(yuvimage, rgbimage, opencv_imgproc.CV_YUV2BGR_NV21); 
opencv_core.cvFlip(rgbimage, rgbimage, 0); 
+0

bạn đã thực hiện thay đổi này chỉ cho nexus 6 hay bất kỳ thiết bị nào khác có vấn đề này? –

3

Đoạn mã dưới Camera.setDisplayOrientation() giải quyết vấn đề này cho tôi. Bạn cần phải thử nó.

+0

Rất tiếc, phương thức này không hoạt động đối với khung xem trước nhận được trong onPreviewFrame. "Điều này không ảnh hưởng đến thứ tự của mảng byte được truyền trong onPreviewFrame (byte [], Camera), ảnh JPEG hoặc video đã ghi. Phương pháp này không được phép gọi trong khi xem trước". Tôi đã có thể làm cho nó hoạt động với giải pháp của tôi ở trên. Cảm ơn vì đầu vào của bạn! – tylerjroach

0

Cách nhanh nhất là thực hiện thao tác lật bên trong chính GPU. Hiển thị xem trước máy ảnh trên GLSurfaceView và sử dụng các trình đổ bóng đỉnh để lật ngược hình ảnh. Sau đó, sử dụng glReadPixels để nhận các byte của khung hiện tại. Tôi không chắc chắn về hiệu suất của glReadPixels trên các điện thoại khác, nhưng, nó sẽ khá nhanh trong Nexus 6/5.

+0

Cảm ơn bạn đã phản hồi. Điều này trông giống như một giải pháp hợp lệ, tuy nhiên, tôi đã cố định vấn đề trong câu trả lời của tôi (mà không cần nhấn một lần đến fps) với JavaCV. Thư viện này đã được sử dụng để xử lý video. Cảm ơn vì giải pháp của bạn! – tylerjroach

Các vấn đề liên quan