Tag: 音频流

MP3:对于任何给定的字节位置,以毫秒为单位获取位置的方法?

我创建了一个servlet,它从客户端请求的任何给定字节位置开始返回一个流(来自MP3文件)。 这允许客户端在任何给定的字节位置立即开始播放,而无需进行任何本地搜索。 现在,我有一个可视化进度的滑块。 我正在使用当前字节位置来更新滑块。 但是,我还想在几秒钟内显示当前位置。 这要求服务器可以将当前位置(以字节为单位)“转换”为以毫秒为单位的位置。 然后,服务器可以以毫秒为单位提供流开始位置作为响应头。 有没有人有关于如何计算当前位置的经验,以字节为单位到毫秒? UPDATE 从评论中可以清楚地看出,没有精确的方法可以将转换字节转换为毫秒,反之亦然,无需将MP3文件解码到该点(以毫秒或字节为单位),然后确定已读取的字节数或毫秒数已经玩过了。 但是,考虑到服务器,例如100个用户同时请求文件,这种方法显然不会表现得太好。 然后,服务器必须将MP3文件解码到请求的位置,然后从该点返回流。 我选择了与性能交换精度,并采用了一种方法,它给了我近似的位置,这对于一个只是为了播放音轨的播放器来说已经足够好了(而不是将音频与其他音源同步到毫秒级)。 我所做的是玩家(在客户端)现在只关心毫秒(MS)。 也就是说,进度条的当前值和最大值是MS,而不是第一次的字节。 要从任何给定位置开始播放,客户端请求服务器(servlet)提供从MS中任何给定位置开始的音频流。 servlet使用JAudioTagger获取有关文件的详细信息,然后对MS位置对应的字节位置进行近似计算。 我测试过它,它与CBR(恒定比特率)文件配合得很好。 该方法不适用于VBR(可变比特率)文件,因为帧大小可能会有所不同。 请注意,这只是一个播放音乐文件的播放器。 它不打算将音频与其他媒体同步到MS。 下面提供了从MS转换为字节的代码剪切。 更新(2012年7月3日) servlet已经使用下面的代码运行了很长一段时间,而且工作得非常好。 已经播放了数以千计的MP3,从ms到字节的近似值可以正常工作。 更新(2017年1月3日) servlet仍然使用完全相同的代码运行,并且已经很好地播放了数十万个MP3。 在制作过程中,没有任何关于播放和时间的投诉。 /** * Returns the approximate byte position for any given position in * milliseconds. * * http://www.java2s.com/Open-Source/Android/Mp3/needletagger/org/jaudiotagger/audio/mp3/MP3AudioHeader.java.htm * http://www.autohotkey.com/forum/topic29420.html * * @param file the File for which […]

通过TCP发送音频流,UnsupportedAudioFileException

我成功地通过TCP套接字发送和读取文本和图像数据。 但我无法发送和读取音频流数据。 服务器上的示例代码: public class ServerAudio { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { ServerSocket serverSocker = new ServerSocket(); Socket client = null; serverSocker.bind(new InetSocketAddress(6666)); if (serverSocker.isBound()) { client = serverSocker.accept(); OutputStream out = client.getOutputStream(); while (true) { AudioInputStream ain = testPlay(“C:/Users/Public/Music/Sample Music/adios.wav”); if […]

直播音频流java

我正在实现从MIC到另一台PC上的java服务器的实时流媒体。 但我只听到白噪声。 我已经附加了客户端和服务器程序 Client: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.TargetDataLine; public class Mic { public byte[] buffer; private int port; static AudioInputStream ais; public static void main(String[] args) { TargetDataLine line; DatagramPacket dgp; AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED; […]

Java – 通过Java套接字广播语音

我创建了一个从客户端接收声音的服务器应用程序,然后我广播这个存储为字节的声音并将字节发送回连接到服务器的客户端。 现在我只使用一个客户端进行测试,客户端正在接收语音,但声音一直都是口吃。 有人可以告诉我我做错了什么吗? 我想我理解为什么声音播放不顺畅但不明白如何解决问题。 代码是吼叫。 客户端: 将语音发送到服务器的部分 public void captureAudio() { Runnable runnable = new Runnable(){ public void run() { first=true; try { final AudioFileFormat.Type fileType = AudioFileFormat.Type.AU; final AudioFormat format = getFormat(); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); line = (TargetDataLine)AudioSystem.getLine(info); line.open(format); line.start(); int bufferSize = (int) format.getSampleRate()* format.getFrameSize(); byte buffer[] = new byte[bufferSize]; […]