我正在编写一个记录屏幕和音频的应用程序。虽然屏幕录制工作完美,但我很难使用JDK库获取原始音频。代码如下:
try {
// Now, we're going to loop
long startTime = System.nanoTime();
System.out.println("Encoding Image.....");
while (!Thread.currentThread().isInterrupted()) {
// take the screen shot
BufferedImage screen = robot.createScreenCapture(screenBounds);
// convert to the right image type
BufferedImage bgrScreen = convertToType(screen,
BufferedImage.TYPE_3BYTE_BGR);
// encode the image
writer.encodeVideo(0, bgrScreen, System.nanoTime()
- startTime, TimeUnit.NANOSECONDS);
/* Need to get audio here and then encode using xuggler. Something like
WaveData wd = new WaveData();
TargetDataLine line;
AudioInputStream aus = new AudioInputStream(line);
short[] samples = getSourceSamples();
writer.encodeAudio(0, samples); */
if (timeCreation < 10) {
timeCreation = getGMTTime();
}
// sleep for framerate milliseconds
try {
Thread.sleep((long) (1000 / FRAME_RATE.getDouble()));
} catch (Exception ex) {
System.err.println("stopping....");
break;
}
}
// Finally we tell the writer to close and write the trailer if
// needed
} finally {
writer.close();
}
这个页面有一些伪代码,比如
while(haveMoreAudio())
{
short[] samples = getSourceSamples();
writer.encodeAudio(0, samples);
}
但是对于getSourceSamples()
,我应该做些什么呢?
此外,还有一个额外的问题——在这种方法中,是否可以从多个麦克风中进行选择?
另请参见:Xuggler编码和muxing
试试这个:
// Pick a format. Need 16 bits, the rest can be set to anything
// It is better to enumerate the formats that the system supports, because getLine() can error out with any particular format
AudioFormat audioFormat = new AudioFormat(44100.0F, 16, 2, true, false);
// Get default TargetDataLine with that format
DataLine.Info dataLineInfo = new DataLine.Info( TargetDataLine.class, audioFormat );
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(dataLineInfo);
// Open and start capturing audio
line.open(audioFormat, line.getBufferSize());
line.start();
while (true) {
// read as raw bytes
byte[] audioBytes = new byte[ line.getBufferSize() / 2 ]; // best size?
int numBytesRead = 0;
numBytesRead = line.read(audioBytes, 0, audioBytes.length);
// convert to signed shorts representing samples
int numSamplesRead = numBytesRead / 2;
short[] audioSamples = new short[ numSamplesRead ];
if (format.isBigEndian()) {
for (int i = 0; i < numSamplesRead; i++) {
audioSamples[i] = (short)((audioBytes[2*i] << 8) | audioBytes[2*i + 1]);
}
}
else {
for (int i = 0; i < numSamplesRead; i++) {
audioSamples[i] = (short)((audioBytes[2*i + 1] << 8) | audioBytes[2*i]);
}
}
// use audioSamples in Xuggler etc
}
要选择麦克风,您可能必须执行以下操作:
Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
// Look through and select a mixer here, different mixers should be different inputs
int selectedMixerIndex = 0;
Mixer mixer = AudioSystem.getMixer(mixerInfo[ selectedMixerIndex ]);
TargetDataLine line = (TargetDataLine) mixer.getLine(dataLineInfo);
我认为有可能在一个混音器中出现多个麦克风作为不同的源数据线。在这种情况下,你必须打开它们并调用dataLine。getControl(FloatControl.Type.MASTER_增益)。设定值(体积)
来打开和关闭它们。
参见:WaveData。JAVA
来自TargetDataLine的声波
如何在Java中设置SourceDataLine的音量
我正在尝试使用Xugler(我相信它在引擎盖下使用)来执行以下操作: 接收原始MPJPEG视频比特流(来自小型TTL串行摄像头),并将其编码/转码为h.264;和 接收原始音频比特RAM(来自麦克风)并将其编码到AAC;然后 将两个(音频和视频)位存储在一起,并将其多路复用到一个MPEG-TS容器中 我已经看过了他们的一些优秀教程,到目前为止,我得到的是: 首先,我认为我离这里很近,但它仍然不正确
问题内容: 我正在尝试使用Xuggler(我 相信 它是在幕后使用的)执行以下操作: 接受原始的MPJPEG视频比特流(来自小型TTL串行相机)并将其编码/转码为h.264;和 接受原始音频bitream(来自麦克风)并将其编码为AAC;然后 将两个(音频和视频)位流一起混合到MPEG-TS容器中 我已经看过/阅读了他们的一些出色的教程,到目前为止,这是我所拥有的: 首先,我想我已经很近了,但是还
本文向大家介绍使用WindowsAPI获取录音音频的方法,包括了使用WindowsAPI获取录音音频的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例介绍了使用winmm.h进行音频流的获取的方法,具体步骤如下: 一、首先需要包含以下引用对象 二、音频的获取需要调用7个函数 1. waveInGetNumDevs:返回系统中就绪的波形声音输入设备的数量 2. waveInGetDevCaps
这是我的全部代码:public class FirstActivity扩展活动{/**在活动首次创建时调用。*/ }
我有一个AppleScript,它检索苹果音乐上播放的当前曲目的几个属性,但我无法检索艺术品
问题内容: 如何使用Java获取声音文件的总时间? -更新 看起来这段代码确实起作用了:long audioFileLength = audioFile.length(); 我知道如何获取文件长度,但是我没有找到如何获取声音文件的帧频和帧大小…任何想法或链接吗? -更新 另一个工作代码(使用@mdma的提示): 问题答案: 给一个File你可以写