2011-10-29 20 views
6

साउंडपूल के लिए एंड्रॉइड प्रलेखन कहता है "एप्लिकेशन डॉपलर या संश्लेषण प्रभाव के लिए रीयल-टाइम में प्लेबैक दर समायोजित करके पिच को भी बदल सकता है"। तो मैंने इसे एक नोट से दूसरे में आसानी से बदलने के लिए सेटरेट विधि का उपयोग करके ऐसा करने की कोशिश की, लेकिन परिणाम भयानक है: ध्वनि भिन्नता बहुत परेशान है। कोड मैंने कोशिश की है। कृपया मुझे बताएं कि क्या कोई बेहतर तरीका है।एंड्रॉइड ऑडियो: पिच बदलें

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

परिवर्तन '1 + x'' 1.0f + x' और (भी '0.005f' –

+0

यह कोई फर्क नहीं पड़ता के लिए' 0.005' बदल जाते हैं। करने के लिए – Patrick

+0

कैसे आप अपने कोड का परीक्षण कर रहे हैं। यदि आप एक प्रयोग कर रहे हैं असली डिवाइस, यह संभव हो सकता है कि प्लेबैक दर गतिशील रूप से बदलने के लिए आपका डिवाइस बहुत धीमा हो। यदि आप सिम्युलेटर का उपयोग कर रहे हैं, तो समस्या आपके होस्ट का साउंड कार्ड है। प्लेबैक दर बदलना एक छोटा काम नहीं है और जटिल इंटरपोलेशन की आवश्यकता हो सकती है विशेष रूप से जब गैर-मानक रूपांतरण दर के साथ चलते हैं। – MBober

उत्तर

13

भी Androids प्रलेखन पता चलता है कि आप उपयोग कर सकते हैं setRate() डॉपलर प्रभाव उत्पन्न करने के, मैं हर Android डिवाइस पर तेज और अच्छा पर्याप्त कार्यान्वयन पर भरोसा नहीं होगा, हालांकि।

वहनीय ऑडियो आईसीएस को 44kHz या 48kHz की एक निश्चित नमूना दर की आवश्यकता होती है। नमूना दर रूपांतरण (यानी पिच संशोधन) इसलिए सॉफ्टवेयर में किया जाना है। चूंकि इसमें निम्न-स्तरीय संख्या क्रंचिंग शामिल है, मुझे यकीन है कि यह डिवाइस निर्माता द्वारा लागू किया गया है, न कि Google द्वारा। एंड्रॉइड डिवाइस निर्माताओं की विस्तृत विविधता और अक्सर उपयोग किए जाने वाले कम लागत वाले हार्डवेयर को देखते हुए, निश्चित रूप से वहां कई नमूना दर रूपांतरण कार्यान्वयन होते हैं। कुछ तेज़, कुछ धीमे। कुछ चिकनी, कुछ ragged।

प्लेबैक के दौरान रूपांतरण दर को बदलते समय क्या होता है? यदि एल्गोरिदम ठीक से टुकड़ों से मेल नहीं खाता है, तो आपके ऑडियो प्लेबैक में एक छोटी सी दरार हो सकती है। आप प्रत्येक 10 मिलीसेकंड में रूपांतरण दर बदलते हैं। यदि हर 10 एमएमएस में एक दरार है, जो कि 100 हर्ट्ज की आवृत्ति के अनुरूप है जो एक स्वर है। ऐसा लगता है कि आप "ragged" के रूप में क्या सुनते हैं।

सब कुछ मुझे नहीं लगता कि उच्च स्तर के एंड्रॉइड एपीआई का उपयोग करके एंड्रॉइड उपकरणों की एक विस्तृत श्रृंखला पर रीयल-टाइम में संगीत वाद्ययंत्रों का अनुकरण करना संभव है। हालांकि एक मूल आवेदन पर्याप्त तेज़ हो सकता है।

0

सब कुछ करने की कोशिश करने के बाद, मैंने पिच बदलने के लिए साउंडपूल के साथ जाने का फैसला किया, 2.0 की एक प्लेबैक दर एक फ्रीक पर अपने मूल को डबल करने के लिए ध्वनि का कारण बनती है, और 0.5 की प्लेबैक दर इसे आधे से खेलती है मूल आवृत्ति। प्लेबैक दर सीमा 0.5 से 2.0 है। लेकिन यह freq निचले और 0.5 और 2.0 से अधिक के साथ काम किया था।

मैं अपने काम के कोड पोस्टिंग कर रहा हूँ,

लेकिन के रूप में अपनी बस डेमो प्रयोजन के लिए, यहाँ आप मैन्युअल रूप से "प्लेबैक दर" बदलने की जरूरत है, हर आप उदाहरण के लिए आवेदन स्थापित: "sp.play (विस्फोट, 1,1,0,0,1.5 एफ) "यहां" 1.5 एफ "प्लेबैक दर है। कोई आसानी से एक संपादन दृश्य, या रन टाइम पर प्लेबैक दर के मूल्य को सेट करने के समान कुछ बना सकता है।

इस ऐप में, आपको बस प्लेबैक दर पर संगीत चलाने के लिए ऐप की स्क्रीन पर टैप करने की आवश्यकता है।

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); 
     } 

    } 
}