AudioStream.java
上传用户:gmxazy
上传日期:2022-06-06
资源大小:70k
文件大小:3k
源码类别:

J2ME

开发平台:

Java

  1. import java.io.*;
  2. import javax.microedition.io.*;
  3. /**
  4.  * RTP audio stream. This creates a UDP socket on the server, which is then
  5.  * connected to a client and data pumped 25x per second.
  6.  */
  7. public class AudioStream implements Runnable {
  8. /**
  9.  * Sequence number. This should increment with every packet sent.
  10.  */
  11. private int seqnumber = 0;
  12. /**
  13.  * Timestamp increments by the number of samples with every packet sent.
  14.  */
  15. private int timestamp = 0;
  16. /**
  17.  * Buffer containing the current sample frame.
  18.  */
  19. private final byte[] data = new byte[2048];
  20. /**
  21.  * Connection to the client.
  22.  */
  23. private final UDPDatagramConnection socket;
  24. /**
  25.  * Datagram filled and sent to the client.
  26.  */
  27. private final Datagram packet;
  28. /**
  29.  * Thread in which the server pumps the data.
  30.  */
  31. private Thread thread;
  32. /**
  33.  * Whether to continue sending data or not.
  34.  */
  35. private boolean running;
  36. /**
  37.  * Creates a new audio stream on the specified port. Use -1 to bind to an
  38.  * ephemeral port.
  39.  */
  40. public AudioStream(int port) throws IOException {
  41. String addr = "datagram://:";
  42. if (port >= 0) {
  43. addr += port;
  44. }
  45. socket = (UDPDatagramConnection) Connector.open(addr);
  46. packet = socket.newDatagram(data, 2048);
  47. // fills the buffer with noise
  48. for (int n = 0; n < 2048; n++) {
  49. data[n] = (byte) n;
  50. }
  51. }
  52. /**
  53.  * Returns the local port this server is bound to.
  54.  */
  55. public int getPort() throws IOException {
  56. return socket.getLocalPort();
  57. }
  58. /**
  59.  * Connects to a UDP client address and starts streaming the audio.
  60.  */
  61. public void play(String addr, int port) {
  62. if (running) {
  63. return;
  64. }
  65. try {
  66. packet.setAddress("datagram://" + addr + ":" + port);
  67. thread = new Thread(this);
  68. thread.start();
  69. } catch (Exception e) {
  70. dprint(e);
  71. }
  72. }
  73. /**
  74.  * Pauses the streaming (by stopping the thread pumping the data).
  75.  */
  76. public void pause() {
  77. running = false;
  78. }
  79. /**
  80.  * Stops the streaming and closes the connection.
  81.  */
  82. public void stop() {
  83. running = false;
  84. try {
  85. thread.join();
  86. } catch (InterruptedException e) {}
  87. try {
  88. socket.close();
  89. } catch (IOException e) {
  90. dprint(e);
  91. }
  92. }
  93. /**
  94.  * Fills the UDP packet with the RTP header (the data is static in this
  95.  * demo, so never needs updating).
  96.  */
  97. public void setPayload() {
  98. data[0] = (byte) 128;
  99. data[1] = (byte) 96;
  100. data[2] = (byte) (seqnumber >>  8);
  101. data[3] = (byte) (seqnumber >>  0);
  102. seqnumber += 1;
  103. data[4] = (byte) (timestamp >> 24);
  104. data[5] = (byte) (timestamp >> 16);
  105. data[6] = (byte) (timestamp >>  8);
  106. data[7] = (byte) (timestamp >>  0);
  107. timestamp += 882;
  108. data[ 8] = (byte) 0;
  109. data[ 9] = (byte) 0;
  110. data[10] = (byte) 0;
  111. data[11] = (byte) 0;
  112. // 882 being one audio frame (1/25 second), 12 being the header size
  113. packet.setLength(882 + 12);
  114. }
  115. /**
  116.  * The audio data pump. RTP packets are sent regularly to the client.
  117.  */
  118. public void run() {
  119. running = true;
  120. dprint("Sending packetsn");
  121. try {
  122. while (running) {
  123. setPayload();
  124. socket.send(packet);
  125. try {
  126. Thread.sleep(39);
  127. } catch (Exception x) {}
  128. }
  129. } catch (IOException e) {
  130. dprint(e);
  131. }
  132. dprint("Stopping packetsn");
  133. }
  134. public void dprint(Object obj) {
  135. System.out.print(obj);
  136. }
  137. }