2013-11-22 15 views
4

我是一個android開發人員,並沒有廣泛的關於java web開發的知識,所以如果問題有點奇怪,請耐心等待。我創建了一個java類,它應該可以接收來自android應用程序的音頻數據包並在PC揚聲器上播放。該應用程序基本上是一個從手機到服務器的流應用程序該類作爲應用程序運行良好。作爲一個應用程序,但不作爲一個小程序工作的Java類

下面是類的代碼:

class Server { 

AudioInputStream audioInputStream; 
static AudioInputStream ais; 
static AudioFormat format; 
static boolean status = true; 
static int port = 50005; 
static int sampleRate = 8000; 



public static void main(String args[]) throws Exception { 


    DatagramSocket serverSocket = new DatagramSocket(50005); 

    /** 
    * Formula for lag = (byte_size/sample_rate)*2 
    * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken. 
    * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken. 
    * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728. 
    */ 

    byte[] receiveData = new byte[5000]; 

    format = new AudioFormat(sampleRate, 16, 1, true, false); 

    while (status == true) { 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, 
       receiveData.length); 

     serverSocket.receive(receivePacket); 

     ByteArrayInputStream baiss = new ByteArrayInputStream(
       receivePacket.getData()); 

     ais = new AudioInputStream(baiss, format, receivePacket.getLength()); 
     toSpeaker(receivePacket.getData()); 

    } 



} 

public static void toSpeaker(byte soundbytes[]) { 
    try { 

     DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format); 
     SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 

     sourceDataLine.open(format); 

     FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); 
     volumeControl.setValue(6.0206f); 

     sourceDataLine.start(); 
     sourceDataLine.open(format); 

     sourceDataLine.start(); 

     System.out.println("format? :" + sourceDataLine.getFormat()); 

     sourceDataLine.write(soundbytes, 0, soundbytes.length); 
     System.out.println(soundbytes.toString()); 
     sourceDataLine.drain(); 
     sourceDataLine.close(); 
    } catch (Exception e) { 
     System.out.println("Not working in speakers..."); 
     e.printStackTrace(); 
    } 
} 
} 

現在我想的類轉變爲一個小程序,這樣我可以部署相同的Web應用程序。這裏是小程序代碼:

public class AppletTest extends Applet { 


    AudioInputStream audioInputStream; 
    static AudioInputStream ais; 
    static AudioFormat format; 
    static boolean status = true; 
    static int port = 50005; 
    static int sampleRate = 8000; 



    public void init() 
    { 

    } 

    public void stop() 
    { 

    } 



    public void listening() 
    { 
     DatagramSocket serverSocket = null; 
     try { 
      serverSocket = new DatagramSocket(50005); 
     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      /** 
      * Formula for lag = (byte_size/sample_rate)*2 
      * Byte size 9728 will produce ~ 0.45 seconds of lag. Voice slightly broken. 
      * Byte size 1400 will produce ~ 0.06 seconds of lag. Voice extremely broken. 
      * Byte size 4000 will produce ~ 0.18 seconds of lag. Voice slightly more broken then 9728. 
      */ 

      byte[] receiveData = new byte[5000]; 

      format = new AudioFormat(sampleRate, 16, 1, true, false); 

      while (status == true) { 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, 
         receiveData.length); 

       try { 
        serverSocket.receive(receivePacket); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       ByteArrayInputStream baiss = new ByteArrayInputStream(
         receivePacket.getData()); 

       ais = new AudioInputStream(baiss, format, receivePacket.getLength()); 
       toSpeaker(receivePacket.getData()); 

      } 
    } 



    public static void toSpeaker(byte soundbytes[]) { 
     try { 

      DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format); 
      SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 

      sourceDataLine.open(format); 

      FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN); 
      volumeControl.setValue(6.0206f); 

      sourceDataLine.start(); 
      sourceDataLine.open(format); 

      sourceDataLine.start(); 

      System.out.println("format? :" + sourceDataLine.getFormat()); 

      sourceDataLine.write(soundbytes, 0, soundbytes.length); 
      System.out.println(soundbytes.toString()); 
      sourceDataLine.drain(); 
      sourceDataLine.close(); 
     } catch (Exception e) { 
      System.out.println("Not working in speakers..."); 
      e.printStackTrace(); 
     } 
    } 


} 

