Libgdx播放视频
当使用Libgdx的render方法逐帧播放视频时,由于帧率不稳定的原因(电脑后台开启程序过多也会受影响),经常会出现音画不同步的情况,解决方法是,另开一个定时调用线程来控制视频的播放,播放速度可以通过(1/视频帧率)*1000计算(延时调用以毫秒为单位)以下为简单演示:
视频帧率为15,1/15*1000=66.77777,因此延时调用时设置的延时为66ms
(注意: 以下程序只供提供思路使用,不是完整可运行的程序,需根据实际情况调整)
private Music music;
private SpriteBatch batch = new SpriteBatch();
private int ini = 0;
private boolean musicPlay = true;
private boolean playSpeed = true;
public Texture a;
public void play() {
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
playSpeed = true;
ini += 1;
}
}, 0, 66); // 视频帧率为15,1/15*1000=66.77777,因此延时调用时设置的延时为66ms
music.play();
musicPlay = false;
}
@Override
public void render(float delta) {
// 控制只执行一次
if (musicPlay) {
play();
}
// 这里视频一共1304帧,播完停止
if (playSpeed && ini <= 1304) {
// 每帧都播放帧,但由其他进程控制播放速度,不会出现因为帧不稳定而音画不同步的情况,播完一帧即销毁Texture不占用内存
if (a != null) a.dispose();
a = new Texture("Static/CG/" + ini + ".jpg");
batch.begin();
batch.draw(a, 0, 0, 1600, 900);
batch.end();
} else {
batch.begin();
batch.draw(a, 0, 0, 1600, 900);
batch.end();
}
// 播放完毕,销毁音乐资源,释放内存
playSpeed = false;
if (ini >= 1304) {
music.dispose();
}
}