- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在录制音频时遇到问题。我创建了一个servlet,并对java sound API演示代码进行了一定程度的修改,最后我可以录制音频了。问题是,当我播放音频时,我可以看到存储为 645.45 或类似内容的音频总时间,但我只录制了几分钟的音频。还有一个问题是音频保存在 Eclipse 目录而不是项目目录中。
这是 servlet 代码。
package com;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
public class SoundRecorder extends HttpServlet {
private static final long serialVersionUID = 1L;
static protected boolean running;
static ByteArrayOutputStream out;
double fileName = Math.random();
//strFilename = nowLong.toString();
public SoundRecorder() {
System.out.println("Filename will be..." + fileName + ".wav");
}
public void init() {
}
public void destroy() {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("call received..");
String method = request.getParameter("method");
System.out.println(method);
if("record".equalsIgnoreCase(method)) {
captureAudio(true);
}
else if("stop".equalsIgnoreCase(method)) {
captureAudio(false);
}
else if("play".equalsIgnoreCase(method)) {
System.out.println("yet to write");
playAudio();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("call received..");
String method = request.getParameter("method");
System.out.println(method);
doGet(request, response);
}
private void captureAudio(boolean capturing) {
File outputFile = new File(fileName + ".wav");
AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,44100.0F, 16, 2, 4, 44100.0F, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
TargetDataLine targetDataLine = null;
try
{
targetDataLine = (TargetDataLine) AudioSystem.getLine(info);
targetDataLine.open(audioFormat);
}
catch (LineUnavailableException e)
{
System.out.println("unable to get a recording line");
e.printStackTrace();
System.exit(1);
}
AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
final Recorder recorder = new Recorder(targetDataLine,targetType,outputFile);
System.out.println("Recording...");
if(capturing){
recorder.start();
}
else {
recorder.stopRecording();
}
}
private void playAudio() {
try {
File file = new File(fileName + ".wav");
AudioInputStream stream = AudioSystem.getAudioInputStream(file);
AudioFormat format = stream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(stream);
clip.start();
} catch (Exception e) {
System.err.println("Line unavailable: " + e);
System.exit(-4);
}
}
}
这是记录器类
public class Recorder extends Thread {
private TargetDataLine m_line;
private AudioFileFormat.Type m_targetType;
private AudioInputStream m_audioInputStream;
private File m_outputFile;
public Recorder(TargetDataLine line,
AudioFileFormat.Type targetType,
File file)
{
m_line = line;
m_audioInputStream = new AudioInputStream(line);
m_targetType = targetType;
m_outputFile = file;
}
/** Starts the recording.
To accomplish this, (i) the line is started and (ii) the
thread is started.
*/
public void start()
{
m_line.start();
super.start();
}
/** Stops the recording.
*/
public void stopRecording()
{
m_line.stop();
m_line.close();
}
/** Main working method.
*/
public void run()
{
try
{
AudioSystem.write(
m_audioInputStream,
m_targetType,
m_outputFile);
}
catch (IOException e)
{
e.printStackTrace();
}
}
private static void closeProgram()
{
System.out.println("Program closing.....");
System.exit(1);
}
private static void out(String strMessage)
{
System.out.println(strMessage);
}
}
最佳答案
使用 Servlet 进行开发时,您需要意识到,在整个 Web 应用程序的生命周期(从启动到关闭)中只有一个 Servlet 实例。因此,来自所有访问者、所有 session 、所有浏览器窗口/选项卡等的 HTTP 请求都将共享相同 servlet 实例。另外,当您创建一个静态变量时,它将在同一类的所有实例之间共享(这在这里并不真正相关,因为无论如何只有一个 servlet 实例)。
换句话说,您在 servlet 中声明的那些变量不是线程安全的:
static protected boolean running;
static ByteArrayOutputStream out;
double fileName = Math.random();
只有其中一个,并且可供所有访问者同时使用。对于不断修改的前两个变量,这将导致主要的线程安全问题,而对于第三个变量,这意味着所有访问者都会记录到同一个文件。您需要在 doGet() block 内声明它们。您希望通过基于唯一请求的 token 作为 key 将录音存储在 session 中,然后将该 key 传递给后续请求。
<小时/>关于文件保存在非预期位置的问题;当您在 servlet 中的 java.io.File 中使用相对路径时,它将相对于 Web 服务器启动的目录。如果从 Eclipse 内部启动它,那么它会保存在 Eclipse 目录中。您想在 java.io.File
中使用绝对路径。如果您的目的是将其保存在公共(public) web 内容中(您的 JSP 和 /WEB-INF
文件夹所在的位置),那么您需要 ServletContext#getRealPath()
进行转换绝对磁盘路径的 Web 路径。
String relativeWebPath = "filename.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
然而,这还有另一个问题:每当您重新部署 Web 应用程序时,所有文件都会被删除。如果您想要更多的永久存储,那么您希望将其存储在 Web 项目之外。例如。 C:/path/to/recordings
。
File file = new File("C:/path/to/recordings/filename.ext");
关于java - java中的录音机问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479893/
我正在尝试录制音频 this.recorder = new android.media.MediaRecorder(); this.recorder.setAudioSource(android.me
有人可以指导我完成在我的网站上嵌入录音小部件的过程,人们可以在其中录制简短(约 5 秒)的语音片段吗?我完全没有使用 Flash 的经验,但由于 HTML5 还不存在,所以这是必要的。 最佳答案 @p
我有一个 SDL 应用程序,可以在 Linux、Mac 和 Windows 下运行。它有点像媒体播放器,可以很好地播放音频。我想为其添加录音功能,但我想将其实时编码为 MP3。谁能给我举个例子,我如何
我在 intent 的帮助下调用本地录音机 Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 如我所料,它
我想开发一个媒体播放器/录音机。 主要目标平台是 Windows,支持其他操作系统会很好,但这不是一个高优先级。它应该能够播放 wav、mp3、avi 等格式。它还应该能够录制音频(麦克风)和视频(网
我正在尝试在 UWP 上为 winphone 创建一个通话记录器。我正在尝试用音频图来做到这一点。我需要为输入设备(麦克风)创建一个节点,为输出设备(扬声器)创建一个节点并将它们提交到文件(wave/
我的部门的任务是使用内置的 Windows 录音机录制早间演示音频以备将来使用。由于人性,我们并不总是记得按时启动它。 Windows 没有与 Unix cron 功能等效的内置功能。除了安装一个新的
有没有人可以帮助我开发具有播放和暂停功能的灵活录音机? 注意:我用过PauseResumeAudioRecorder .这很好但不灵活,因为当我停止录制时我的文件就会损坏。我也使用过 MP4Parse
我是 Java 编程的新手。我正在尝试构建一个将由 NFC 启用的 android 应用程序,连续录制声音(在 sleep 期间)(在 1-2 分钟长度的单独文件中,然后开始一个新的录制文件),上传每
我正在构建一个需要能够显示实时频谱分析仪的应用程序。这是我在 iOS 上成功制作的版本: 我正在使用 Wendykierp JTransforms库来执行 FFT 计算,并设法捕获音频数据并执行 FF
我有一个在 Android 中使用 openSLES 的 native 录音机。记录器可以工作,但是当调用停止方法时,它似乎继续写入缓冲区,因为我继续获取日志: ... 08-07 01:36:43.
我安装了 JDK 和 eclipse,-java version 似乎在终端中工作,但我没有找到一个单一的原因来说明为什么即使在从帮助安装之后 Robotium 记录器-> 在 eclipse 中安装
如何为 iOS 设置 AirPlay 视频和音频接收器(然后将流保存为视频文件)? 我知道这违反了 Apple 的指导方针,这不适用于 AppStore 分发。我可以使用私有(private) API
我正在创建的录音机应用程序中有两个函数(遵循 Udacity 教程。)我试图了解这两个函数是如何相关的: @IBAction func recordButton(sender: UIButto
我是安卓新手。我想使用 AndroidRecord API 构建一个录音机 android 来获取 .wav 文件,因为要进一步处理声音格式必须是 .wav。经过搜索和一些试验,我无法得到我想要的。任
我正在尝试为 Android Wear 构建录音机应用。现在,我能够在 watch 上捕捉音频,将其传输到手机并保存在文件中。但是,音频文件存在间隙或裁剪部分。 我发现这回答了与我的问题相关的问题 l
希望你能帮帮我。我尝试编写一个简单的小程序,录制 5 秒钟的音频并将其保存在文档目录中。 我已经用模拟器对其进行了测试,我可以看到输出中的路径,还可以看到创建的 sound.wav 文件。我可以打开该
下面的录音机只在第一次工作,如果你尝试第二次录音,它会在尝试 AudioFileWritePackets 时给出错误“kAudioFileInvalidPacketOffsetError”。 知道为什
我正在做的项目中需要一个录音机,而且录制的声音必须稍后再听。该项目由 c# 和 asp.net mvc 开发。 http://demos.subinsb.com/jquery/voice/ 我在上面的
我是一名优秀的程序员,十分优秀!