2016-10-06 6 views
0

私はpythonサーバーにpcmデータを送信するアプリケーションを開発しようとしています。アンドロイドからPythonサーバーまでの時間長のフレーミングバイトパケットはどうですか?

私は、リアルタイムのオーディオ信号を取得するためにaudiorecordのライブラリを使用していました。

そして、これはソースコードです。

/*------ setting audio recording ------*/ 

private static final int SAMPLE_RATE = 44100; 
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; 
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 

private boolean isRecording = true; 
private AudioRecord recorder = null; 
private Thread recordingThread; 
private AudioTrack player; 
//byte[] TotalByteMessage; 

/*------ about socket communication ------*/ 
public DatagramSocket socket; 
private int port = 7979; 
String IP = "192.168.0.4"; 



/*------ Recording, Playing and Sending packets method ------*/ 

private void startStreaming() { 

    recordingThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 

      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

      try { 
       /*------about socket------*/ 
       socket = new DatagramSocket(); 
       Log.d(LOG_NW, "Socket Created!"); 
       DatagramPacket packet; 

       InetAddress destination = InetAddress.getByName(IP); 
       Log.d(LOG_NW, "Address retrieved!"); 


       /*------setting recording && playing------*/ 
       //get MinBufferSize for audio recording 
       int Buffer_Size = AudioRecord.getMinBufferSize(SAMPLE_RATE, 
         RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); 
       Log.d(LOG_Audio, "Min buffer size is " + Buffer_Size); 

       if (Buffer_Size == AudioRecord.ERROR || Buffer_Size == AudioRecord.ERROR_BAD_VALUE) { 
        Buffer_Size = SAMPLE_RATE * 2; 
       } 


       recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, 
         SAMPLE_RATE, RECORDER_CHANNELS, 
         RECORDER_AUDIO_ENCODING, Buffer_Size); 

       if (recorder.getState() != AudioRecord.STATE_INITIALIZED) { 
        Log.d(LOG_Audio, "Audio Record can't initialize!"); 
        return; 
       } 


       player = new AudioTrack(AudioManager.STREAM_MUSIC, 
         SAMPLE_RATE, AudioFormat.CHANNEL_OUT_MONO, 
         RECORDER_AUDIO_ENCODING, Buffer_Size, 
         AudioTrack.MODE_STREAM); 
       Log.d(LOG_Audio, "ready for playing music by using audiotrack"); 

       player.setPlaybackRate(SAMPLE_RATE); 

       byte[] audioBuffer = new byte[Buffer_Size]; 
       Log.d(LOG_Audio, "AudioBuffer created of size " + Buffer_Size); 

       recorder.startRecording(); 
       Log.d(LOG_Audio, "Start Recording!"); 

       player.play(); 
       Log.d(LOG_Audio, "Start Playing!"); 


       while (isRecording == true) { 
        //reading data from MIC into buffer 
        recorder.read(audioBuffer, 0, audioBuffer.length); 
        player.write(audioBuffer, 0, audioBuffer.length); 


        //putting buffer in the packet 
        packet = new DatagramPacket(audioBuffer, audioBuffer.length, destination, port); 

        socket.send(packet); 
        Log.d(LOG_NW, "packet sending to " + destination + " with port : " + port); 

       } 

      } catch (UnknownHostException e) { 
       Log.d(LOG_Audio, "UnknownHostException"); 
      } catch (IOException e) { 
       Log.d(LOG_Audio, "IOException"); 
      } 
     } 
    }); // end of recordingThread 

    recordingThread.start(); 
} 

、これはPythonのサーバーコードです。

import socket  
import numpy as np 
import matplotlib.pyplot as plt 

IP = "192.168.0.4" 
server_address = (IP, 7979) 
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
buffer_size = 3584 
server.bind(server_address) 

i = True 
while(i): 
    print "Listening...\n" 
    packet, client = server.recvfrom(buffer_size) 
    #Convert packet to numpy array 
    signal = np.fromstring(packet, dtype=np.int16)  
    i=False 
server.close() 

このPythonコードでは、1つのパケットしか受信されません。

しかし、その後、私はいくつかのパケットを受信するためにリストを作ります。

は私が64msのサイズがあるフレーム(時間を!)ウィンドウとFFT(高速フーリエ変換)のためにしたいが、問題は、パケットが3584バイトです。

は、だから私は、ウィンドウやPythonのサーバーにアンドロイドからバイトのパケットでFFTを行う方法がわかりません。

は、どのように私は時間の長さを使用してフレームを作ることができますか?

+0

パケットは3584バイトです。なぜFFTが問題になるのですか?パケットの長さを2の累乗にしますか?そして、あなたはそれをパディングとテーパリングによって達成したいのですか?それは窓ガラスのことですか?申し訳ありませんが、すべてのこれらの質問が、私は正確に何が問題なのかよく分かりません。 –

+0

ご意見ありがとうございます。さて、私はちょうど1つのパケットを受信しましたが、私はwindowingとfftを実行するために、より多くのパケットを受信したいと思います。問題は、私は64ミリメートルの長さを持っているフレームを持っているべきだと思うが、私は3584バイトの長さを持つパケットを持っています。だから私はどのようにウィンドウ処理を実行するのか分からない。 –

答えて

0

あなたは、あなたのPythonコードであなたのwhileループに問題

i = True 
while(i): 
    print "Listening...\n" 
    packet, client = server.recvfrom(buffer_size) 

    #Convert packet to numpy array 
    signal = np.fromstring(packet, dtype=np.int16)  

    i=False 
server.close() 

これは、ループに入るi == Trueするので、その後、一回の反復を通過し、最初の反復の終わりにi = Falseを設定しますを持っていますループが終了します。

+0

はい、私はパケットを受け取りたいと思っていました。私のコードを修正した後(パケットを連続して受信する)、そして64msの間、パケットをどのようにスライスできますか? –

関連する問題