Dưới đây là cấu trúc của mã làm việc của tôi để ghi lại video và âm thanh:Sử dụng android MediaRecorder
Câu hỏi: 1) Tại sao CamcorderProfile
cần thiết? setProfile(...)
xuất hiện để đặt thứ nguyên thành bất kỳ thứ gì QUALITY_HIGH cung cấp, nhưng sau đó tôi đặt thứ nguyên tôi muốn với setVideoSize(...)
, sẽ ghi đè thứ nguyên này. Tuy nhiên, khi tôi xóa hai dòng CamcorderProfile, ứng dụng gặp sự cố tại setVideoSize(...)
với LogCat E/MediaRecorder(19526): setVideoSize called in an invalid state: 2
.
2) Làm thế nào để không ghi lại âm thanh? Tài liệu nêu rõ rằng nếu setAudioSource(...)
không được gọi, sẽ không có bản âm thanh. Tuy nhiên, khi tôi xóa dòng đó, ứng dụng gặp sự cố tại setProfile(...)
với LogCat E/MediaRecorder(19946): try to set the audio encoder without setting the audio source first
.
3) Nếu tôi xóa cả hai dòng CamcorderProfile và đường dây setAudioSource(...)
, nó đổ vỡ như trong 1).
4) Tôi cũng đã thử thêm dòng
recorder.setOutputFormat(OutputFormat.DEFAULT);
thay vì các dòng CamcorderProfile. Nhưng giờ nó bị treo ở số perpare()
. Nếu setAudioSource(...)
được gọi là LogCat là: E/MediaRecorder(20737): audio source is set, but audio encoder is not set
nếu nó không được gọi là LogCat là: E/MediaRecorder(20544): video source is set, but video encoder is not set
Tôi đã nhìn allover internet và tôi không thể tìm thấy một ví dụ tốt về cách chính xác để thiết lập các MediaRecorder. Here nó ngụ ý sau khi API 8 bạn nên sử dụng lớp CamcorderProfile, nhưng có vẻ như với tôi rằng nó đang gây ra vấn đề.
Mọi trợ giúp sẽ tuyệt vời! Cảm ơn!
Mã (mà hoạt động khi chạy vì nó là dưới đây):
recorder = new MediaRecorder();
recorder.setCamera(<<camera>>);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(profile);
recorder.setOutputFile(<<Path String>>);
recorder.setVideoSize(<<Width>>, <<Height>>);
recorder.setPreviewDisplay(<<Surface>>);
recorder.setOrientationHint(0);
recorder.setMaxDuration(10000);
recorder.setOnInfoListener(this);
try
{
recorder.prepare();
recorder.start();
} catch ...
Bạn chính xác, giống như tôi đã đăng, tôi tìm thấy mã cho hàm 'setProfile()'. Nó luôn gọi 'setAudioEncoder()' vì vậy nếu bạn không đặt nguồn âm thanh thì nó sẽ bị lỗi. Câu trả lời là sao chép chức năng này, theo cách đó bạn vẫn có thể sử dụng các cài đặt 'CamcorderProfile' được xây dựng sẵn nhưng cũng chọn cài đặt bạn muốn đặt (tức là âm thanh). Cảm ơn – jacobianism
Vâng, nếu bạn muốn sử dụng Máy quay phim để chỉ có video, bạn cũng có thể làm điều đó. Theo cách đó, bạn có thể nhận được các giá trị có sẵn tối ưu cho bất kỳ thiết bị nào mà không cần phải mã hóa chúng. –
Sau rất nhiều tìm kiếm bài đăng của bạn được thực hiện trong ngày của tôi. Đặt setVideoSize trước setVideoEncoder và setAudioEncoder thực hiện thủ thuật. Cảm ơn – gtsouk