2016-11-11 11 views
2

내 디스크에 wav 오디오를 저장한다고 가정하면 MyDummy.wav라고합니다. RTP 패킷으로 서버에 보내고 싶습니다. 그러나 내가 보는 것처럼 RTP Packet의 일부 타이밍 문제가 있습니다. 일부는 20ms라고 말합니다. ... 그리고 어떻게 RTP Packet의 크기를 결정할 것인가 ... 나는 많은 것을하는 법을 이해할 수 없으며 필요한 모든 것입니다. ?WTP 오디오 파일을 RTP 패킷으로 전송

누구나 Pseudocode로 오디오 파일을 패킷 으로 패킷 화하고 어떤 타이밍에 오디오를 보내거나 조사 할 수있는 샘플 코드를 제공해야합니까? 읽기 매우 쉽게 당신이 따라하기에 대한 자세한 충분하기 때문에

+0

내가 [Live555 도서관]에서 살펴 봐야 당신을 제안 (http://www.live555.com /). 샘플 프로그램부터 시작하십시오. 조금은 분명히 정리할 수있을 것입니다. – RohitMat

+0

만족스러운 답변이 없습니다. 참조 코드가 추악합니다. 타이밍에 대해 아무 말도하지 않습니다. 하지만 고마워. 내가 선택한 게 틀림 없어. –

답변

2

히피 아스는, 이론에 대한 관련하여 페이로드의 일부 답변

https://tools.ietf.org/html/rfc3952#section-3에 아주 잘 설명되어 나는 아래 자바 예제를 추가했습니다.

아마도 처음부터 wav 스트리머를 쓰고 싶지는 않지만. 이 적극적으로 지금 몇 년 동안 유지되지 비록 자유롭게 사용할 수있는 오래된 자바 RTP 라이브러리가있다 : https://github.com/biasedbit/efflux

읽기와 wav 파일을 작성, 여기에 깔끔한 튜토리얼은 다음과 같습니다 http://www.labbookpages.co.uk/audio/javaWavFiles.html - 친화적 인 땅의.

또한 Columbia에는 거의 20 년 전부터 RTP 수신기에 대한 몇 가지 코드가 있습니다. http://www.cs.columbia.edu/~hgs/teaching/ais/1998/projects/java_rtp/java/net/RTP/RTCPReceiverThread.java 또한 이러한 폴더에서 주위를 파헤 치면 모니터링과 같은 여러 유틸리티가 있습니다.

4

다음과 같은 오픈 소스 프로젝트를 확인하시기 바랍니다 : 그것은 상자 밖으로 스트리밍 WAV 오디오 파일을 지원

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

.

' "LIVE555 미디어 서버"는 완전한 RTSP 서버 응용 프로그램입니다. 그것은 미디어 파일 여러 종류의 스트리밍 할 수 있습니다 (- 즉, 당신은 응용 프로그램을 실행하는 디렉토리 - 현재 작업 디렉토리에 저장해야합니다 또는 하위 디렉토리를.) : '

  • WAV (PCM) 오디오 파일을
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