上一次介紹 JavaCV采集攝像頭及桌面視頻數據,同樣的,采集音頻數據也可以使用JavaCV。
其他關於JavaCV的文章,可以通過下面的鏈接查看:
JavaCV-開發系列文章匯總篇(https://www.cnblogs.com/itqn/p/14696221.html)
引入依賴
引入JavaCV 1.5.5 maven依賴:
<properties>
<javacpp.version>1.5.5</javacpp.version>
</properties>
<dependencies>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>${javacpp.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>${javacpp.version}</version>
</dependency>
</dependencies>
采用FFmpeg采集麥克風數據
跟采集視頻一樣,麥克風音頻數據也可以使用ffmpeg采集,同樣使用dshow,這里有點不同的是采集的數據使用AAC編碼后存儲。
如果想采集PCM數據,可以查看我的另外一篇文章 JavaCV FFmpeg采集麥克風PCM音頻數據
public class Sample02 {
public static void main(String[] args) throws Exception {
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("audio=麥克風陣列 (Realtek(R) Audio)");
grabber.setFormat("dshow");
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(new File("Test01.aac"), 2);
recorder.setAudioOption("crf", "0");
recorder.setAudioQuality(0);
recorder.setAudioBitrate(192000);
recorder.setSampleRate(44100);
recorder.setAudioChannels(2);
// AAC
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
grabber.start();
recorder.start();
Frame frame = null;
int count = 0;
while ((frame = grabber.grab()) != null) {
recorder.record(frame);
if (count++ > 100) {
break;
}
}
grabber.close();
recorder.close();
}
}
直接讀取麥克風音頻數據
除了使用FFmpeg采集麥克風音頻數據外,還是采用直接讀取麥克風音頻字節數據的方式,采集音頻數據,同樣進行AAC編碼。
public class Sample01 {
public static void main(String[] args) throws Exception {
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(new File("Test01.aac"), 2);
recorder.setAudioOption("crf", "0");
recorder.setAudioQuality(0);
recorder.setAudioBitrate(192000);
recorder.setSampleRate(44100);
recorder.setAudioChannels(2);
// AAC
recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
recorder.start();
AudioFormat format = new AudioFormat(44100.0F, 16, 2, true, false);
TargetDataLine line = (TargetDataLine) AudioSystem.getLine(new DataLine.Info(TargetDataLine.class, format));
line.open(format);
line.start();
int sampleRate = (int) format.getSampleRate();
int numChannels = format.getChannels();
byte[] buffer = new byte[sampleRate * numChannels];
int count = 0;
while (count++ < 100) {
int nBytesRead = 0;
while (nBytesRead == 0) {
nBytesRead = line.read(buffer, 0, line.available());
}
int nSamplesRead = nBytesRead / 2;
short[] samples = new short[nSamplesRead];
ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(samples);
ShortBuffer sBuff = ShortBuffer.wrap(samples, 0, nSamplesRead);
recorder.recordSamples(sampleRate, numChannels, sBuff);
}
recorder.close();
}
}
效果展示
采集的AAC數據可以直接使用VLC播放:
=========================================================
關注公眾號,閱讀更多關於JavaCV的文章。