将Wav音频文件作为RTP数据包发送

时间:2016-11-11 14:21:55

标签: audio-streaming rtsp rtp

假设我的磁盘上有一个wav音频,请将其命名为MyDummy.wav。 我想将其作为RTP数据包发送到服务器。但正如我所看到的那样,RTP数据包发送有一些时间问题,有些说20毫秒等...而且我将如何确定RTP数据包的大小...我真的无法弄清楚如何做很多事情,并且都是必要的?

任何人都可以将Pseudocode称为如何将音频文件打包为RTP数据包 我应该在哪个时间发送音频或提供我可以调查的任何示例代码?

4 个答案:

答案 0 :(得分:4)

请查看以下开源项目:

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

Hippias,关于该理论的一些有效负载相关答案在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 - earthling friendly。

此外,哥伦比亚大约20年前有一些RTP接收器的代码:http://www.cs.columbia.edu/~hgs/teaching/ais/1998/projects/java_rtp/java/net/RTP/RTCPReceiverThread.java此外,他们有一堆相关的实用程序,如监控,如果你在这些文件夹中挖掘。

答案 3 :(得分: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