2012-05-09 12 views
5

मैंने ऑडियो बफर बनाने और उसे एक नई कक्षा में भेजने की कोशिश की। इस कक्षा में मैं इस बफर को ऑडियोट्रैकर के साथ खेलूंगा लेकिन यह काम नहीं करता है। मैं समय पर ध्वनि सुन सकता हूं लेकिन ध्वनि एक हेलफैक्ट की तरह है। मेरी गलती के लिए मुझे कोई बुराई नहीं है और इस समस्या का जवाब नहीं मिला। मुझे आशा है कि आप मेरी मदद कर सकते हैं।मैं ऑडियो बफर को सीधे इसे चलाने के लिए कैसे स्थानांतरित कर सकता हूं

public class input { 
private static final String TAG = "Aufnahme"; 
private AudioRecord recorder = null; 
private boolean isRecording = false; 
private int SAMPLERATE = 8000; 
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS, 
     AUDIO_FORMAT); 
private Thread recordingThread = null; 

public void startRecording() { 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE, 
      CHANNELS, AUDIO_FORMAT, bufferSize); 

    recorder.startRecording(); 
    isRecording = true; 

    recordingThread = new Thread(new Runnable() 

    { 
     public void run() { 
      writeAudioData(); 
     } 

    }); 
    recordingThread.start(); 

} 

public void stopRecording() { 
    isRecording = false; 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    recordingThread = null; 
} 

private void writeAudioData() { 

    byte data[] = new byte[bufferSize]; 

    while (isRecording) { 

     recorder.read(data, 0, bufferSize); 
     send(data); 

    } 
} 

private void send(byte[] data) { 

    int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

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

    at.play(); 
    at.write(data, 0, bufferSize); 
    at.stop(); 
    at.release(); 

} 

उत्तर

4

ठीक है, मैं इस समस्या पता लगा: Sorcecode (माफ करना मेरी अंग्रेजी नहीं सबसे अच्छा है)। हॉल प्रभाव स्पीकर ध्वनि से आया जो वास्तविक समय में दर्ज किया गया था। बुरी गलती

+4

फिक्स पर बधाई! जब आप सक्षम होते हैं, तो कृपया अपने उत्तर को 'स्वीकृत' के रूप में चिह्नित करना सुनिश्चित करें ताकि अन्य आपके समाधान से सीख सकें। चीयर्स ~ –

+0

मैंने बफर आकार और मिनीबफर आकार के साथ खेला और ऑडियो डेटा के वफादार प्लेबैक प्राप्त करने में सक्षम था। मैंने इनपुट बफर को 8192 और आउटपुट 1024 तक तय किया। इसे आगे बढ़ाया जा सकता है लेकिन यह मेरे उद्देश्य को पूरा करता है। मूल कोड के लिए धन्यवाद। यह वांछित के रूप में काम करता है। – axs

0

कारण जब आप AudioTrack ऑब्जेक्ट पर डेटा लिखते हैं, तो आप वास्तव में इसे खोलते हैं, बफर को लिखते हैं, बंद करते हैं और इसे छोड़ देते हैं, और यदि न्यूनतम बफर आकार इतना छोटा है, तो आप वास्तव में निरंतर पुन: समायोजन के कारण नहीं सुन सकते ऑडियो ट्रैक। यही कारण है कि यह बफर आकार को बदलकर हल किया जाता है। यदि आप इसे 8000 बनाते हैं और आपकी नमूना दर 8000 है, तो आप एक दूसरी देरी के साथ ध्वनि सुनेंगे। इसे हल करने के लिए, अपनी प्रेषण विधि से छुटकारा पाएं और लिखने के लिए विधिऑडियो विधि को बदलें:

निजी शून्य लेखनऑडियोियोटा() { बाइट डेटा [] = नया बाइट [बफर आकार];

int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

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


    at.play(); 

    while (isRecording) { 
     recorder.read(data, 0, bufferSize); 
     at.write(data, 0, bufferSize); 
    } 
    at.stop(); 
    at.release(); 
संबंधित मुद्दे

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