JavaCV 采集攝麥克風音頻數據


上一次介紹 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播放:

=========================================================
HiIT青年
關注公眾號,閱讀更多關於JavaCV的文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM