2010-10-13 15 views
23

चलाने के लिए एंड्रॉइड में ऑडियोट्रैक का उपयोग करके मैं अपने ऑडियोट्रैक एप्लिकेशन को Windows .wav फ़ाइल (Tada.wav) चलाने की कोशिश कर रहा हूं, एंड्रॉइड के साथ काम कर रहा हूं। वाकई, यह मुश्किल नहीं होना चाहिए, लेकिन मैं बहुत सारी अजीब चीजें सुन रहा हूं। फ़ाइल मेरे फोन के मिनी एसडी कार्ड पर सहेजी गई है और सामग्री को पढ़ने में कोई समस्या नहीं प्रतीत होती है, लेकिन जब मैं फ़ाइल चलाता हूं (पैरामीटर के साथ मैं केवल PRETTY SURE सही हूं), मुझे सफेद शोर के कुछ सेकंड मिलते हैं ध्वनि से पहले कुछ ऐसा हल हो जाता है जो सही हो सकता है।WAV फ़ाइल

मैं सफलतापूर्वक दर्ज की गई और फोन पर मेरी खुद की आवाज वापस निभाई है - मैं इस उदाहरण में दिए गए निर्देशों के अनुसार एक .pcm फ़ाइल बनाई:

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(पीछे की ओर मास्किंग के बिना) ..

किसी को भी एंड्रॉइड पर एक .wav फ़ाइल चलाने के लिए वेब पर एक उदाहरण के बारे में कुछ सुझाव या जागरूकता मिली है ??

धन्यवाद, आर

उत्तर

26

मैं जवाब पर ठोकर खाई (स्पष्ट रूप से, की कोशिश कर रहा &^@ मुझे नहीं लगता था काम करेगा द्वारा!), मामले में किसी को भी है रुचि ... मेरे मूल कोड (जो मूल पोस्ट में लिंक में उदाहरण से ली गई है) में, डेटा फ़ाइल से तो जैसे पढ़ा जाता है:

InputStream    is = new FileInputStream  (file); 
    BufferedInputStream  bis = new BufferedInputStream (is, 8000); 
    DataInputStream   dis = new DataInputStream  (bis);  // Create a DataInputStream to read the audio data from the saved file 

    int i = 0;               // Read the file into the "music" array 
    while (dis.available() > 0) 
    { 
     music[i] = dis.readShort();          // This assignment does not reverse the order 
     i++; 
    } 

    dis.close();              // Close the input stream 

इस संस्करण में, संगीत [] सरणी है शॉर्ट्स का इसलिए, readShort() विधि यहां समझ में आती है, क्योंकि डेटा 16-बिट पीसीएम है ... हालांकि, एंड्रॉइड पर यह समस्या प्रतीत होती है। मैंने उस कोड को निम्नलिखित में बदल दिया:

 music=new byte[(int) file.length()];//size & length of the file 
    InputStream    is = new FileInputStream  (file); 
    BufferedInputStream  bis = new BufferedInputStream (is, 8000); 
    DataInputStream   dis = new DataInputStream  (bis);  // Create a DataInputStream to read the audio data from the saved file 

    int i = 0;               // Read the file into the "music" array 
    while (dis.available() > 0) 
    { 
     music[i] = dis.readByte();          // This assignment does not reverse the order 
     i++; 
    } 

    dis.close();              // Close the input stream 

इस संस्करण में, संगीत [] BYTES की एक सरणी है। मैं अभी भी ऑडियोट्रैक को बता रहा हूं कि यह 16-बिट पीसीएम डेटा है, और मेरे एंड्रॉइड को इस तरह कॉन्फ़िगर किए गए ऑडियोट्रैक में बाइट्स की एक सरणी लिखने में कोई समस्या नहीं है ... वैसे भी, यह अंत में सही लगता है, इसलिए अगर कोई अन्य किसी कारण से विंडोज एंड्रॉइड को अपने एंड्रॉइड पर खेलना चाहता है, यह समाधान है। आह, endianness ......

आर

+0

यह स्वीकार्य उत्तर होना चाहिए, क्योंकि यह प्रश्न का उत्तर देता है। ;) – gary

+0

मैं शपथ ले सकता था कि मैंने यहां "धन्यवाद, गैरी" छोड़ा है, लेकिन यह अभी यहां नहीं है ... धन्यवाद, गैरी !! – Rich

+1

