2013-09-22 63 views
5

Tôi đang cố gắng tạo một ứng dụng quay video ghi lại video trong 24 FPS. Tôi đang sử dụng đoạn mã sau trong một nỗ lực để khóa FPS đến 24:Android - Có thể 'khóa' tốc độ khung hình xem trước của máy ảnh không?

Camera.Parameters params = mCamera.getParameters(); 
params.setPreviewFrameRate(24); 
params.setPreviewFpsRange(24000, 24000); 

Và cũng là CamcorderProfile sau đó được sử dụng với MediaRecorder:

CamcorderProfile ccp = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
ccp.videoFrameRate = 24; 

Thật không may, nó chỉ hoạt động khi video được chụp trong điều kiện ánh sáng yếu, nhưng khi tôi ra ngoài khi có ánh sáng, video bắt đầu quay ở 30 FPS.

Có thể khóa tốc độ khung hình xuống còn 24 khung hình/giây trong ánh sáng ban ngày không?

Cảm ơn trước!

+0

Tôi có thể hỏi tại sao bạn muốn khóa ở tốc độ 24 khung hình/giây? 29,97 FPS là phổ biến hơn bây giờ một ngày cho hầu hết các ứng dụng. Đây có lẽ là cái gì bạn có thể làm phía máy chủ? Tôi không biết bản chất của ứng dụng của bạn, vì vậy xin lỗi nếu những câu hỏi này không có ý nghĩa. – blindstuff

+0

Điều tôi muốn đạt được là chất lượng giống như phim. Tôi đã nhận thấy rằng máy ảnh chụp chất lượng cao hơn nhiều trong FPS thấp hơn. Nó thực sự khó giải thích, nhưng khi bạn xem một video 24 fps và bạn so sánh nó với một video 29 ​​fps, nó trông khác nhau một cách tốt hơn. – MrByte

Trả lời

0

Có thể bạn chưa khóa cân bằng trắng tự động và phơi sáng tự động. FPS có thể bị ảnh hưởng bởi môi trường. Hãy thử đến setAutoExposureLock(true)setAutoWhiteBalanceLock(true).

+0

Cảm ơn câu trả lời của bạn, mặc dù nó đã thực hiện thủ thuật trong một tình huống (khi video được chụp ở điều kiện thiếu sáng), nó chỉ tốt cho một số tình huống nhất định. Ví dụ: nếu người dùng muốn quay video trong nhà của anh ấy và sau đó anh ấy muốn ra ngoài khi có ánh sáng, máy ảnh sẽ chỉ hiển thị "màn hình trắng". Ngoài ra, nếu người dùng đang quay video khi có nhiều ánh sáng, FPS sẽ khóa trên 30 thay vì 24 như tôi muốn. – MrByte

1
public List<Integer> getSupportedPreviewFrameRates() 

kiểm tra danh sách này. Tôi cho rằng bạn không thể đặt tốc độ khung hình không được liệt kê ở đó. Có thể do sửa đổi codec được sử dụng trong hệ điều hành Android.

+0

Cảm ơn bạn rất nhiều vì câu trả lời. Tôi đã kiểm tra các giá trị và tôi đã nhận được các giá trị sau: 15000,30000 và 30000,30000.Mục tiêu của tôi là đạt được số lượng chính xác 24 khung hình/giây, vì vậy tôi đã giả định rằng nếu tôi thay đổi giá trị thành 24000, nó sẽ thực hiện mẹo kể từ khi thiết bị của tôi hỗ trợ giá trị này từ 15000 đến 30000. Nhưng, nếu nó không thể sử dụng bất cứ điều gì khác ngoại trừ những giá trị này, là nó thực sự không thể đạt được? – MrByte

1

tôi sẽ đề nghị bạn có một cái nhìn tại MediaRecorder: setCaptureRate (fps kép)

fps: - Tỷ lệ mà tại đó khung nên được bắt trong khung hình mỗi giây

Đối với Truy vấn hỗ trợ: - getPreviewFpsRange (int [])

Xin lưu ý rằng máy ảnh của bạn không thể đảm bảo rằng khung hình sẽ được chụp ở tốc độ nhất định do giới hạn máy ảnh/bộ mã hóa.

+0

Cảm ơn bạn đã trả lời. Chức năng này không được chấp nhận. Tôi đã thử nó nhưng tôi đã không thành công. Tôi đang cố gắng để đạt được số tiền chính xác của fps, không có gì nhiều hơn và không có gì ít hơn. – MrByte

1

Từ trải nghiệm cá nhân trên Android của tôi, tôi thấy có sự phụ thuộc giữa FPS và độ phơi sáng. Tôi đã không kiểm tra nó với WhiteBalance nhưng nó có thể quá.

Sau đó, tại sao bạn không đặt khung hình/giây thành 24 hoặc một số giá trị khác dẫn đến 24 khung hình/giây tại một số điểm. Sau đó, bạn liên tục kiểm tra fps hiện tại, và khi nó là 24fps, sau đó bạn setAutoExposureLock (true) (và setAutoWhiteBalanceLock (true) quá chỉ trong trường hợp). Khung hình/giây sẽ không thay đổi nữa vì các thay đổi về phơi sáng tự động.

+0

Đơn giản và thông minh. Như bạn đã nói, rõ ràng cân bằng trắng đóng một vai trò nhỏ trong FPS quá. Trong trường hợp của tôi khóa tiếp xúc tại một FPS thấp hơn một chút đã làm các trick. –

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