2017-03-10 24 views
0

WiFi経由でRpi上のネットワークソケットに接続するアプリをコーディングし、クライアントやサーバーとの間で文字列などのデータを正常に送信しました。次のステップでは、この場合はクライアントであるクライアントに、サーバから送信されているリアルタイムの音声データを受信して​​再生することになります。Androidでソケット経由でライブオーディオデータを受信

これまでのところ、ソケット変数とオーディオ変数が宣言されています。ボタンがヒットすると、非同期タスク "Listen"が開始されます。私はそれがソケットに接続できることを知っています。その後、入力ストリームを開いてバッファに送り込み、そのバッファをリアルタイムで再生させようとしています。

私はそれを理解することに近いと思うが、私はまだそれがかなり正しいとは思わない。私は私のコードでTODOでわからない領域をマークしました。

public class MainActivity extends AppCompatActivity { 
//audio variables 
static final int sampleFreq = 44100; 
static final int channelConfig = AudioFormat.CHANNEL_OUT_MONO; 
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 
static final int streamType = STREAM_MUSIC; 
static final int audioMode = MODE_STREAM; 
static final int bufferSize = getMinBufferSize(sampleFreq, channelConfig, audioMode); 

//socket variables 
public Socket mySocket; 
private int SERVERPORT = 33333; 
private static final String SERVER_IP = "172.24.1.1"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
} 

public void onClickListen(View view) { 
    //call async task 
    new Listen().execute(); 
} 


private class Listen extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      //get IP and port number 
      InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
      Log.d(debugStr, "In initial listen connect"); 
      //create socket 
      mySocket = new Socket(serverAddr, SERVERPORT); 

     } catch (UnknownHostException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } finally { 
      if (mySocket == null) { 
       str1 = "Socket became null, listener"; 
       return null; 
      } 



//TODO here is all the new audio stuff 
      try { 
       //creates buffer to hold incoming audio data 
       byte [] audioBuffer = new byte[4096]; 

       //creates input stream readers to read incoming data 
       BufferedInputStream myBis = new BufferedInputStream(mySocket.getInputStream()); 
       DataInputStream myDis = new DataInputStream(myBis); 
       Log.d(debugStr, "Input created, listener"); 

       // Read the file into the music array. 
       int i = 0; 

       //TODO unsure of while loop condition 
       while (myDis.read() != -1) { 
        //since incoming audio is unknown size, use estimated buffer size 
        audioBuffer[bufferSize-1-i] = myDis.readByte(); 
        i++; 
       } 
       //create audio track object 
       AudioTrack myAudioTrack = new AudioTrack(streamType, sampleFreq, channelConfig, audioEncoding, bufferSize, audioMode); 

       //TODO write audio data to somewhere? 
       //TODO should this be in a while loop for live stream? 
       //TODO will this actually play the audio? 
       myAudioTrack.write(audioBuffer, 0, bufferSize); 

       //close input streams 
       myDis.close(); 
       myBis.close(); 


      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      try { 
       mySocket.close(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      return null; 
     } 
    } 
} 
} 

私のwhileループ条件が正しいとは思わないか、入力ストリームからデータを読み取る正しい方法でもないと思います。また、実際にオーディオを再生する場合は、whileループ内にaudioTrack.writeがあるはずです。

ご迷惑をおかけして申し訳ございません。

答えて

0

私はそれを理解しました。

byte [] audioBuffer = new byte[4096]; 

       //creates input stream readers to read incoming data 
       BufferedInputStream myBis = new BufferedInputStream(mySocket.getInputStream()); 
       DataInputStream myDis = new DataInputStream(myBis); 

       Log.d(debugStr, "Input created, listener"); 
       AudioTrack myAudioTrack = new AudioTrack(streamType, sampleFreq, channelConfig, audioEncoding, bufferSize, audioMode); 
       //Log.d(debugStr, String.valueOf(mySocket.getInputStream().read(audioBuffer))); 

       Log.d(debugStr, "track made"); 
       // Read the file into the music array. 
       int i = 0; 
       //TODO unsure of while loop condition 
       while (mySocket.getInputStream().read(audioBuffer) != -1) { 

        audioBuffer[audioBuffer.length-1-i] = myDis.readByte(); 
        myAudioTrack.play(); 
        myAudioTrack.write(audioBuffer, 0, audioBuffer.length); 
        i++; 
       } 



       //close input streams 
       myDis.close(); 
       myBis.close(); 
関連する問題