2010-02-03 15 views
5

Tôi hiện đang sử dụng các lớp AudioTrack và AudioRecord trong Android.Tùy chọn codec AudioRecord và AudioTrack Android?

Tôi sử dụng dữ liệu PCM thuần túy nhưng tôi tự hỏi tùy chọn của mình dành cho các codec khác là gì?

Từ this page có vẻ như tôi chỉ có thể mã hóa và giải mã bằng băng hẹp AMR?

Tôi hiện thiết lập các lớp âm thanh như sau:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        buffersize); 

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        buffersize, 
        AudioTrack.MODE_STREAM); 

Vì vậy, câu hỏi của tôi là làm thế nào để tôi thay đổi mã hóa từ PCM để một trong những codec hỗ trợ khác?

Khi tôi cố gắng thay đổi ENCODING_PCM_16BIT trên AudioFormat, tôi chỉ nhận được các tùy chọn mã hóa mặc định hoặc không hợp lệ cùng với các tùy chọn PCM.

Bất kỳ liên kết nào đến hướng dẫn về mã hóa và giải mã âm thanh trên Android sẽ tuyệt vời nếu có ai biết về bất kỳ hoặc trợ giúp nào ở đây được đánh giá cao.

Cảm ơn

EDIT: Tôi đã thay đổi mã của tôi như sau:

arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        **MediaRecorder.AudioEncoder.AMR_NB**, 
        buffersize); 

atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
        11025, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        **MediaRecorder.AudioEncoder.AMR_NB**, 
        buffersize, 
        AudioTrack.MODE_STREAM); 

Mã này chạy đúng nhưng tôi đang tự hỏi nó thực sự mã hóa âm thanh như AMR_NB và nếu điều này là không phải là một cách thích hợp để làm điều đó?

Tôi đã nhận được một lỗi tràn bộ đệm khi sử dụng PCM thô nhưng không ai đã xuất hiện kể từ khi sử dụng mã mới với MediaRecorder.AudioEncoder.AMR_NB sử dụng thay cho AudioFormat.PCM

+4

Đó là một thời gian dài kể từ khi bạn đăng câu hỏi của bạn, nhưng có lẽ nó vẫn còn thú vị cho một ai đó ... Bạn không mã hóa để AMR_NB. Flags chỉ là các trường int. MediaRecorder.AudioEncoder.AMR_NB là 0x01 ... giống như AudioFormat.ENCODING_DEFAULT. Vì vậy, bạn chỉ sử dụng mã hóa mặc định. – hacksteak25

Trả lời

2

Theo các tiểu bang tài liệu cho AudioRecordAudioTrack:

audioFormat  the format in which the audio data is represented. See ENCODING_PCM_16BIT and ENCODING_PCM_8BIT 

bạn chỉ có thể làm việc với PC 8 bit và 16 bit. Nếu bạn muốn âm thanh ở định dạng khác, hoặc không sử dụng AudioRecordAudioTrack (hãy thử MediaRecorderMediaPlayer) hoặc bạn sẽ phải chuyển mã bằng cách sử dụng mã của riêng bạn, có thể tận dụng NDK.

AudioRecordAudioTrack được thiết kế đặc biệt cho trường hợp âm thanh được đề cập không được hỗ trợ bởi công cụ đa phương tiện OpenCORE, vì nó không phải là codec được hỗ trợ hoặc không hỗ trợ giao thức truyền trực tuyến (ví dụ: SIP).