2013-04-23 54 views
6

Tôi hiện đang sử dụng onPreviewCallback để tôi có thể chụp khung hình từ máy ảnh khi xem trước và truyền trực tuyến qua http.Giữ gọi lại xem trước trong khi quay video?

Điều đó có tác dụng nhưng sau đó tôi đưa ra lệnh để bắt đầu ghi và có vẻ như tôi không còn gọi lại xem trước nữa.

Vì vậy, làm cách nào để giữ cuộc gọi lại xem trước để tôi có thể gửi cả khung từ bề mặt đến máy chủ của mình VÀ quay video trên thiết bị?

Trả lời

5

Tôi không làm việc trong thời gian khá dài với Android Camera. Tuy nhiên, như tôi nhớ

1) onPreviewCallback không được gọi trong khi bạn đang ghi

Nó đề cập đến trong vài câu hỏi:

Camera onPreviewFrame not called How to show real time filtered camera preview while recording videos?

2) tôi thấy rằng nó đã được xử lý trong SipDroid và một số ứng dụng khách Android SIP khác theo cách này (đây là 1-2 năm trước, vì vậy phương pháp này có thể lỗi thời):

  • Một đường ống đã được tạo ra
  • Ổ cắm của ống được bọc trong FileDescriptor và được chuyển đến MediaRecorder setOutputFile
  • Ổ cắm của ống được đọc liên tục trong một sợi.
  • Bằng cách này, bạn có thể nhận nội dung được ghi vào một tệp
  • Bây giờ, vấn đề cách xử lý nội dung (vì mã hóa H.263 hoặc H.264 và có thể được trộn lẫn với âm thanh, nếu bạn ghi lại video bằng âm thanh).
  • Đã có một số thuật toán heuristical đó phân tích nội dung (tuy nhiên, đó là đau ở ass)

3) Bạn có thể sử dụng onPreviewFrame + bắt đầu AudioRecorder và mã hóa nó cho mình (sử dụng ffmpeg hoặc một cái gì đó như thế) để mp4 tập tin. Bằng cách này bạn không cần phải bắt đầu ghi MediaRecorder.

1

Khi tôi nhận được máy ảnh và MediaRecorder để bắt đầu và dừng quay mà không gặp sự cố (không dễ), tôi vẫn gặp sự cố như bạn đã mô tả, nơi cuộc gọi lại sẽ ngừng gọi.

Sửa lỗi cuối cùng tôi tìm thấy là thêm lệnh gọi tới setPreviewCallback sau phương thức mediaRecorder.start() và một phương thức khác sau mediaRecorder.stop(). Không chắc chắn nếu điều này là chính xác, nhưng nó làm việc trên Razr M tôi đang thử nghiệm trên.

2

Bạn có thể gọi các phương pháp sau recorder.start đa phương tiện() được gọi như sau:

camera.reconnect(); 
camera.setPreviewCallback(); 
surfaceview.getHolder().addCallback(); 

Lý do:

  1. Sau camera.unlock() được gọi, quá trình khác (đây là quá trình ghi phương tiện) có thể sử dụng máy ảnh; khi quá trình được thực hiện, bạn phải kết nối lại với máy ảnh, sẽ lấy lại khóa và cho phép bạn tiếp tục sử dụng máy ảnh.
  2. Và sau đó đăng ký lại cuộc gọi dữ liệu khung surfaceview sau khi máy ảnh kết nối lại, vì một số trạng thái của nó có thể bị thay đổi sau khi kết nối lại.

Tôi đã từng là vấn đề tương tự như của bạn trong đơn đăng ký của tôi và tôi đã khắc phục sự cố này. Hy vọng nó có thể giải quyết vấn đề của bạn!

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