2016-11-11 3 views
2

Предположим, что у меня есть аудиовход wav на моем диске, назовите его MyDummy.wav. Я хочу отправить его на сервер в виде пакета RTP. Но, как я вижу, есть некоторые проблемы с синхронизацией с отправкой пакета RTP, некоторые говорят, что 20 мс и т. Д. ... И как я буду определять размер пакета RTP ... Я действительно не могу понять, как делать много вещей, и все это необходимо ?Отправка аудиофайла Wav в виде пакетов RTP

Любой может сказать как псевдокод, как пакетировать аудиофайл в виде пакетов RTP и при каких сроках я должен отправить аудио или предоставить какой-либо пример кода, который я могу исследовать?

+0

Я хотел бы предложить вам взглянуть на [LIVE555 Library] (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 - землянин дружелюбным.

Кроме того, у Columbia есть код для приемника RTP почти 20 лет назад: 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 
Смежные вопросы