यह [आलेख] (http://computermusicblog.com/blog/2008/08/29/reading-and-writing-wav-files-in-java) विषय पर प्रतीत होता है: जावा के छोटे और बाइट का उपयोग करने के बीच मतभेद जब डब्ल्यूएवी प्रारूप पढ़ने की बात आती है। – Vanja

5

आप फ़ाइल के पहले 44 बाइट्स लंघन कर रहे हैं इससे पहले कि आप बफर में फ़ाइल के डेटा के बाकी डंप? पहले 44 बाइट WAVE शीर्षलेख हैं और यदि आप उन्हें चलाने का प्रयास करते हैं तो वे यादृच्छिक शोर की तरह लगेंगे।

इसके अलावा, क्या आप वाकई वही गुणों के साथ ऑडियोट्रैक बना रहे हैं, जिसे आप चलाने की कोशिश कर रहे हैं (नमूना दर, बिट दर, चैनलों की संख्या इत्यादि)? विंडोज वास्तव में फ़ाइल गुण पेज में आप को यह जानकारी देने का एक अच्छा काम करता है: alt text

+0

मैंने हेडर को छोड़ने के हर संयोजन की कोशिश की है और नहीं कि मैं सोच सकता हूं - बिना किस्मत के। सफेद शोर ध्वनि 44 काटने से अधिक लंबे समय तक रहता है। Tada.wav एक 168 केबीटीई फ़ाइल है, इसलिए हेडर "खेलना" मुश्किल से ध्यान देने योग्य होना चाहिए, है ना? – Rich

+1

सही, फ़ाइल हेडर बहुत ही कम समय के लिए कचरा उत्पन्न करेगा। क्या आप वाकई वही गुणों के साथ ऑडियोट्रैक बना रहे हैं, जिसे आप चलाने की कोशिश कर रहे हैं (नमूना दर, बिट दर, चैनलों की संख्या इत्यादि)? –

+0

मेरे पास हेक्स संपादक है और मुझे यकीन है कि मुझे हेडर से संख्याएं ठीक से मिल रही हैं। मुझे आश्चर्य है कि मैं इंटरनेट पर किसी प्रकार का एक वैव फ़ाइल विश्लेषक नहीं ढूंढ पाया। मैं स्टंप हो गया हूं, और विंडोज मीडिया प्लेयर निश्चित रूप से फ़ाइल चला सकता है ... – Rich

2

रूप Aaron C से कहा, तुम प्रारंभिक 44 बाइट या छोड़ने के लिए (के रूप में मैं पसंद करते हैं) पहले 44 बाइट्स कि WAVE हैडर हैं पढ़ा है। इस तरह आप जानते हैं कि कितने चैनल, प्रति नमूना, लंबाई, आदि बिट्स ... WAVE शामिल हैं।

Here आप WAVE शीर्षलेख पार्सर/लेखक का एक अच्छा कार्यान्वयन पा सकते हैं।

5

मुझे इस प्रश्न के बहुत सारे जवाब मिल गए।मेरे अंतिम समाधान है, जो सभी काटने और चिपकाने दिया शायद ही मेरा है, करने के लिए नीचे आता है:

public boolean play() { 

    int i = 0; 
    byte[] music = null; 
    InputStream is = mContext.getResources().openRawResource(R.raw.noise); 

    at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 
     minBufferSize, AudioTrack.MODE_STREAM); 

    try{ 
     music = new byte[512]; 
     at.play(); 

     while((i = is.read(music)) != -1) 
      at.write(music, 0, i); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    at.stop(); 
    at.release(); 
    return STOPPED; 
} 

बंद कर दिया सिर्फ एक "सही" एक संकेत रोकें/प्ले बटन रीसेट करने के लिए के रूप में वापस भेज दिया है। और वर्ग प्रारंभकर्ता में:

public Mp3Track(Context context) { 
    mContext = context; 
    minBufferSize = AudioTrack.getMinBufferSize(44100, 
     AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 
} 

प्रसंग सिर्फ "इस" बुला गतिविधि से है। आप sdcard, आदि पर एक फ़ाइल इनपुटस्ट्रीम का उपयोग कर सकते हैं। मेरी फ़ाइलें res/raw

+0

इसके लिए धन्यवाद, मैंने जवाब देने वाले सभी उत्तरों में से सर्वश्रेष्ठ परिणाम दिया। हालांकि ट्रैक शुरू होने पर मुझे अभी भी थोड़ा ऑडियो क्लिक मिलता है .... – methodMan

1

कृपया भयानक पार्सिंग कोड को कायम न करें। डब्ल्यूएवी पार्सिंग http://soundfile.sapp.org/doc/WaveFormat/ को लागू करने के लिए तुच्छ है और नमूना दर, बिट गहराई और चैनलों की संख्या जैसे चीजों को पार्स करने में सक्षम होने के द्वारा आप स्वयं को धन्यवाद देंगे।

इसके अलावा x86 और एआरएम (कम से कम डिफ़ॉल्ट रूप से) दोनों छोटे एंडियन हैं, इसलिए देशी-एंडियन WAV फ़ाइलों को बिना किसी शफल के ठीक होना चाहिए।

+0

आपका उत्तर अधिक उपयोगी होगा अगर आपने निर्दिष्ट किया कि आपको कौन सा पार्सिंग कोड भयानक है और क्यों। – arlomedia

संबंधित मुद्दे