Search code examples
javaaudioxuggler

How to find the length of a short array to fill a video with audio using Xuggler?


I'm trying to add audio to a video, where I need a single short array representing the audio. I don't know how to get the length of this array. I've found an estimate of 91 shorts per millisecond, but I don't how how to get an exact value instead of guessing and checking. Here's the relevant code:

IMediaWriter writer = ToolFactory.makeWriter(file.getAbsolutePath());
writer.addVideoStream(0, 0, IRational.make(fps, 1), animation.getWidth(), animation.getHeight());
writer.addAudioStream(1, 0, 2, 44100);

...

int scale = 1000 / 11; // TODO
short[] audio = new short[animation.getLength() * scale];

animation.getLength() is the length of the video in milliseconds

What's the formula for calculating the scale variable?

The reason a list of shorts is needed is since this is an animation library that supports adding lots of sounds into the outputted video. Thus, I loop through all the requested sounds, turn the sounds into short lists, and then add their values to the correct spot in the main audio list. Not using a short list would make it so I can't stack several sounds on top of each other and make the timing more difficult.


Solution

  • The scale is what's known as the audio sampling rate which is normally measured in Hertz (Hz) which corresponds to "samples per second".

    Assuming each element in your array is a single audio sample, you can estimate the array size by multiplying the audio sampling rate by the animation duration in seconds.

    For example, if your audio sampling rate is 48,000 Hz:

    int audioSampleRate = 48000;
    double samplesPerMillisecond = (double) audioSampleRate / 1000;
    int estimatedArrayLength = (int) (animation.getLength() * samplesPerMillisecond);