使用MediaRecorder录制音频,并与MediaPlayer同时播放



目前我在公司为VoIP应用程序做一些研究。

我们想用amr记录设备麦克风的声音,对其进行加密并将数据发送到我们的服务器,另一端从该服务器流式传输和解密。对于某些测试用例,我目前使用媒体记录器在amr中录制声音。因为我想继续流式传输当前声音,所以我无法使用文件来存储数据。所以我创建了一个管道,并将其作为MediaRecorder-Reference的文件描述符。

MediaRecorder mediaRecorder = createMediaRecorder();
    //make a pipe containing a read and write parcelFd
    try {
        ParcelFileDescriptor[] fdPair = ParcelFileDescriptor.createPipe();
        //get a handle to your read and write fd objects
        ParcelFileDescriptor readFd = fdPair[0];
        ParcelFileDescriptor writeFd = fdPair[1];
        //set the output to the write side of this pipe
        mediaRecorder.setOutputFile(writeFd.getFileDescriptor());
        //next create an input stream to read from the read side of the pipe.
        FileInputStream reader = new FileInputStream(readFd.getFileDescriptor());
        FileOutputStream writer = new FileOutputStream(writeFd.getFileDescriptor());
        //now to fill up a buffer with data, only do a simple read
        byte[] buffer = new byte[BUFSIZE];
        mediaRecorder.prepare();
        //by starting the mediarecorder, it will write into the writeFD
        mediaRecorder.start();
        Log.i(LOG_TAG, "Start Recording");
        while(_isRecording){
            int length = 0;
            while((length = reader.read(buffer)) > 0){
                writer.write(buffer, 0, length);
                _audioListener.onAudioRecorded(buffer, 0, length);
            }
        }
        Log.i(LOG_TAG, "Stop Recording");
        writer.flush();
        writer.close();
        reader.close();
        tearDownMediaRecorder(mediaRecorder);
    } catch (IOException e) {
        e.printStackTrace();
    }

音频侦听器会将读取字节发送到我的活动,我在其中保存一个媒体播放器实例,该实例应读取数据并播放它。我知道听到我刚才说的话没有多大意义,但它只是为了测试如何在媒体播放器中读取管道的内容。这就是我的活动所做的。

ParcelFileDescriptor[] fdPair = ParcelFileDescriptor.createPipe();
            _readFd = fdPair[0];
//              _writer = new FileOutputStream(_writeFd.getFileDescriptor());
            _reader = new FileInputStream(_readFd.getFileDescriptor());
            _mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            _mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.i(LOG_TAG, "Media-Player Completed.");
                }
            });
            _mediaPlayer.setOnErrorListener(new OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.i(LOG_TAG, "Error-What: " + what);
                    return false;
                }
            });
            _mediaPlayer.setDataSource(_readFd.getFileDescriptor());
            Log.i(LOG_TAG, "Set Source of MediaPlayer");
            _mediaPlayer.prepare();
            _mediaPlayer.start();   
        }
        System.arraycopy(buffer, 0, mAudioTxBuffer, 0, bytesRead);

_writer.write(mAudioTxBuffer); _reader.read(mAudioTxBuffer);

目前,如果我想播放收到的字节,我会从媒体播放器收到以下异常:

09-18 10:38:10.785: W/System.err(12136): java.io.IOException: setDataSourceFD failed.: status=0x80000000

目前不知道我是否理解了错误,或者我在代码中有错误。

感谢您的帮助。

应用程序需要具有写入外部的权限 存储(如果输出文件已写入外部存储),以及 还有录制音频的权限。必须在 应用程序的 AndroidManifest.xml 文件,如下所示:

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

相关内容

  • 没有找到相关文章

最新更新