假设我有一个wav音频留在我的磁盘上称为MyDummy.wav。 我想将它作为RTP包发送到服务器。但是正如我所看到的,RTP Packet发送时有一些问题,比如20毫秒等等......我将如何确定RTP数据包的大小......我真的无法弄清楚如何做很多事情,而且都是必要的?发送Wav音频文件作为RTP包
任何人都可以告诉伪代码如何将音频文件打包为RTP包 以及在哪个时间发送音频或提供任何我可以调查的示例代码?
假设我有一个wav音频留在我的磁盘上称为MyDummy.wav。 我想将它作为RTP包发送到服务器。但是正如我所看到的,RTP Packet发送时有一些问题,比如20毫秒等等......我将如何确定RTP数据包的大小......我真的无法弄清楚如何做很多事情,而且都是必要的?发送Wav音频文件作为RTP包
任何人都可以告诉伪代码如何将音频文件打包为RTP包 以及在哪个时间发送音频或提供任何我可以调查的示例代码?
希皮亚斯,对一些理论的有效载荷的相关答案在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此外,如果您在这些文件夹中进行挖掘,它们还会有一些相关的实用程序,如监控器。
请看看下面的开源项目:
http://www.live555.com/mediaServer/
它支持流媒体WAV音频文件的开箱。
“LIVE555媒体服务器”是一个完整的RTSP服务器应用程序。它可以流多种媒体文件(必须存储在当前工作目录 - 即,您将从这里启动应用程序的目录 - 或子目录。):”
你应该尝试:WAV-2-RTP software
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
我建议你看一看[LIVE555库](http://www.live555.com /)。从示例程序开始。肯定会理顺一点。 – RohitMat
有没有满意的答案:参考代码是丑陋的。没有谈及时机。但是,谢谢所有..我应该选择一个 –