首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在它们之间播放一系列的视频片段。

在它们之间播放一系列的视频片段。
EN

Stack Overflow用户
提问于 2012-03-22 15:29:02
回答 1查看 980关注 0票数 1

假设我有很多声音(想象一下钢琴/吉他音符)。

我想在给定的间隔后播放每个声音,例如200毫秒。

但我想让以前的声音“响出来”。

尽管下面的方法适用于较长的延迟(700到1000毫秒),但并不是太精确。

对于短暂的延迟,有时声音“堆在一起”,并迅速地连续播放。

我尝试过的(某种伪代码):

代码语言:javascript
复制
for (Clip clip: clipList){
  clip.start(); 
  Thread.sleep(500);
}

我猜这与JVM/OS的线程调度有关.

有什么想法吗?

编辑:

正如我在评论中建议的那样,我也试着用计时器:

代码语言:javascript
复制
final Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {

  @Override
  public void run() {
    try{
      Clip clip = clipList.remove();
      clip.start();
    }catch (NoSuchElementException e) {
      timer.cancel();
    }
  }
};
timer.schedule(timerTask, 0, delay);

我仍然有相同的行为,当我有7-8的声音和500毫秒的延迟。

EN

回答 1

Stack Overflow用户

发布于 2012-03-23 19:53:15

让音符“响”是一件很棒的事情,也是推动我研究和试用Java声音的一件事。我不确定我是否能提供具体帮助,但我可以分享一两个经验。

我制作了一个剪辑播放器,允许一个在它完成播放之前重新触发这个剪辑(允许第一个播放,而另一个正在启动),并且以不同的采样速率。这是通过给剪辑多个游标,并让他们增量通过内部存储的样本数据独立。(当光标落在两个样本之间时,以较高或较低的速度播放的回放将使用线性插值来导出音频值。)输出被放入一个SourceDataLine中。

奇怪的是,当这个剪辑播放器被多次调用时,作为一个独立的程序,会出现一个与您描述的类似的集群。不过,我还写了一个音频混频器,它能够播放大量这些片段和一个sourceDataLine .wav文件,以及一些实时的FM合成器声音,将它们混合到一个SourceDataLine输出中,而且这个时机非常好!

这真的让我感到困惑,因为剪辑部分(以及剪辑的触发器)实际上是相同的代码。一个关键的区别可能是,我编写的AudioMixer被设置为连续运行,因此一些可能的计时问题可能来自于代码是从字节码运行还是从内存运行。HotSpot编译器将以字节码的形式运行几次代码,然后将其放入内存中,以便更快地运行,这将解释一些计时问题。

我找到了一篇很好的关于时间问题的文章,您可能需要查看一下:http://quod.lib.umich.edu/cgi/p/pod/dod-idx?c=icmc;idno=bbp2372.2007.131

基本上,java不提供“实时”保证,这是实现低延迟性能的巨大挑战。差异的来源包括: HotSpot或其他什么时候决定从字节码或内存中运行的问题,垃圾收集,vm线程切换。

拥有“播放”的剪辑将是进行分支音乐的一个关键组成部分,例如,在游戏中允许一个人在游戏中的某个时刻进行切换,而不是在游戏中的某个时刻,音乐或sfx将保持“无缝”。这是我所设想的一部分。当然,如果有一个DAW,您可以选择一个轨道并将其保存为多个音频块(重叠/播放),而不是单个地将每个块导出,这也是很好的。但这是走在game...Was前面,这是一个你也在考虑的总体方向吗?或者你有其他的申请吗?(只是好奇。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9825437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档