2011-12-12 8 views
5

Các chủ đề tương tự về câu hỏi này bao gồm chỉ phát âm ở chế độ đơn âm, ở đó tần số trái và phải giống nhau.Phát âm thanh nổi trong android

Câu hỏi của tôi là: cách tạo âm thanh nổi sao cho kênh bên trái có tần số khác với kênh phù hợp?

Tôi nghĩ rằng các tệp .wav đã ghi trước nhưng ghi nhiều tệp .wav và đặt tệp đó vào thư mục res không phải là ý hay.

tôi đi qua các lớp SoundPoolAudioTrack nhưng tôi cần một đoạn mã hiển thị các tần số khác nhau của kênh trái và phải được lưu trữ dưới dạng bộ đệm trước khi phát âm.

Hoặc có cách nào khác không? Vui lòng cung cấp đoạn mã mong muốn.

Trả lời

4

Tôi chưa bao giờ cố gắng này:

  1. Khởi trái và phải tần số của bạn
    //playback rate (1.0 = normal playback, range 0.5 to 2.0)
    float lFrequency = 1.0;
    float rFrequency = 1.0;

  2. Khởi tạo một đối tượng SoundPool
    SoundPool sp = SoundPool(2, AudioManager.STREAM_MUSIC, 0);

  3. Tải ca khúc của bạn hai lần (load function)
    int sLeft = sp.load(mContext, R.raw.yourAudioFileId, 1);
    int sRight = sp.load(mContext, R.raw.yourAudioFileId, 1);

  4. Chơi 2 âm (một trên trái và một ở bên phải) sử dụng tốc độ khác nhau (play function)
    sp.play (sLeft, 1.0, 0.0, 0, 0, lFrequency);
    sp.play (sRight, 0.0, 1.0, 0, 0, rFrequency);

+0

Ở bước 4, tôi nghĩ tần số bên trái và bên phải sẽ không phát cùng nhau. Tôi cần phải chơi tần số trái và phải với nhau. –

+0

@ NeigylR.Noval Bạn đã thử chưa? Miễn là chúng tôi đã xây dựng SoundPool bằng cách sử dụng tối đa 2, cả hai sẽ chơi cùng nhau. –

3

Từ hiểu biết của tôi, nếu bạn sử dụng SoundPoo Nó sẽ phát trong âm thanh nổi mà không có bất kỳ cấu hình đặc biệt nào. Từ tài liệu: "Thư viện SoundPool sử dụng dịch vụ MediaPlayer để giải mã âm thanh thành một luồng PCM hoặc luồng âm thanh nổi 16 bit nguyên bản" , miễn là tệp bạn phát bằng Stereo bắt đầu, nó sẽ phát theo cách đó.

1

Thay vì chèn sẵn các tệp WAV và nhúng chúng vào ứng dụng của bạn, bạn có thể tạo âm thanh WAV kênh tách trong bộ nhớ từ mã, sau đó lưu nó dưới dạng tệp WAV mà bạn sẽ phát với SoundPool hoặc phát âm thanh trực tiếp bằng cách sử dụng AudioTrack (Tôi khuyên bạn nên sử dụng sau).

Bản thân âm thanh chỉ là một mảng các số nguyên (thường) 2 byte. Với âm thanh nổi, các mẫu trái và phải được xen kẽ trong toàn bộ mảng (vì vậy mẫu [0] là mẫu L đầu tiên, mẫu [1] là mẫu R đầu tiên, mẫu [2] là mẫu L thứ hai, vv). Vì vậy, khi ứng dụng của bạn khởi động, bạn sẽ tạo một mảng tuy nhiên bạn cần (với âm thanh chất lượng CD, mảng của bạn sẽ cần 88200 phần tử cho mỗi giây âm thanh), sau đó điền các mẫu có giá trị được tính cho âm của bạn, sau đó truyền mảng sang AudioTrack để phát.

Hoặc bạn sẽ lưu âm thanh dưới dạng tệp WAV và phát âm thanh đó bằng SoundPool (có thể thực sự tốt hơn từ quan điểm dấu chân bộ nhớ).Định dạng WAV là rất đơn giản để viết (đọc là phức tạp hơn): chỉ là một tiêu đề 44-byte với các thuộc tính khác nhau, và sau đó các dữ liệu âm thanh chính nó.

Tôi nghĩ rằng tôi đã trả lời một câu hỏi android tương tự trước đây, vì vậy tôi sẽ đi xem nếu tôi có một số mã cơ bản để làm điều này.

Không tôi, nhưng một số mã tốt cho việc đọc và viết WAV file trong java:

http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java

0

Tôi sẽ sử dụng phần mềm khác để tạo ra một file .ogg stereo (không sử dụng các tập tin WAV, họ trọng lượng quá nhiều), đó là một định dạng âm thanh rất nhẹ hoạt động tốt trong Android. Tôi sử dụng Reaper miễn phí, Audacity dễ hơn, mọi người sẽ làm. Chỉ cần tạo hai bản âm thanh đơn sắc, đặt chảo của chúng sang trái và phải ở bên trái. Tải mẫu của bạn và áp dụng plugin thay đổi độ cao để thay đổi tần suất của một trong các bản nhạc. Bạn cũng có thể tạo chúng bằng sintesizer. Sau đó, kết xuất tất cả vào một tập tin tone.ogg. Tone