- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为我上一个问题(仍未解决)的后续问题,GUI event not triggering consistently ,我发现了另一个怪癖。下面的代码创建并播放 .wav 文件:
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
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.Mixer;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class audioTest extends JFrame {
private static final long serialVersionUID = 1L;
TargetDataLine targetDataLine;
AudioCapture audCap = new AudioCapture();
public static void main(String[] args) {
new audioTest();
}
public audioTest() {
layoutTransporButtons();
getContentPane().setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 100);
setVisible(true);
}
public void layoutTransporButtons() {
final JPanel guiButtonPanel = new JPanel();
final JButton captureBtn = new JButton("Record");
final JButton stopBtn = new JButton("Stop");
final JButton playBtn = new JButton("Playback");
guiButtonPanel.setLayout(new GridLayout());
this.add(guiButtonPanel);
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
JRadioButton[] radioBtnArray;
AudioFileFormat.Type[] fileTypes;
// Register anonymous listeners
captureBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
// Capture input data from the microphone
audCap.captureAudio();
}
});
guiButtonPanel.add(captureBtn);
stopBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
audCap.stopRecordAndPlayback = true;
audCap.stopRecording();
}
});
guiButtonPanel.add(stopBtn);
playBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopBtn.setEnabled(true);
audCap.playAudio();
}
});
guiButtonPanel.add(playBtn);
}
class AudioCapture {
volatile boolean stopRecordAndPlayback = false;
AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
private String wavName;
private File audioFile;
/**
* capture audio input from microphone and save as .wav file
*/
public void captureAudio() {
wavName = JOptionPane.showInputDialog(null,
"enter name of file to be recorded:");
try {
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
// Select an available mixer
Mixer mixer = AudioSystem.getMixer(mixerInfo[1]);
// Get everything set up for capture
audioFormat = getAudioFormat();
DataLine.Info dataLineInfo = new DataLine.Info(
TargetDataLine.class, audioFormat);
// Get a TargetDataLine on the selected mixer.
targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo);
// Prepare the line for use.
targetDataLine.open(audioFormat);
targetDataLine.start();
// Create a thread to capture the microphone
Thread captureThread = new CaptureThread();
captureThread.start();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
/**
* This method plays back the audio data that has
* been chosen by the user
*/
public void playAudio() {
// add file chooser
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(audioFile);
int returnVal = chooser.showOpenDialog(chooser);
// retrieve chosen file
if (returnVal == JFileChooser.APPROVE_OPTION) {
// create the file
audioFile = chooser.getSelectedFile();
}
// play chosen file
try {
audioInputStream = AudioSystem.getAudioInputStream(audioFile);
audioFormat = audioInputStream.getFormat();
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem
.getLine(dataLineInfo);
// Create a thread to play back the data
new PlayThread().start();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
/**
* This method creates and returns an AudioFormat object
*/
private AudioFormat getAudioFormat() {
float sampleRate = 44100.0F;
// 8000,11025,16000,22050,44100
int sampleSizeInBits = 16;
// 8,16
int channels = 1;
// 1,2
boolean signed = true;
// true,false
boolean bigEndian = false;
// true,false
return new AudioFormat(sampleRate, sampleSizeInBits, channels,
signed, bigEndian);
}
/**
* Inner class to capture data from microphone
*/
class CaptureThread extends Thread {
// An arbitrary-size temporary holding buffer
byte tempBuffer[] = new byte[10000];
public void run() {
// reset stopCapture to false
stopRecordAndPlayback = false;
// record as wave
AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE;
// take user input file name and append file type
audioFile = new File(wavName + ".wav");
try {
targetDataLine.open(audioFormat);
targetDataLine.start();
while (!stopRecordAndPlayback) {
AudioSystem.write(new AudioInputStream(targetDataLine),
fileType, audioFile);
}
targetDataLine.stop();
targetDataLine.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* method to stop capture
*/
public void stopRecording() {
// targetDataLine.stop();
// targetDataLine.close();
// System.out.println("stopped");
}
/**
* Inner class to play back the data
*/
class PlayThread extends Thread {
byte tempBuffer[] = new byte[10000];
public void run() {
// reset stop button
stopRecordAndPlayback = false;
try {
sourceDataLine.open(audioFormat);
sourceDataLine.start();
int cnt;
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1
&& stopRecordAndPlayback == false) {
if (cnt > 0) {
sourceDataLine.write(tempBuffer, 0, cnt);
}
}
sourceDataLine.drain();
sourceDataLine.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
}
}
我尝试更改捕获部分以记录 .aiff 文件,该文件有效,但播放现在是静音的。我可以找到该文件并通过其他方式播放,它工作正常,但在这个程序中不行。
我为记录 .aiff 而更改的行是:
// record as aiff
AudioFileFormat.Type fileType = AudioFileFormat.Type.AIFF;
// take user input file name and append file type
audioFile = new File(wavName + ".AIFF");
有人知道为什么 .wav 文件可以通过此代码播放,而 .aiff 文件却不能?
-编辑-我还尝试使用 .aif 作为后缀,但这也不起作用。我想到这可能与存储为 AIFF-C 音频的文件有关,但我找不到任何进一步的信息。
最佳答案
AIFF-C is a compressed audio format ,因此您不应该将其“按原样”发送到音频设备。您需要先将其解压为PCM。
关于java - .wav 文件可以播放,但 .aiff 文件不能播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517685/
import os import speech_recognition as sr command = "ffmpeg -i videototext.mp4 videototext.mp3" os.s
我正在尝试以编程方式播放我拥有的一些苹果循环文件。因为我喜欢 clojure,所以我首先尝试在 JVM 上使用它。 Java Sound Demo播放包附带的 .aif 效果很好,但是当我尝试播放我的
我正在用这一行编写 aiff 元数据: ffmpeg -i uno.aiff -metadata title=Track -metadata artist=Band -f aiff dos.aiff
我正在尝试编写一个类,将.wav文件转换为.aiff文件作为项目的一部分。 我遇到了几个库Alvas.Audio(http://alvas.net/alvas.audio,overview.aspx)
由于 Sound Track Pro 故障,我有一个有问题的 AIF 文件。 它在 QuickTime Player 中播放良好,时长约为 1 小时 50 分钟。 然而: 它的大小为 3.81GB,而
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我试过下面的代码,但在执行它时给出了'fmt?'错误告诉我“此文件类型不支持数据格式”。不幸的是,我无法在任何地方找到解释如果要写入 AIFF 应该如何设置 AudioStreamBasicDescr
在 OS X 10.9.4 上使用 Xcode 5.1.1, 考虑以下代码片段: - (IBAction)speak:(id)sender // text to loudspeaker,
这是我目前正在尝试的: final AudioClip note0 = new AudioClip(getClass().getResource("/Downloads/notes/A3.aiff")
这会播放单声道 aifc 文件,但对于任何立体声文件,我都会听到很大的静电声: import pyaudio import aifc CHUNK = 1024 wf = aifc.open('C:\\
我在 JAVA 中使用音频导入器(用于鼓音序器),并且在导入 AIFF 文件时遇到以下问题: 我有 2 个相同类型的 AIFF 文件(24 位、44100kHz、单声道),一个是在 Mac 上创建的,
作为我上一个问题(仍未解决)的后续问题,GUI event not triggering consistently ,我发现了另一个怪癖。下面的代码创建并播放 .wav 文件: import java
尝试在代码中生成方波、锯齿波和 sin wav,然后根据 Chris Adam 的 Learning Core Audio 书籍保存到 AIFF 文件。我有它的工作,但我很困惑为什么我不需要在 Swi
如何使用 ffmpeg 将 wav 文件转换为 AIF 文件? 我需要制作各种文件,一个是 16 位的,一个是 24 位的,一个是 32 位的。 我还需要制作不同的采样率。例如,1 个 176,400
假设我有一个读取 .WAV 或 .AIFF 文件的程序,并且文件的音频被编码为浮点样本值。我的程序假设任何格式正确(基于浮点)的 .WAV 或 .AIFF 文件将仅包含 [-1.0f,+1.0f] 范
我正在为在 Ubuntu 服务器上运行的 Rails 应用程序开发后端任务系统。 在将上传的 AIFF 文件转换为 FLAC 之前,我需要从中删除所有可能存在的标签。我怎样才能做到这一点? TagLi
我在目录中有多个 .aiff 格式的文件,我想使用 SoX 将它们转换为 .wav。我试过 this 上的代码网站,如下 theFiles = `/Users/me/RainbowAiff/*.aif
我有一个 AIFF 格式的音轨。我想用 Python 打开这个音频文件,导入声音的振幅并进行一些数学分析,例如傅里叶变换等。 这在 Python 中可行吗? 是否有库或模块可以让我获取音频文件? 在整
如果是iOS 7 SDK,在SpringBoard.app 里面有一个lock.aiff 的声音文件。声音文件的路径如下。 iPhoneSimulator7.0.sdk/System/Library/
iOS 有各种音频框架,从让您可以简单地播放指定文件的较高级别,到让您获取原始 PCM 数据的较低级别,以及介于两者之间的所有内容。对于我们的应用程序,我们只需要播放外部文件(WAV、AIFF、MP3
我是一名优秀的程序员,十分优秀!