如何在 Vaadin 14 中播放声音?

Posted

技术标签:

【中文标题】如何在 Vaadin 14 中播放声音?【英文标题】:How to play sound in Vaadin 14? 【发布时间】:2019-09-30 11:45:23 【问题描述】:

我想在我使用Vaadin 14 开发的一个应用程序中播放声音(.wav,作为字节[])。不幸的是,我没有找到这个用例的组件。

Vaadin 8 提供了 Audio (https://vaadin.com/api/framework/8.5.2/com/vaadin/ui/Audio.html) 但在 Vaadin 14 中不可用。

我认为有一个解决方案,只需使用HTML <audio> 并导入它。

<body>
  <audio src="test.wav" controls autoplay loop>
    </audio>
</body>

是否还有“Vaadin 14”解决方案?

【问题讨论】:

正如迁移指南中所述:vaadin.com/docs/v14/flow/migration/5-components.html,这正是使用&lt;audio&gt; 原生元素的解决方案。所以你做对了:) 您可以使用&lt;audio&gt; html 代码作为模板创建自己的Audio 组件。我没有写答案,因为我自己从来没有这样做过,除了指出正确的方向之外,我无能为力。有很多关于它的documentation。 我的立场是正确的——anasmis 方法(见他的回答)对于这个“简单”的 html 元素来说更好更容易。不要听从我创建聚合物模板的建议。您只需要对更复杂的事情执行此操作。 【参考方案1】:

正如我们在 cmets 中提到的,V14 中没有开箱即用的组件,但很容易制作一个自己的组件,如下所述:Creating a Simple Component Using the Element API:)

所以我简单地检查了一下,这似乎有效:

AudioPlayer.java

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.Tag;

@Tag("audio")
public class AudioPlayer  extends Component 

    public AudioPlayer()
        getElement().setAttribute("controls",true);

    

    public  void setSource(String path)
        getElement().setProperty("src",path);
    


使用:

AudioPlayer player=new AudioPlayer();
player.setSource("https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_1MG.wav");
add(player);

我在本地没有任何音乐文件,因此从互联网上随机获取了一些音乐文件并作为来源传递。当然,这不是一个防弹的解决方案,只是一个概念证明:)

【讨论】:

非常感谢您的出色回答!它就像一个魅力。我对 Vaadin 还是很陌生,你的例子不仅仅是解决我的问题。现在我看到了你的例子,@Tag 非常有意义...... 您的解决方案在桌面浏览器上完美运行,但在移动设备上无法运行 - 知道为什么吗? 您能否尝试用我的示例中的 url 替换以进行测试。在这种情况下有效吗? 好吧:/ 类似的问题似乎多年来一直在报告。您可以先尝试设置MIME 类型,如此处所述***.com/questions/26406923/…? 呵呵我找到了解决办法!您必须为流设置 ContentType 才能使其工作。我会将其添加到下面的评论中。再次感谢您的帮助!【参考方案2】:

我想为anasmi 为可能使用流的人提供一个很好的答案添加一个简短的补充。

Anasmi 的 AudioPlayer.java:

public void setSource(final AbstractStreamResource resource) 
    getElement().setAttribute("src", resource);

要使其正常工作,您必须为流设置内容类型:

var stream = new StreamResource("foo", () -> 
                        byte[] data = getBytesFromFileMP3(soundfile);
                        return new ByteArrayInputStream(data); )
                        .setContentType("audio/mpeg"); // For MP3

【讨论】:

【参考方案3】:

我也会对 Anasmi 的回答做一点补充 - 如果您想故意播放声音(例如单击按钮或类似的东西时),您可以通过这种方式添加方法 play:

public void play() 
    getElement().callJsFunction("play");

希望它对某人有所帮助。

【讨论】:

以上是关于如何在 Vaadin 14 中播放声音?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中动态显示文本时在后台播放声音?

如何以绝对最小或*量化*延迟播放声音?

如何在 C# 中一次播放多个声音

提高java中声音文件的播放速度

声音操作反向/在 iPhone 上向后播放录制的声音

phonegap 媒体声音在 5 次后停止播放