2016-11-11 201 views
2

假设我有一个wav音频留在我的磁盘上称为MyDummy.wav。 我想将它作为RTP包发送到服务器。但是正如我所看到的,RTP Packet发送时有一些问题,比如20毫秒等等......我将如何确定RTP数据包的大小......我真的无法弄清楚如何做很多事情,而且都是必要的?发送Wav音频文件作为RTP包

任何人都可以告诉伪代码如何将音频文件打包为RTP包 以及在哪个时间发送音频或提供任何我可以调查的示例代码?

+0

我建议你看一看[LIVE555库](http://www.live555.com /)。从示例程序开始。肯定会理顺一点。 – RohitMat

+0

有没有满意的答案:参考代码是丑陋的。没有谈及时机。但是,谢谢所有..我应该选择一个 –

回答

2

希皮亚斯,对一些理论的有效载荷的相关答案在https://tools.ietf.org/html/rfc3952#section-3

描述得很好,我添加下面的Java例子,因为它是很容易阅读和详细足以让你跟随。

虽然你可能不想从头开始写一个wav流媒体。 有一个老的Java库RTP,免费提供的,虽然它没有积极维持几年来:https://github.com/biasedbit/efflux

用于读取和写入wav文件,这里是一个整洁的教程:http://www.labbookpages.co.uk/audio/javaWavFiles.html - 世人友好。另外,哥伦比亚有一些代码可以用于近20年前的RTP接收器:http://www.cs.columbia.edu/~hgs/teaching/ais/1998/projects/java_rtp/java/net/RTP/RTCPReceiverThread.java此外,如果您在这些文件夹中进行挖掘,它们还会有一些相关的实用程序,如监控器。

4

请看看下面的开源项目:

http://www.live555.com/mediaServer/

它支持流媒体WAV音频文件的开箱。

“LIVE555媒体服务器”是一个完整的RTSP服务器应用程序。它可以流多种媒体文件(必须存储在当前工作目录 - 即,您将从这里启动应用程序的目录 - 或子目录。):”

  • 一个WAV(PCM)音频文件(与文件名后缀 “.WAV”)
1
public class UdpDataReceiver implements Runnable { 

    private boolean isRunning = true; 
    private int port = -1; 
    private DatagramSocket socket; 

    public UdpDataReceiver(int port) { 
     this.port = port; 
    } 

    public void stop() { 
     isRunning = false; 
     socket.close(); 
    } 

    @Override 
    public void run() { 
     try { 
      socket = new DatagramSocket(port); 
      System.out.println(" + Listening for UDP data on port " + port + "."); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // Size of data buffer is insignificant; it just needs to be big enough to hold the UDP packet (or it will be truncated). 
     byte[] data = new byte[512]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 

     String file = null; 
     FileOutputStream fos = null; 
     try { 
      // For now we'll just dump to a file. 
      file = "C:\\tmp\\" + System.currentTimeMillis() + ".raw"; 
      fos = new FileOutputStream(file); 

      while (isRunning) { 
       try { 
        socket.receive(packet); 
       } catch (SocketException se) { 
        // If we're just trying to tell the socket we're done, we'll get a SocketException. 
        if (isRunning) { 
         se.printStackTrace(); 
        } 
       } 
       if (packet.getLength() > 12) { 
        // Strip off 12 bytes of header data. 
        fos.write(packet.getData(), packet.getOffset() + 12, packet.getLength() - 12); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       fos.flush(); 
       fos.close(); 
       convertULawFileToWav(file); 
      } catch (Exception e) { 
      } 
      System.out.println(" + Closed port " + port + " and wrote UDP packets to file: " + file); 
     } 
    } 

    public static void convertULawFileToWav(String filename) { 
     File file = new File(filename); 
     if (!file.exists()) 
      return; 
     try { 
      long fileSize = file.length(); 
      int frameSize = 160; 
      long numFrames = fileSize/frameSize; 
      AudioFormat audioFormat = new AudioFormat(Encoding.ULAW, 8000, 8, 1, frameSize, 50, true); 
      AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file), audioFormat, numFrames); 
      AudioSystem.write(audioInputStream, Type.WAVE, new File(file.getAbsolutePath().substring(0, file.getAbsolutePath().length() - 3) + "wav")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    // For testing... 
    public static void main(String[] args) throws InterruptedException { 
     UdpDataReceiver r1 = new UdpDataReceiver(65337); 
     new Thread(r1).start(); 
     // Send data... 
     Thread.sleep(30000); 
     r1.stop(); 
    } 

} 
shareeditflag