Chơi âm thanh với Javascript?


690

Tôi đang làm một trò chơi với HTML5 và Javascript.

Làm cách nào tôi có thể phát âm thanh trò chơi qua Javascript?


9
Vì nó là html5 nên có <audio>. Phần tử đó sẽ có các móc nối thích hợp cho 'phát', 'tạm dừng', v.v ...
Marc B

1
@Marc Bạn có thể cung cấp một số thông tin về những cái móc đó là gì không?
Ryan S.

14
Tôi cá là bạn đang tự hỏi tài liệu dành cho tất cả các phương thức âm thanh ở đâu: stackoverflow.com/questions/4589451/ mẹo
Bryan Downing

Câu trả lời:


1327

Nếu bạn không muốn gây rối với các yếu tố HTML:

var audio = new Audio('audio_file.mp3');
audio.play();

Cái này sử dụng HTMLAudioElementgiao diện, phát âm thanh giống như <audio>phần tử .


Nếu bạn cần thêm chức năng, tôi đã sử dụng thư viện howler.js và thấy nó đơn giản và hữu ích.


9
Phương pháp này hoạt động để chơi mp3 nhưng không phải cho các tệp wav. Có một số cách để chơi các tập tin wav?
user781486

12
@ user3293156 Phương thức này hỗ trợ các định dạng tương tự như của HTML5 <audio>. Wikipedia có một bảng tương thích định dạng âm thanh . new Audio()có thể phát các tệp WAV trong tất cả các trình duyệt trừ Internet Explorer.
Rory O'Kane

281
@ RoryO'Kane để mọi người có thể phát định dạng âm thanh của microsoft ngoại trừ microsoft? lol
Dave Cousineau

10
Vài cảnh báo: (1) Firefox sẽ không phát mp3 . Bạn sẽ cần một tập tin ogg thay thế. (2) Safari / iOS sẽ không phát nếu bạn đang phục vụ nội dung qua https . Bạn sẽ cần phải có một chứng chỉ hợp lệ.
Peter

9
Lưu ý rằng từ tháng 4 năm 2018 trên Chrome sẽ không phát các tệp âm thanh trừ khi người dùng ít nhất đã nhấp một lần vào tài liệu. Xem ở đây .
Nils Lindemann

181

Thật dễ dàng, chỉ cần lấy audiophần tử của bạn và gọi play()phương thức:

document.getElementById('yourAudioTag').play();

Kiểm tra ví dụ này: http://www.storiesinflight.com/html5/audio.html

Trang web này phát hiện ra một số điều thú vị khác bạn có thể làm như load(), pause()và một vài đặc tính khác của audiophần tử.


38

http://www.schillmania.com/projects/soundmanager2/

SoundManager 2 cung cấp API dễ sử dụng cho phép phát âm thanh trong bất kỳ trình duyệt hiện đại nào, kể cả IE 6+. Nếu trình duyệt không hỗ trợ HTML5, thì nó sẽ nhận được trợ giúp từ flash. Nếu bạn muốn HTML5 nghiêm ngặt và không có đèn flash, có một cài đặt cho điều đó,preferFlash=false

Nó hỗ trợ 100% âm thanh không có Flash trên iPad, iPhone (iOS4) và các trình duyệt + thiết bị hỗ trợ HTML5 khác

Sử dụng đơn giản như:

<script src="soundmanager2.js"></script>
<script>
    // where to find flash SWFs, if needed...
    soundManager.url = '/path/to/swf-files/';

    soundManager.onready(function() {
        soundManager.createSound({
            id: 'mySound',
            url: '/path/to/an.mp3'
        });

        // ...and play it
        soundManager.play('mySound');
    });
</script>

Đây là bản demo của nó trong hành động: http://www.schillmania.com/projects/soundmanager2/demo/christmas-light/


3
Nói chung khi bạn cung cấp một liên kết trên trang web này, bạn cung cấp một số thông tin từ liên kết trong bài viết của bạn. Không khuyến khích chỉ đăng một liên kết đơn giản và nói "nhấp vào đây."
Ryan S.

7
Xin lỗi, tôi đoán trang web sẽ giải thích chính nó. Tôi sẽ chỉnh sửa nó sau đó
LordZardeck

32

Đây là một câu hỏi khá cũ nhưng tôi muốn thêm một số thông tin hữu ích. Các chủ đề bắt đầu đã đề cập rằng anh ấy là "making a game". Vì vậy, đối với tất cả mọi người cần âm thanh để phát triển trò chơi, có một sự lựa chọn tốt hơn là chỉ một <audio>thẻ hoặc một HTMLAudioElement. Tôi nghĩ bạn nên xem xét việc sử dụng API Web Audio :