HTML代碼來調用該applet

<HTML> 
<TITLE>Applet Test</TITLE> 
<HEAD></HEAD> 
<BODY> 
<applet code="AppletTest.class" height="200" width="500">Applet</applet> 
</BODY> 
</HTML> 

我主持的小程序here

這是機器人活動發送數據包形式的聲音

public class SendActivity extends Activity { 
    private Button startButton, stopButton; 

    public byte[] buffer; 
    public static DatagramSocket socket; 
    private int port = 50005; 
    AudioRecord recorder; 

    private int sampleRate = 8000; 
    @SuppressWarnings("deprecation") 
    private int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, 
      audioFormat); 
    private boolean status = true; 


    int bufferSizeInBytes; 
    int bufferSizeInShorts; 
     int shortsRead; 
     short audioBuffer[]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_send); 

     startButton = (Button) findViewById(R.id.start_button); 
     stopButton = (Button) findViewById(R.id.stop_button); 

     startButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       status = true; 
       startStreaming(); 


      } 

     }); 

     stopButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       status = false; 
       recorder.release(); 
       Log.d("VS", "Recorder released"); 

      } 

     }); 

     minBufSize += 5120; 
     System.out.println("minBufSize: " + minBufSize); 
    } 


    public void startStreaming() { 

     Thread streamThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 

        DatagramSocket socket = new DatagramSocket(); 
        Log.d("VS", "Socket Created"); 

        byte[] buffer = new byte[minBufSize]; 

        Log.d("VS", "Buffer created of size " + minBufSize); 
        DatagramPacket packet; 

        final InetAddress destination = InetAddress 
          .getByName("http://abhideepmallick.byethost16.com/"); 

//final InetAddress destination = InetAddress.getByName("192.168.1.20");//machine IP 

Log.d("VS", "Address retrieved"); 

        recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, 
          sampleRate, channelConfig, audioFormat, 
          minBufSize * 10); 
        Log.d("VS", "Recorder initialized"); 

        recorder.startRecording(); 

        while (status == true) { 

         // reading data from MIC into buffer 
         minBufSize = recorder.read(buffer, 0, buffer.length); 

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

         socket.send(packet); 
         System.out.println("MinBufferSize: " + minBufSize); 

        } 

       } catch (UnknownHostException e) { 
        Log.e("VS", "UnknownHostException"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        Log.e("VS", "IOException"); 
       } 
      } 

     }); 
     streamThread.start(); 
    } 


} 

的Android 佈局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".SendActivity" > 



    <Button 
     android:id="@+id/stop_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/start_button" 
     android:layout_alignBottom="@+id/start_button" 
     android:layout_toRightOf="@+id/start_button" 
     android:text="Stop" /> 

    <Button 
     android:id="@+id/start_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="79dp" 
     android:layout_marginTop="163dp" 
     android:text="Start" /> 

</RelativeLayout> 

我應該怎麼做才能讓java類作品作爲一個小程序?

回答

0

我想你管理的瀏覽器的Java插件是最新的,以啓動小程序。

一個小程序也有一個lifecylce像一個活動。

init()方法就像構造函數,start()方法的目的是通知applet應該開始執行。

因此,重寫啓動方法並從那裏調用您的監聽方法。 對於您可以通過這個幻燈片瀏覽更多信息:http://de.slideshare.net/myrajendra/applet-life-cycle

一個例子可以在這裏找到:http://www.ugrad.cs.ubc.ca/~cs219/CourseNotes/Java/applets/lifecycle.html

+0

將小程序可以將音頻發送至PC揚聲器,其中類是能夠? – kittu88

+0

它應該(至少MIDI是沒有問題的),只需試一試。 – Spindizzy

相關問題