2016-06-22 15 views
4

アンドロイドからC#サーバーにオーディオストリーム/ wavファイルをバイト配列として送信しようとしていますが、単純なStringを受け取る。数秒後にWebsocketを使用してAndroid(クライアント)からC#(サーバー)にオーディオストリームを送信します。

C#サーバーが接続を切断、理由

プロトコルエラーなどのプロトコルエラーで:コード= 1002年、私は、ファイルが大きいときにフレームサイズを超えると、ウェブソケット接続が失われたと思います。退出はありますか?

Iは、記録ストリームを削除する、次のようにアンドロイドからバイト配列としてWAVファイルを送信しようとした:

byte[] buffer = new byte[1024]; 
        try { 
         FileInputStream fis = new FileInputStream(file); 
         while(true) { 
          int in = fis.read(buffer, 0, buffer.length); 
           if(in != -1) { 
            mWebSocket.send(buffer); 
           }else{ 
            break; 
           } 
         } 
        }catch (Exception e) { 
         Log.d("Exception", e.toString()); 
        } 

アンドロイドコード:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

Button stopPlaying, send, record, stop; 
private AudioRecord audiorecord; 
private static int SAMPLER = 44100; //Sample Audio Rate 
private int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
int minBufSize = AudioRecord.getMinBufferSize(SAMPLER, channelConfig, audioFormat); 
private boolean status = true; 
URI uri = URI.create("ws://ab1d04d2.ngrok.io"); 
private String outputFile = null; 
private Thread senderThread = null; 
private WebSocketClient mWebSocket; 
private File file = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    file = new File(Environment.getExternalStorageDirectory(), "recording.wav"); 
    setContentView(honeywell.rana.sumit.voicecontrol.R.layout.activity_main); 
    audiorecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLER, channelConfig, audioFormat, minBufSize); 
    send = (Button) findViewById(R.id.send); 
    send.setOnClickListener(this); 
    stop = (Button) findViewById(R.id.stop); 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.send: 
      AudioTask task = new AudioTask(); 
      task.execute(); 
      break; 
     case R.id.stop: 
      audiorecord.stop(); 
      mWebSocket.close(); 
      Log.d("Socket Closed", ""); 
     default: 

      break; 
    } 
} 

public class AudioTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      mWebSocket = new WebSocketClient(uri) { 
       @Override 
       public void onOpen(ServerHandshake handshakedata) { 
        Log.d("Connected: ", mWebSocket.getConnection().toString()); 
        mWebSocket.send("hello!");      
        byte[] buffer = new byte[minBufSize]; 
        audiorecord.startRecording(); 
        while (true) { 
         int number = audiorecord.read(buffer, 0, minBufSize); 
         for (int i = 0; i < number; i++) { 
          mWebSocket.send(buffer); 
         } 
        } 
       } 

       @Override 
       public void onMessage(String message) { 
         Log.d("Received: ", message); 
       } 

       @Override 
       public void onClose(int code, String reason, boolean remote) { 
        Log.d("Closed", "Code = " + code + ", Reason: " + reason); 
       } 

       @Override 
       public void onError(Exception ex) { 
        Log.d("Error: ", ex.toString()); 
       } 
      }; 
      mWebSocket.connect(); 
     } catch (Exception e) { 
      Log.d("Exception: ", e.toString()); 
     } 
     return null; 
    } 
} 

}

C#コード:

namespace ChatServer 
{ 
class Program 
{ 


    static WaveOut waveOut; 
    static BufferedWaveProvider bufferedWaveProvider = null; 

    private static WebSocketServer appServer = new WebSocketServer(); 


    static void Main(string[] args) 
    { 

     Console.WriteLine("Press any key to start the WebSocketServer!"); 

     Console.ReadKey(); 
     Console.WriteLine(); 

     waveOut = new WaveOut(); 
     bufferedWaveProvider = new BufferedWaveProvider(new WaveFormat(44100, 16, 2)); 
     waveOut.Init(bufferedWaveProvider); 
     waveOut.Play(); 
     appServer.NewMessageReceived += new SessionHandler<WebSocketSession, string>(appServer_NewMessageReceived); 
     appServer.NewDataReceived += new SessionHandler<WebSocketSession, byte[]>(appServer_NewDataReceived); 
     appServer.NewSessionConnected += AppServer_NewSessionConnected;   
     appServer.SessionClosed += new SessionHandler<WebSocketSession, CloseReason>(appServer_SessionClosed);  

     //Setup the appServer 
     if (!appServer.Setup(80)) //Setup with listening port 
     { 
      Console.WriteLine("Failed to setup!"); 
      Console.ReadKey(); 
      return; 
     } 

     //Try to start the appServer 
     if (!appServer.Start()) 
     { 
      Console.WriteLine("Failed to start!"); 
      Console.ReadKey(); 
      return; 
     } 

     Console.WriteLine("The server started successfully, press key 'q' to stop it!"); 

     while (Console.ReadKey().KeyChar != 'q') 
     { 
      Console.WriteLine(); 
      continue; 
     } 

     //Stop the appServer 
     appServer.Stop(); 
     Console.WriteLine(); 
     Console.WriteLine("The server was stopped!"); 
     Console.ReadKey(); 
    } 

    private static void AppServer_NewSessionConnected(WebSocketSession session) 
    { 
     Console.WriteLine("New Client connected: " + session.SessionID); 
    } 

    static void appServer_SessionClosed(WebSocketSession session, CloseReason reason) 
    { 
     Console.WriteLine(reason); 
    } 

    static void appServer_NewDataReceived(WebSocketSession session, byte[] value) 
    { 

     bufferedWaveProvider.AddSamples(value, 0, value.Length); 

    } 

    static void appServer_NewMessageReceived(WebSocketSession session, string message) 
    { 
     //Send the received message back 

     session.Send("Server: " + message); 
     Console.WriteLine(message); 
    } 

答えて

1

私はそれが最終的に働いた、それはちょうど分問題だった。私はちょうどアンドロイドのバッファサイズを64/128/512に減らしましたが、今は完全に動作しています。

関連する問題