コード例 #1
0
  /**
   * make sine wave humble MediaAudio.
   *
   * @return
   */
  private MediaAudio beepSamples() {
    int sampleRate = 44100; // 44.1KHz
    int sampleNum = 44100; // 44100 samples(1sec)
    int channel = 2; // 2channel(stereo)
    int tone = 440; // 440Hz tone.
    int bit = 16; // 16bit
    ByteBuffer buffer = ByteBuffer.allocate((int) sampleNum * bit * channel / 8);
    double rad = tone * 2 * Math.PI / sampleRate; // radian for each sample.
    double max = (1 << (bit - 2)) - 1; // ampletude
    buffer.order(ByteOrder.LITTLE_ENDIAN);
    for (int i = 0; i < sampleNum; i++) {
      short data = (short) (Math.sin(rad * i) * max);
      for (int j = 0; j < channel; j++) {
        buffer.putShort(data);
      }
    }
    buffer.flip();

    logger.info("data size for 1sec buffer.:" + buffer.remaining());
    MediaAudio samples =
        MediaAudio.make(
            sampleNum, sampleRate, channel, Layout.CH_LAYOUT_STEREO, Type.SAMPLE_FMT_S16);
    samples.getData(0).put(buffer.array(), 0, 0, buffer.remaining());
    logger.info(
        "{}",
        samples.getDataPlaneSize(0)); // why this size is little bit bigger than original buffer?
    samples.setComplete(true);
    samples.setTimeBase(Rational.make(1, 44100));
    samples.setTimeStamp(0);
    samples.setNumSamples(sampleNum);
    return samples;
  }
コード例 #2
0
  //  @Test
  public void playTest() throws Exception {
    logger.info("start playTest");
    SourceDataLine audioLine = null;
    MediaAudio samples = beepSamples();
    logger.info("sample is ready");

    AudioFormat format =
        new AudioFormat(
            (float) samples.getSampleRate(),
            (int) samples.getBytesPerSample() * 8,
            samples.getChannels(),
            true,
            false);
    DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
    audioLine = (SourceDataLine) AudioSystem.getLine(info);
    audioLine.open(format);
    logger.info("beepstart");
    audioLine.start();
    Buffer buffer = samples.getData(0);
    audioLine.write(
        buffer.getByteArray(0, samples.getDataPlaneSize(0)), 0, samples.getDataPlaneSize(0));
    audioLine.drain();
    logger.info("beepend");
    audioLine.close();
    audioLine = null;
  }
コード例 #3
0
  private void processConvert(Muxer muxer, Encoder encoder) throws Exception {
    muxer.open(null, null);
    MediaPacket packet = MediaPacket.make();
    MediaAudio samples = beepSamples();
    logger.info(samples.toString());
    if (samples.getSampleRate() != encoder.getSampleRate()
        || samples.getFormat() != encoder.getSampleFormat()
        || samples.getChannelLayout() != encoder.getChannelLayout()) {
      final MediaAudioResampler resampler =
          MediaAudioResampler.make(
              encoder.getChannelLayout(),
              encoder.getSampleRate(),
              encoder.getSampleFormat(),
              samples.getChannelLayout(),
              samples.getSampleRate(),
              samples.getFormat());
      resampler.open();
      MediaAudio spl =
          MediaAudio.make(
              samples.getNumSamples(),
              encoder.getSampleRate(),
              encoder.getChannels(),
              encoder.getChannelLayout(),
              encoder.getSampleFormat());
      resampler.resample(spl, samples);
      logger.info(spl.toString());
      logger.info("{}", spl.getNumSamples());
      Assert.assertEquals(spl.getNumSamples(), samples.getNumSamples());
      samples = spl;
    }
    logger.info(samples.toString());

    // we only have one set of samples.
    encoder.encodeAudio(packet, samples);
    logger.info("{}", packet);
    if (packet.isComplete()) muxer.write(packet, false);

    // Flush the encoders
    do {
      encoder.encodeAudio(packet, null);
      logger.info("{}", packet);
      if (packet.isComplete()) {
        muxer.write(packet, false);
      }
    } while (packet.isComplete());
    muxer.close();
  }