android - mrecorder - गुप्त कॉल रिकॉर्डिंग



एंड्रॉइड: माइक्रो इनपुट रिकॉर्ड करने की आवश्यकता है (2)

क्या वास्तविक समय में प्लेबैक / पूर्वावलोकन के लिए प्रक्रिया होने पर एंड्रॉइड में माइक्रो इनपुट रिकॉर्ड करने का कोई तरीका है? मैंने ऐसा करने के लिए AudioRecord और ऑडियोट्रैक का उपयोग करने की कोशिश की लेकिन समस्या यह है कि मेरा डिवाइस रिकॉर्ड की गई ऑडियो फ़ाइल नहीं चला सकता है। असल में, कोई भी एंड्रॉइड प्लेयर एप्लिकेशन रिकॉर्ड की गई ऑडियो फ़ाइल नहीं चला सकता है।

दूसरी ओर, रिकॉर्ड करने के लिए Media.Recorder का उपयोग करना एक अच्छी रिकॉर्ड की गई ऑडियो फ़ाइल उत्पन्न करता है जिसे किसी भी प्लेयर एप्लिकेशन द्वारा खेला जा सकता है। लेकिन बात यह है कि वास्तविक समय में माइक्रो इनपुट रिकॉर्ड करते समय मैं पूर्वावलोकन / पेलबैक नहीं कर सकता।

किसी भी प्रतिक्रिया की बहुत सराहना की है! अग्रिम में धन्यवाद!

https://src-bin.com


Answer #1

(लगभग) वास्तविक समय में ऑडियो को रिकॉर्ड और प्ले करने के लिए आप एक अलग थ्रेड शुरू कर सकते हैं और ऑडियो रिकॉर्ड और AudioRecord उपयोग कर सकते हैं।

प्रतिक्रिया के साथ बस सावधान रहें। यदि आपके डिवाइस पर स्पीकर काफी जोरदार हो जाते हैं, तो फीडबैक बहुत खराब हो सकता है।

/*
 * Thread to manage live recording/playback of voice input from the device's microphone.
 */
private class Audio extends Thread
{ 
    private boolean stopped = false;

    /**
     * Give the thread high priority so that it's not canceled unexpectedly, and start it
     */
    private Audio()
    { 
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        start();
    }

    @Override
    public void run()
    { 
        Log.i("Audio", "Running Audio Thread");
        AudioRecord recorder = null;
        AudioTrack track = null;
        short[][]   buffers  = new short[256][160];
        int ix = 0;

        /*
         * Initialize buffer to hold continuously recorded audio data, start recording, and start
         * playback.
         */
        try
        {
            int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
            recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
            track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
                    AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
            recorder.startRecording();
            track.play();
            /*
             * Loops until something outside of this thread stops it.
             * Reads the data from the recorder and writes it to the audio track for playback.
             */
            while(!stopped)
            { 
                Log.i("Map", "Writing new data to buffer");
                short[] buffer = buffers[ix++ % buffers.length];
                N = recorder.read(buffer,0,buffer.length);
                track.write(buffer, 0, buffer.length);
            }
        }
        catch(Throwable x)
        { 
            Log.w("Audio", "Error reading voice audio", x);
        }
        /*
         * Frees the thread's resources after the loop completes so that it can be run again
         */
        finally
        { 
            recorder.stop();
            recorder.release();
            track.stop();
            track.release();
        }
    }

    /**
     * Called from outside of the thread in order to stop the recording/playback loop
     */
    private void close()
    { 
         stopped = true;
    }

}

संपादित करें

ऑडियो वास्तव में एक फाइल को रिकॉर्ड नहीं कर रहा है। ऑडियो AudioRecord ऑब्जेक्ट ऑडियो को 16 बिट पीसीएम डेटा के रूप में एन्कोड करता है और इसे बफर में रखता है। फिर AudioTrack ऑब्जेक्ट उस बफर से डेटा पढ़ता है और इसे स्पीकर के माध्यम से चलाता है। एसडी कार्ड पर कोई फ़ाइल नहीं है जिसे आप बाद में एक्सेस कर सकेंगे।

वास्तविक समय में प्लेबैक / पूर्वावलोकन प्राप्त करने के लिए आप एक ही समय में एसडी कार्ड से एक फ़ाइल को पढ़ और लिख नहीं सकते हैं, इसलिए आपको बफर का उपयोग करना होगा।


Answer #2

मेनिफेस्ट में निम्नलिखित अनुमति को ठीक से काम करने की आवश्यकता है:

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

इसके अलावा, 2 डी बफर सरणी आवश्यक नहीं है। कोड का तर्क केवल एक बफर के साथ मान्य है, इस तरह:

short[] buffer = new short[160];
while (!stopped) {
    //Log.i("Map", "Writing new data to buffer");
    int n = recorder.read(buffer, 0, buffer.length);
    track.write(buffer, 0, n);
}




audiorecord