Mặc dù âm thanh trên web không còn yêu cầu plugin, thẻ âm thanh mang đến những hạn chế đáng kể để triển khai các trò chơi và ứng dụng tương tác phức tạp. API Web âm thanh là API JavaScript cấp cao để xử lý và tổng hợp âm thanh trong các ứng dụng web. Mục tiêu của API này là bao gồm các khả năng được tìm thấy trong các công cụ âm thanh trò chơi hiện đại và một số tác vụ trộn, xử lý và lọc được tìm thấy trong các ứng dụng sản xuất âm thanh trên máy tính để bàn hiện đại.


22

Dễ dàng với Jquery

// đặt thẻ âm thanh không tải trước

<audio class="my_audio" controls preload="none">
    <source src="audio/my_song.mp3" type="audio/mpeg">
    <source src="audio/my_song.ogg" type="audio/ogg">
</audio>

// thêm jquery để tải

$(".my_audio").trigger('load');

// viết phương thức để chơi và dừng

function play_audio(task) {
      if(task == 'play'){
           $(".my_audio").trigger('play');
      }
      if(task == 'stop'){
           $(".my_audio").trigger('pause');
           $(".my_audio").prop("currentTime",0);
      }
 }

// quyết định cách điều khiển âm thanh

<button onclick="play_audio('play')">PLAY</button>
<button onclick="play_audio('stop')">STOP</button>

BIÊN TẬP

Để giải quyết câu hỏi của @ stomy, đây là cách bạn sẽ sử dụng phương pháp này để phát danh sách phát :

Đặt bài hát của bạn trong một đối tượng:

playlist = {
    'song_1' : 'audio/splat.mp3',
    'song_2' : 'audio/saw.mp3',
    'song_3' : 'audio/marbles.mp3',
    'song_4' : 'audio/seagulls.mp3',
    'song_5' : 'audio/plane.mp3'
}

Sử dụng chức năng kích hoạt và phát như trước:

$(".my_audio").trigger('load');

function play_audio(task) {
      if(task == 'play'){
           $(".my_audio").trigger('play');
      }
      if(task == 'stop'){
           $(".my_audio").trigger('pause');
           $(".my_audio").prop("currentTime",0);
      }
 }

Tải bài hát đầu tiên một cách linh hoạt:

keys = Object.keys(playlist);
$('.my_audio').append("<source id='sound_src' src=" + playlist[keys[0]] + " type='audio/mpeg'>");

Đặt lại nguồn âm thanh cho bài hát tiếp theo trong danh sách phát, khi bài hát hiện tại kết thúc:

count = 0; 
$('.my_audio').on('ended', function() { 
   count++;  
   $("#sound_src").attr("src", playlist[keys[count]])[0];
   $(".my_audio").trigger('load');
   play_audio('play');
});

Xem ở đây để biết ví dụ về mã này trong thực tế.


Cái này phát tất cả các thẻ âm thanh với class = "my_audio" cùng một lúc. Làm thế nào để bạn chơi cái khác (trong danh sách chơi)?
stomy

@stomy bạn có đăng bài này như câu hỏi của riêng mình trên StackOverflow không? Nếu bạn làm thế, cho tôi biết. Tôi có thể giúp bạn với điều đó. mặt khác, tôi sẽ cung cấp điều này - bạn có thể (sau khi bạn bắt đầu phát một bài hát) nghe endedsự kiện được phát ra và bắt đầu tệp âm thanh tiếp theo trong danh sách (có lẽ bạn đang theo dõi trong bộ nhớ DOM, JS, v.v. ). developer.mozilla.org/en-US/docs/Web/Events/ends
Sgnl

@stomy vui lòng kiểm tra EDIT trong câu trả lời của tôi để tạo danh sách phát phát các bài hát liên tiếp.
Từ trường

15

Thêm một âm thanh ẩn và chơi nó.

function playSound(url){
  var audio = document.createElement('audio');
  audio.style.display = "none";
  audio.src = url;
  audio.autoplay = true;
  audio.onended = function(){
    audio.remove() //Remove when played.
  };
  document.body.appendChild(audio);
}

14

Nếu bạn nhận được lỗi sau:

Uncaught (trong lời hứa) DOMException: play () không thành công vì người dùng không tương tác với tài liệu trước.

Điều đó có nghĩa là người dùng cần phải tương tác với trang web trước (như thông báo lỗi nói). Trong trường hợp này, bạn cần sử dụng clickhoặc chỉ một người nghe sự kiện khác, để người dùng có thể tương tác với trang web của bạn.

Nếu bạn muốn tự động tải âm thanh và không muốn người dùng tương tác với tài liệu trước, bạn có thể sử dụng setTimeout.

setTimeout(() => {
  document.getElementById('mySound').play();
}, 500)
<audio id="mySound" src="sound.mp3"></audio>

