/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under GNU GENERAL PUBLIC LICENSE Version 3. */ package com.ttProject.xuggle.raw; import javax.sound.sampled.AudioFormat; import com.ttProject.media.raw.AudioData; import com.xuggle.xuggler.IAudioSamples; import com.xuggle.xuggler.IAudioSamples.Format; import com.xuggle.xuggler.IRational; /** * AudioDataをIAudioSamplesに変換するコンバーター * @author taktod * */ public class AudioConverter { /** * audioDataからaudioSamplesを作成して応答します。 * @param audioData * @return */ public IAudioSamples makeSamples(AudioData audioData) { // フォーマットから情報を復元する。 AudioFormat format = audioData.getFormat(); int channels = format.getChannels(); int bit = format.getSampleSizeInBits(); int sampleNum = (int)(audioData.getBuffer().remaining() * 8 / bit / channels); Format xformat = null; switch(bit) { case 16: xformat = Format.FMT_S16; break; case 8: // xformat = Format.FMT_U8; // break; case 32: // xformat = Format.FMT_S32; // break; default: throw new RuntimeException("知らないbit数のデータでした。" + bit); } IAudioSamples samples = IAudioSamples.make(sampleNum, channels, xformat); samples.getData().put(audioData.getBuffer().array(), 0, 0, audioData.getBuffer().remaining()); samples.setComplete(true, sampleNum, (int)format.getSampleRate(), channels, xformat, 0); samples.setTimeBase(IRational.make(1000000, 1)); samples.setTimeStamp(audioData.getTimestamp()); // TODO ここのtimestampは0がはいっていることがあり得るのでその場合はsample数から計算して値を出してやった方がよさそう。 samples.setPts(audioData.getTimestamp()); return samples; } }