【问题标题】:Sending Wav Audio File As RTP Packets将 Wav 音频文件作为 RTP 数据包发送
【发布时间】:2017-03-25 19:14:00
【问题描述】:

假设我的磁盘上有一个 wav 音频,称为 MyDummy.wav。 我想将它作为 RTP 数据包发送到服务器。但正如我所见,RTP 数据包发送一些时间问题,比如 20 毫秒等......以及我将如何确定 RTP 数据包的大小......我真的不知道如何做很多事情,而且所有事情都是必要的?

任何人都可以作为伪代码告诉如何将音频文件打包为 RTP 数据包 我应该在什么时间发送音频或提供任何我可以调查的示例代码?

【问题讨论】:

  • 我建议你看看Live555 Library。从示例程序开始。肯定会理顺一些事情。
  • 没有满意的答案:参考代码很丑,不谈时序。但是谢谢大家..我应该选择一个

标签: audio-streaming rtsp rtp


【解决方案1】:

你应该试试:WAV-2-RTP software

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      请查看以下开源项目:

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

      它支持开箱即用的流式 wav 音频文件。

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

      • WAV (PCM) 音频文件(文件名后缀为“.wav”)

      【讨论】:

        【解决方案4】:

        Hippias,你的一些关于该理论的有效载荷相关答案在https://www.rfc-editor.org/rfc/rfc3952#section-3中得到了很好的描述

        我在下面添加了 Java 示例,因为它很容易阅读并且足够详细,供您学习。

        虽然您可能不想从头开始编写 wav 流媒体。 有一个旧的 Java 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 此外,他们还有许多相关的实用程序,例如监视您是否在这些文件夹中四处挖掘。

        【讨论】:

          猜你喜欢
          • 2013-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-26
          • 2016-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多