Âm thanh sẽ bắt đầu sau 0,5 giây.


Nó không hoạt động. Không có trong Chrome. Không còn nữa.
Arfeo



5

Giải pháp khá đơn giản nếu bạn có thẻ HTML như dưới đây:

<audio id="myAudio" src="some_audio.mp3"></audio>

Chỉ cần sử dụng JavaScript để chơi nó, như vậy:

document.getElementById('myAudio').play();

Ý của bạn là sử dụng </a> hay </ audio>. Chỉ tò mò thôi.
Cooper

Tôi đã sử dụng thẻ <audio>.
Ben Stafford

1
Ben, ví dụ của bạn có thẻ đóng không chính xác đó là lý do tại sao @Cooper đã hỏi câu hỏi đó. Tôi chỉnh sửa câu trả lời với thẻ đóng chính xác.
Sgnl

4

Tôi đã có một số vấn đề liên quan đến trả về đối tượng lời hứa âm thanh và một số vấn đề liên quan đến tương tác của người dùng với âm thanh tôi kết thúc bằng cách sử dụng đối tượng nhỏ này,

Tôi khuyên bạn nên triển khai âm thanh phát gần nhất với người dùng sự kiện tương tác đang sử dụng.

var soundPlayer = {
  audio: null,
  muted: false,
  playing: false,
  _ppromis: null,
  puse: function () {
      this.audio.pause();
  },
  play: function (file) {
      if (this.muted) {
          return false;
      }
      if (!this.audio && this.playing === false) {
          this.audio = new Audio(file);
          this._ppromis = this.audio.play();
          this.playing = true;

          if (this._ppromis !== undefined) {
              this._ppromis.then(function () {
                  soundPlayer.playing = false;
              });
          }

      } else if (!this.playing) {

          this.playing = true;
          this.audio.src = file;
          this._ppromis = soundPlayer.audio.play();
          this._ppromis.then(function () {
              soundPlayer.playing = false;
          });
      }
  }
};

Và thực hiện nó như sau:

<button onclick="soundPlayer.play('https://interactive-examples.mdn.mozilla.net/media/examples/t-rex-roar.mp3');">Play</button>

Không hoạt động trên Safari nếu tôi kích hoạt tự động phát từ JS.
maki10

1
@ maki10 Xin chào, tôi đã thử nghiệm nó trên máy tính để bàn safari Phiên bản 12.0.3 (14606.4.5) và nó hoạt động ở đây: jsfiddle.net/xf5zyv4q/5
talsibony

Cũng hoạt động trên safari mobile iOS 12
talsibony 8/2/19

Tôi cập nhật liên kết cho vấn đề của mình jsfiddle.net/6431mfb5 . Đối với tôi, autoplay chỉ hoạt động lần đầu tiên trong safari và mới hơn nữa.
maki10

@ maki10 vì bạn gọi nó mà không cần tương tác người dùng, tự động phát wont work mà không cần sự tương tác của người sử dụng như nhấp chuột cảm ứng, loại bỏ dòng cuối cùng: soundPlayer.play (' interactive-examples.mdn.mozilla.net/media/examples/... );
talsibony

3

Tôi đã sử dụng phương pháp này để phát âm thanh ...

var audioElement;
if(!audioElement) {
  audioElement = document.createElement('audio');
  audioElement.innerHTML = '<source src="' + '/audio/sound.mp3'+ '" type="audio/mpeg" />'
}
audioElement.play();

2

nếu bạn muốn phát âm thanh của mình bất cứ khi nào trang được mở thì hãy làm như thế này.

<script>
  function playMusic(){
  music.play();
  }
  </script>
<html>
  <audio id="music" loop src="sounds/music.wav" autoplay> </audio>
  </html>

và gọi đây là playMusic () bất cứ khi nào bạn cần trong mã trò chơi của mình.


2

Với các yêu cầu bảo mật mà người dùng phải tương tác với một trang web để âm thanh được cho phép, đây là cách tôi thực hiện, dựa trên việc đọc nhiều bài viết, bao gồm cả trên trang web này

  1. Xác định các tệp âm thanh cần thiết trong html của bạn
  2. Có một nút trò chơi bắt đầu với một onclick
  3. Khi nhấp vào nút, sau đó phát và tạm dừng TẤT CẢ thanh tệp âm thanh mà bạn muốn phát lúc đầu

Vì tất cả các tệp âm thanh đã được "phát" trên cùng một OnClick, giờ đây bạn có thể phát chúng bất kỳ lúc nào trong trò chơi mà không bị hạn chế

Lưu ý rằng để có khả năng tương thích tốt nhất không sử dụng tệp wav, MS không hỗ trợ chúng

Sử dụng mp3 và ogg, bao gồm tất cả các thiết bị

Thí dụ:

<audio id="welcome">
    <source src="URL/welcome.ogg" type="audio/ogg">
    <source src="URL/welcome.mp3" type="audio/mpeg">
    Your browser does not support the audio element.
</audio>

lặp lại khi cần thiết cho tất cả âm thanh trong trò chơi

Sau đó:

document.getElementById("welcome").play();
document.getElementById("welcome").pause();

lặp lại khi cần ngoại trừ không tạm dừng âm thanh bạn muốn nghe khi trò chơi bắt đầu


1

Bạn có thể sử dụng API Web âm thanh để phát âm thanh. Có khá nhiều thư viện âm thanh ngoài kia như howler.js, soundjs, v.v ... Nếu bạn không lo lắng về các trình duyệt cũ thì bạn cũng có thể kiểm tra trên http://musquitojs.com/ . Nó cung cấp một API đơn giản để tạo và phát âm thanh.

Ví dụ, để phát âm thanh tất cả những gì bạn phải làm là.

import $buzz from 'musquito';

const buzz = $buzz('gunfire.mp3');

buzz.play();

Thư viện cũng hỗ trợ Audio Sprites.


0

Đây là một số JS tôi đã nghĩ ra trong một dự án AI trẻ em đang làm việc với. tôi hy vọng điều này có thể giúp bạn ra ngoài

<!DOCTYPE html>
<html>
<head>
    <title>
        js prompt AI
    </title>
    <style>
        #button {
            border: 1px solid black;
            border-radius: 10px;
            font-size: 22px;
            height:65px;
            width:100px;
            text-align: center;
            line-height: 65px;
        }
    </style>
