2013-01-10 18 views
6

Trong ứng dụng Android của tôi, tôi đang ghi âm giọng nói của người dùng mà tôi lưu dưới dạng tệp âm thanh được mã hóa .3gp.Làm thế nào để đọc các giá trị thô của định dạng âm thanh 3gp/AMR-NB?

Điều tôi muốn làm là mở nó lên, tức là chuỗi x [n] đại diện cho mẫu âm thanh, để thực hiện một số phân tích tín hiệu âm thanh.

Có ai biết cách tôi có thể thực hiện việc này không?

Trả lời

5

Bạn có thể sử dụng lớp học Android MeidiaCodec để giải mã 3gp hoặc các tệp khác. Đầu ra bộ giải mã là mảng byte PCM tiêu chuẩn. Bạn có thể gửi trực tiếp đầu ra này đến lớp Android AudioTrack để phát hoặc tiếp tục với mảng byte đầu ra này để xử lý tiếp như DSP. Để áp dụng thuật toán DSP, mảng byte phải được chuyển thành mảng float/double. Có một số bước để có được đầu ra mảng byte. Nói tóm lại nó trông giống như như sau:

  1. nhanh chóng MediaCodec

    String mMime = "audio/3gpp" 
    MediaCodec mMediaCodec = MediaCodec.createDecoderByType(mMime); 
    
  2. Tạo định dạng Media và cấu hình media codec

    MediaFormat mMediaFormat = new MediaFormat(); 
    mMediaFormat = MediaFormat.createAudioFormat(mMime, 
        mMediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE), 
        mMediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)); 
    
    mMediaCodec.configure(mMediaFormat, null, null, 0); 
    mMediaCodec.start(); 
    
  3. Capture đầu ra từ MediaCodec (nên xử lý bên trong một sợi)

    MediaCodec.BufferInfo buf_info = new MediaCodec.BufferInfo(); 
    int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(buf_info, 0); 
    byte[] pcm = new byte[buf_info.size]; 
    mOutputBuffers[outputBufferIndex].get(pcm, 0, buf_info.size); 
    

Điều này Google IO talk có thể có liên quan ở đây.

+0

Cảm ơn bạn rất nhiều vì đã giúp tôi bắt đầu. Tôi sẽ kiểm tra và thực hiện một số mã này vào cuối tuần này và có thể chấp nhận câu trả lời của bạn. – JDS

+0

Bạn có thể vui lòng cho biết cách thêm AudioTrack để phát toàn bộ inputStream của tệp 3gp không? –

+0

Khi bạn đọc dữ liệu vào mảng byte từ MediaCodec, nó có thể được phát bằng cách sử dụng phương thức ghi lớp AudioTrack. Vui lòng xem chữ ký phương thức ghi tại đây, http://developer.android.com/reference/android/media/AudioTrack.html –

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