android - हेडफ़ोन




रीयल-टाइम में माइक्रोफोन से वापस आने वाली आवाज बजाना (2)

यह एक java.lang.IleglegalStateException को "play () द्वारा अनियमित ऑडियोट्रैक पर बुलाए जाने के कारण के कारण फेंक दिया गया है।

ऐसा इसलिए है क्योंकि बफर आकार बहुत छोटा है। मैंने "bufferSize + = 2048;" की कोशिश की, तो यह ठीक है।

मैं माइक्रोफोन से आने वाली आवाज़ रिकॉर्डिंग करने और इसे (लगभग) वास्तविक समय में वापस चलाने की कोशिश कर रहा हूं, हालांकि सफलता के बिना।

मैं क्रमशः रिकॉर्ड और प्लेबैक के लिए ऑडियो रिकॉर्डॉर्ड और ऑडियोट्रैक कक्षाओं का उपयोग कर रहा हूं। मैंने अलग-अलग दृष्टिकोणों की कोशिश की है, मैंने आने वाली ध्वनि रिकॉर्ड करने और इसे फ़ाइल में लिखने का प्रयास किया है और यह ठीक काम करता है। मैंने ऑडियो फ़ाइल के साथ उस फ़ाइल से प्लेबैक ध्वनि भी करने का प्रयास किया है और यह भी ठीक काम करता है। समस्या यह है कि जब मैं इसे लिखने के बाद फ़ाइल पढ़ने की बजाय वास्तविक समय में ध्वनि चलाने की कोशिश करता हूं।

यहां कोड है:

//variables
private int audioSource = MediaRecorder.AudioSource.MIC;
private int samplingRate = 44100; /* in Hz*/
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private int bufferSize = AudioRecord.getMinBufferSize(samplingRate, channelConfig, audioFormat);
private int sampleNumBits = 16;
private int numChannels = 1;

// …

AudioRecord recorder = new AudioRecord(audioSource, samplingRate, channelConfig, audioFormat, bufferSize);
                recorder.startRecording();
                isRecording = true;

AudioTrack audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                        AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);

if(audioPlayer.getPlayState() != AudioTrack.PLAYSTATE_PLAYING)
    audioPlayer.play();

//capture data and record to file
int readBytes=0, writtenBytes=0;
do{
   readBytes = recorder.read(data, 0, bufferSize);

   if(AudioRecord.ERROR_INVALID_OPERATION != readBytes){
      writtenBytes += audioPlayer.write(data, 0, readBytes);
   }
}
while(isRecording);

यह एक java.lang.IleglegalStateException को "play () द्वारा अनियमित ऑडियोट्रैक पर बुलाए जाने के कारण के कारण फेंक दिया गया है।

हालांकि, अगर मैं ऑडियोट्रैक प्रारंभिकता को उदाहरण के लिए नमूनाकरण दर 8000 हर्ट्ज और नमूना प्रारूप 8 बिट्स (16 के बजाय) का उपयोग करने के लिए बदलता हूं, तो यह अपवाद फेंक नहीं देता है और एप्लिकेशन चलता है, हालांकि यह भयानक शोर पैदा करता है।

जब मैं किसी फ़ाइल से ऑडियोट्रैक चलाता हूं, तो ऑडियोट्रैक के प्रारंभ में कोई समस्या नहीं है, मैंने 44100 और 16 बिट्स की कोशिश की और सही ध्वनि उत्पन्न करने के साथ यह ठीक से काम किया।

कोई मदद ?


मुझे एक ही समस्या थी और मैंने इसे अनुमति को प्रकट फ़ाइल में जोड़कर हल किया:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>






audio-recording