7

Tôi gặp sự cố khi sử dụng MediaRecorder của Android để ghi âm từ micrô sang tệp .m4a (AAC-LC, vùng chứa MPEG-4). Bắt đầu từ mức API 18, tốc độ lấy mẫu mặc định giảm từ 44,1 hoặc 48 kHz (tùy thuộc vào thiết bị) xuống chỉ 8 Hz. Nếu tôi chỉ định tốc độ lấy mẫu bằng cách sử dụng MediaRecorder.setAudioSamplingRate, nó sử dụng tỷ lệ được chỉ định nhưng có rất nhiều tiếng ồn lạ trong bản ghi.Tỷ lệ lấy mẫu và nhiễu của Android MediaRecorder

Trong LogCat, cảnh báo sau đây đang xảy ra bất cứ lúc nào:

(1) Tag: AudioSource Text: AudioRecord báo cáo tràn ngập

(2) Tag: AudioFlinger Text: RecordThread: tràn bộ đệm

Dưới đây là các mã:

MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioChannels(2); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
recorder.setAudioSamplingRate(48000); // if not specified, defaults to 8kHz, if specified 44.1 or 48 kHz, lots of noise 
recorder.setOutputFile("test.m4a"); 

try { 
    recorder.prepare(); 
    recorder.start(); 

} catch (IOException ioe) { 
    Log.e(TAG, "IOException", ioe); 
} catch (IllegalStateException ise) { 
    Log.e(TAG, "IllegalStateException", ise); 
} catch (Exception e) { 
    Log.e(TAG, "Exception", e); 
} 

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Tại sao các bạn cách thiết lập số kênh âm thanh đến 2 khi ghi âm từ micro? – Squonk

+0

Tốt Squonk, cảm ơn, nhưng nó không mattter. Ngay cả khi tôi sử dụng 1 kênh âm thanh, vấn đề vẫn còn đó. Mặc dù vậy, trong LogCat tôi thấy 2 cảnh báo sau xảy ra theo thời gian: (1) AudioSource - AudioRecord báo cáo quá tải (2) AudioFlinger - RecordThread: tràn bộ đệm – Justin

+0

Thử nghiệm với bộ mã hóa và tốc độ khác (22050, 16000). Codec được liệt kê trong tài liệu android "định dạng phương tiện" –

Trả lời

2

Bạn có thể đặt cả SamplingRate (như bạn đã làm) và EncodingBitRate mà bạn đã bỏ qua.

tôi đã có thể để đạt được các bản ghi âm chất lượng rất cao sử dụng như sau:

mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); 
    mRecorder.setAudioSamplingRate(48000); 
    mRecorder.setAudioEncodingBitRate(384000); 

này sẽ mã hóa với 8 bit cho mỗi mẫu, mà có lẽ vượt quá chất lượng có sẵn của micro trên hầu hết các thiết bị này.

+0

Nhưng điều này tạo ra âm thanh rất ồn ào, nó giống như âm thanh cao –

+0

Tôi chưa có trải nghiệm đó và tôi đã sử dụng mã này trên một phạm vi thiết bị hợp lý. Có lẽ một số thiết bị có vấn đề với nó? Bạn đã thử điều chỉnh hoặc (a) 48000 đến 44100, và/hoặc (b) 384000 đến 160000 – karora

+0

Vâng, có lẽ .. nhưng hãy kiểm tra câu trả lời của tôi xuống, nó hoạt động 100%! –

0

Sau một nghiên cứu lâu dài và cố gắng, đây là giải pháp làm việc tốt nhất mà tôi thực hiện:

mRecorder = new MediaRecorder(); 
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
mRecorder.setAudioEncodingBitRate(384000); 
mRecorder.setAudioSamplingRate(44100); 
+0

Nếu chỉ có một số cách để hỏi thiết bị tỷ lệ lấy mẫu phần cứng thực sự là gì, vì vậy bạn có thể chọn 44100 so với 48000 mà không phải tra cứu danh sách tại http: // audiobuffersize. appspot.com/ được biên soạn từ ứng dụng https://play.google.com/store/apps/details?id=com.levien.audiobuffersize – karora

+0

Woah, đó là một danh sách lớn! và vâng tôi ước gì nếu ai đó có thể tìm thấy mã đó! HOẶC, ai đó có thể làm thư viện chứa một mảng thiết bị mô hình với từng Tỷ lệ mẫu và dựa trên điện thoại khởi chạy ứng dụng, nó có thể thiết lập nó từ mảng phải không? –

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