2011-10-29 78 views
6

Tài liệu Android cho SoundPool cho biết "ứng dụng cũng có thể thay đổi độ cao bằng cách điều chỉnh tốc độ phát lại theo thời gian thực cho hiệu ứng doppler hoặc tổng hợp". Vì vậy, tôi đã cố gắng để làm điều này, bằng cách sử dụng phương pháp setRate để thay đổi trơn tru từ một lưu ý khác, nhưng kết quả là khủng khiếp: sự thay đổi âm thanh là rất rách rưới. Đây là mã tôi đã thử. Xin vui lòng cho tôi biết nếu có một cách tốt hơn.Âm thanh Android: thay đổi độ cao

int streamId = soundPool.play (soundId, 1, 1, 1, 0, 1.0f); 
for (float x = 0; x < 1; x += 0.005) { 
    SystemClock.sleep (10); 
    soundPool.setRate (streamId, 1 + x); 
} 
+0

thay đổi '1 + x' cho' 1.0f + x' và (cũng thay đổi '0.005' cho '0.005f' –

+0

Điều này làm cho không có sự khác biệt. – Patrick

+0

How are you kiểm tra mã của bạn. Nếu bạn đang sử dụng một thiết bị thực, có thể thiết bị của bạn quá chậm để tự động thay đổi tốc độ phát lại.Nếu bạn đang sử dụng trình mô phỏng, có thể sự cố là thẻ âm thanh của máy chủ. Thay đổi tốc độ phát lại không phải là một nhiệm vụ tầm thường và có thể yêu cầu nội suy phức tạp – MBober

Trả lời

13

Mặc dù tài liệu Androids gợi ý mà bạn có thể sử dụng để sản xuất setRate() hiệu ứng doppler, tôi sẽ không dựa vào một thực hiện đủ nhanh hoặc tốt trên tất cả các thiết bị Android.

IC âm thanh giá cả phải chăng yêu cầu tốc độ mẫu cố định là 44kHz hoặc 48kHz. Chuyển đổi tỷ lệ mẫu (tức là sửa đổi độ cao) do đó phải được thực hiện trong phần mềm. Bởi vì điều này bao gồm crunching số cấp thấp, tôi chắc chắn rằng điều này được thực hiện bởi nhà sản xuất thiết bị chứ không phải bởi Google. Với nhiều nhà sản xuất thiết bị Android và phần cứng chi phí thấp thường được sử dụng, chắc chắn có nhiều triển khai chuyển đổi tỷ lệ mẫu ở đó. Một số nhanh hơn, một số chậm hơn. Một số mịn, một số rách rưới.

Điều gì xảy ra khi thay đổi tỷ lệ chuyển đổi trong khi phát lại? Nếu thuật toán không khớp với các phần chính xác với nhau, có thể có một vết nứt ngắn trong quá trình phát lại âm thanh của bạn. Bạn thay đổi tỷ lệ chuyển đổi sau mỗi 10 mili giây. Nếu có một vết nứt mỗi 10ms, tương ứng với tần số 100Hz, đó là một giai điệu. Đây có thể là những gì bạn nghe là "rách rưới".

Tất cả trong tất cả, tôi không nghĩ rằng có thể mô phỏng nhạc cụ trong thời gian thực trên một loạt các thiết bị Android sử dụng API Android cấp cao. Tuy nhiên, ứng dụng gốc có thể đủ nhanh.

0

Sau khi thử mọi thứ, tôi quyết định đi với SoundPool để thay đổi Pitch, tốc độ phát lại 2.0 khiến âm thanh phát ở mức gấp đôi bản gốc, và tốc độ phát lại 0,5 khiến nó phát ở mức một nửa tần số ban đầu. Phạm vi tốc độ phát lại là 0,5 đến 2,0. Nhưng nó đã làm việc với freq thấp hơn và cao hơn 0,5 và 2,0.

Tôi gửi bài mã làm việc của tôi,

nhưng như nó chỉ dành riêng cho mục đích demo, Ở đây bạn cần phải thay đổi thủ "tốc độ phát lại", mọi lúc bạn cài đặt ứng dụng cho ví dụ: "sp.play (nổ, 1,1,0,0,1,5f) "ở đây" 1,5f "là tốc độ phát lại. Người ta có thể dễ dàng tạo ra một EditView, hoặc một cái gì đó tương tự để thiết lập giá trị của tỷ lệ phát lại tại thời gian chạy.

Trong ứng dụng này, bạn chỉ cần chạm vào màn hình của ứng dụng để phát nhạc ở tốc độ phát lại đã đặt.

import java.io.IOException; 

import android.app.Activity; 
import android.content.res.AssetFileDescriptor; 
import android.media.AudioManager; 
import android.media.SoundPool; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class SoundPoolActivity extends Activity implements OnClickListener { 

    SoundPool sp; 
    int explosion = 0; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     View v = new View(this); 
     v.setOnClickListener(this); 
     setContentView(v); 
     sp = new SoundPool(1,AudioManager.STREAM_MUSIC,0); 
     //explosion = sp.load(this, R.raw.hh,0); 
     explosion = sp.load("/sdcard/hh.m4a",0); 


    } 


    public void onClick(View v){ 
     if (explosion!=0){ 

      sp.play(explosion, 1,1,0,0,2.3f); 
     } 

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