</head>
<body>

    <audio id="myAudio" src="./how_are_you.m4a"></audio>
    <p>To Interact with the AI please click the button</p>
    <div id=button>click</div>

    <script>

       var button = document.getElementById("button");
       function playBack() {
           button.addEventListener("click", function (){
            var talk = prompt("If you wish for the AI to respond type hi");
            var myAudio = document.getElementById("myAudio");

            if(talk === "hi") {
                    myAudio.play();
            }
           }) ;



       }
       playBack();
   </script>
</body>

</html>

0

Chỉ cần sử dụng này:

<video controls="" autoplay="" name="media"><source src="Sound URL Here" type="audio/mpeg" /></video>

Hoặc, để làm cho nó đơn giản hơn:

<video controls="" autoplay="" name="media">

<source src="Sound URL Here" type="audio/mpeg" />

</video>

Mẫu vật:

<video controls="" autoplay="" name="media">
<source src="https://interactive-examples.mdn.mozilla.net/media/examples/t-rex-roar.mp3" type="audio/mpeg">
</video>

KHÔNG CÓ IDEA nếu điều này hoạt động trên các trình duyệt khác ngoài Chrome 73 !!


Đây là một câu trả lời dễ dàng, sạch sẽ. Không có jquery TẠI TẤT CẢ !!
IMSMART

0

Tôi gặp một số vấn đề với việc phát âm thanh, đặc biệt là khi Chrome đã cập nhật rằng người dùng phải tương tác với tài liệu trước.

Tuy nhiên, trên hầu hết tất cả các giải pháp tôi tìm thấy là mã JS phải chủ động thiết lập trình nghe (ví dụ: nhấp vào nút) để nhận các sự kiện của người dùng để phát âm thanh.

Trong trường hợp của tôi, tôi chỉ muốn trò chơi của mình chơi BGM ngay khi người chơi tương tác với nó, vì vậy tôi tự tạo cho mình một trình nghe đơn giản để kiểm tra xem trang web có được tương tác hay không.

const stopAttempt = setInterval(() => {
    const audio = new Audio('your_audio_url_or_file_name.mp3');
    const playPromise = audio.play();
    if (playPromise) {
      playPromise.then(() => {
        clearInterval(stopAttempt)
      }).catch(e=>{
        console.log('' + e);
      })
    }
}, 100 )

0

Đây là một giải pháp cho năm 2020 khi bạn gặp lỗi:

[Lỗi] Từ chối lời hứa chưa được xử lý: NotSupportedError: Thao tác không được hỗ trợ. (chức năng ẩn danh) từ chối chơi (chức năng ẩn danh) (testaudio.html: 96) công văn (jquery-3.4.1.min.js: 2: 42577)


<div onclick="new Audio('/assets/test.mp3').play()">aaa</div>

Đừng vội vàng và nghĩ rằng đó là một trường học cũ oclick, tôi sẽ chuyển trang đó xuống jQuery hoặc tệp JavaScript bên ngoài của tôi. Không. Nó cần phải là một onclick.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.