4

現在、私の会社で voip アプリケーションの調査を行っています。

デバイスのマイクの音をamrに録音し、暗号化してサーバーにデータを送信し、そこから反対側がストリーミングして復号化したいと考えています。一部のテストケースでは、現在 MediaRecorder を使用して 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();
    }

AudioListener は、データを読み取って再生する MediaPlayer のインスタンスを保持する Activity に読み取りバイトを送信します。私が今話したことを聞いてもあまり意味がないことはわかっていますが、これは MediaPlayer でパイプのコンテンツを読み取る方法をテストするためのものです。それが私のアクティビティです。

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);

現時点では、受信したバイトを再生したい場合、MediaPlayer から次の例外が発生します。

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

現在、何か間違っていることを理解しているのか、コードにバグがあるのか​​ わかりません。

ご協力いただきありがとうございます。

4

1 に答える 1