mirror of
https://github.com/collinsmith/riiablo.git
synced 2025-07-08 23:07:46 +07:00
Created AudioPacket and basic executor
This commit is contained in:
34
core/src/com/riiablo/video/AudioPacket.java
Normal file
34
core/src/com/riiablo/video/AudioPacket.java
Normal file
@ -0,0 +1,34 @@
|
||||
package com.riiablo.video;
|
||||
|
||||
import com.badlogic.gdx.audio.AudioDevice;
|
||||
|
||||
import com.riiablo.io.BitInput;
|
||||
import com.riiablo.io.ByteInput;
|
||||
import com.riiablo.logger.LogManager;
|
||||
import com.riiablo.logger.Logger;
|
||||
|
||||
class AudioPacket implements Runnable {
|
||||
private static final Logger log = LogManager.getLogger(AudioPacket.class);
|
||||
|
||||
final BinkAudio track;
|
||||
final BitInput bits;
|
||||
final int numSamples;
|
||||
final AudioDevice device;
|
||||
final float[][] out;
|
||||
|
||||
public AudioPacket(BinkAudio track, ByteInput in, AudioDevice device, float[][] out) {
|
||||
this.track = track;
|
||||
this.numSamples = in.readSafe32u();
|
||||
this.bits = in.unalign();
|
||||
this.device = device;
|
||||
this.out = out;
|
||||
|
||||
log.trace("numSamples: {}", numSamples);
|
||||
track.decode(bits, out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
device.writeSamples(out[0], 0, numSamples);
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package com.riiablo.video;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.ByteBufUtil;
|
||||
import java.util.List;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import com.badlogic.gdx.audio.AudioDevice;
|
||||
@ -152,7 +153,8 @@ public class BIK {
|
||||
return numTracks;
|
||||
}
|
||||
|
||||
void decode(int frame, AudioDevice[] audio, float[][] out) {
|
||||
void decode(int frame, List<AudioPacket> audioPackets, AudioDevice device, float[][] out) {
|
||||
audioPackets.clear();
|
||||
final boolean keyframe = (offsets[frame] & 1) == 1;
|
||||
final int offset = offsets[frame] & ~1;
|
||||
log.tracef("offset: +%x, keyframe: %s", offset, keyframe);
|
||||
@ -162,17 +164,14 @@ public class BIK {
|
||||
for (int i = 0, s = numTracks; i < s; i++) {
|
||||
try {
|
||||
MDC.put("track", i);
|
||||
final BinkAudio track = tracks[i];
|
||||
final int packetSize = in.readSafe32u();
|
||||
log.trace("packetSize: {} bytes", packetSize);
|
||||
|
||||
final ByteInput audioPacket = in.readSlice(packetSize);
|
||||
System.out.println(ByteBufUtil.prettyHexDump(audioPacket.buffer()));
|
||||
final int numSamples = audioPacket.readSafe32u();
|
||||
log.trace("numSamples: {}", numSamples);
|
||||
|
||||
// BinkAudio track = tracks[i];
|
||||
// track.decode(audioPacket.unalign(), out);
|
||||
// audio[i].writeSamples(out[0], 0, numSamples);
|
||||
final AudioPacket packet = new AudioPacket(track, in, device, out);
|
||||
audioPackets.add(packet);
|
||||
|
||||
log.trace("bytesRemaining: {} bytes", audioPacket.bytesRemaining());
|
||||
} finally {
|
||||
|
@ -1,16 +1,25 @@
|
||||
package com.riiablo.video;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.audio.AudioDevice;
|
||||
import com.badlogic.gdx.graphics.g2d.Batch;
|
||||
import com.badlogic.gdx.utils.Disposable;
|
||||
|
||||
public class VideoPlayer implements Disposable {
|
||||
private List<AudioPacket> audioPackets;
|
||||
|
||||
private BIK bik;
|
||||
private AudioDevice[] audio;
|
||||
private float[][][] out;
|
||||
private int frame;
|
||||
private float time, nextFrame;
|
||||
private ExecutorService audioStreams;
|
||||
|
||||
public VideoPlayer() {
|
||||
|
||||
@ -22,12 +31,22 @@ public class VideoPlayer implements Disposable {
|
||||
}
|
||||
this.bik = bik;
|
||||
|
||||
audioPackets = new ArrayList<>(bik.numTracks);
|
||||
audioStreams = Executors.newFixedThreadPool(bik.numTracks, new ThreadFactory() {
|
||||
int i = 0;
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
final Thread t = new Thread(r);
|
||||
t.setName("VideoPlayer-" + i++);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
audio = new AudioDevice[bik.numTracks];
|
||||
out = new float[bik.numTracks][][];
|
||||
for (int i = 0, s = bik.numTracks; i < s; i++) {
|
||||
final BinkAudio track = bik.track(i);
|
||||
// final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, track.isMono());
|
||||
final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, true);
|
||||
final AudioDevice device = audio[i] = Gdx.audio.newAudioDevice(track.sampleRate, track.isMono());
|
||||
device.setVolume(0.10f);
|
||||
out[i] = track.createOut();
|
||||
}
|
||||
@ -41,7 +60,10 @@ public class VideoPlayer implements Disposable {
|
||||
time += delta;
|
||||
if (time > nextFrame) {
|
||||
nextFrame += bik.delta;
|
||||
bik.decode(frame++, audio, out[0]);
|
||||
bik.decode(frame++, audioPackets, audio[0], out[0]);
|
||||
for (AudioPacket audioPacket : audioPackets) {
|
||||
audioStreams.submit(audioPacket);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user