Memutar audio dengan Javascript?


690

Saya membuat game dengan HTML5 dan Javascript.

Bagaimana saya bisa memainkan audio game melalui Javascript?


9
Karena html5, ada <audio>. Elemen itu akan memiliki kait JS yang sesuai untuk 'bermain', 'jeda', dll ...
Marc B

1
@ Mark Yah, bisakah Anda memberikan beberapa informasi tentang apa itu kait?
Ryan S.

14
Saya yakin Anda bertanya-tanya di mana dokumentasi untuk semua metode audio: stackoverflow.com/questions/4589451/…
Bryan Downing

Jawaban:


1329

Jika Anda tidak ingin dipusingkan dengan elemen HTML:

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

Ini menggunakan HTMLAudioElementantarmuka, yang memutar audio dengan cara yang sama seperti <audio>elemen .


Jika Anda membutuhkan lebih banyak fungsi, saya menggunakan perpustakaan howler.js dan merasa sederhana dan bermanfaat.


9
Metode ini berfungsi untuk memutar mp3 tetapi tidak untuk file wav. Apakah ada cara untuk memutar file wav?
user781486

12
@ user3293156 Metode ini mendukung format yang sama dengan HTML5 <audio>. Wikipedia memiliki tabel kompatibilitas format audio . new Audio()dapat memutar file WAV di semua browser kecuali Internet Explorer.
Rory O'Kane

283
@ RoryO'Kane sehingga semua orang dapat memainkan format audio microsoft kecuali microsoft? lol
Dave Cousineau

10
Peringatan pasangan: (1) Firefox tidak mau memutar mp3 . Anda akan membutuhkan file ogg sebagai gantinya. (2) Safari / iOS tidak akan diputar jika Anda menyajikan konten melalui https . Anda harus memiliki sertifikat yang valid.
Peter

9
Perhatikan bahwa mulai bulan april 2018 di Chrome tidak akan memutar file audio kecuali jika pengguna telah mengklik setidaknya sekali dalam dokumen. Lihat di sini .
Nils Lindemann


38

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

SoundManager 2 menyediakan API yang mudah digunakan yang memungkinkan suara dimainkan di browser modern apa pun, termasuk IE 6+. Jika browser tidak mendukung HTML5, maka itu mendapat bantuan dari flash. Jika Anda ingin HTML5 ketat dan tidak ada flash, ada pengaturan untuk itu,preferFlash=false

Ini mendukung 100% audio bebas Flash di iPad, iPhone (iOS4) dan perangkat + browser yang mendukung HTML5 lainnya

Penggunaannya sesederhana:

<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>

Berikut ini adalah demo dalam aksi: http://www.schillmania.com/projects/soundmanager2/demo/christmas-lights/


3
Umumnya ketika Anda memberikan tautan di situs web ini, Anda memberikan beberapa info dari tautan di pos Anda. Dianjurkan untuk hanya mengirim tautan sederhana dan mengatakan "klik ini."
Ryan S.

7
Maaf, saya pikir situs akan menjelaskannya sendiri. Saya akan mengeditnya kemudian
LordZardeck

32

Ini adalah pertanyaan yang cukup lama tetapi saya ingin menambahkan beberapa info berguna. Pemula topik telah menyebutkan bahwa dia "making a game". Jadi untuk semua orang yang membutuhkan audio untuk pengembangan game ada pilihan yang lebih baik daripada hanya <audio>tag atau HTMLAudioElement. Saya pikir Anda harus mempertimbangkan penggunaan API Audio Web :

Sementara audio di web tidak lagi membutuhkan plugin, tag audio membawa batasan yang signifikan untuk mengimplementasikan permainan canggih dan aplikasi interaktif. Web Audio API adalah API JavaScript tingkat tinggi untuk memproses dan mensintesis audio dalam aplikasi web. Tujuan API ini adalah untuk memasukkan kemampuan yang ditemukan dalam mesin audio game modern dan beberapa tugas pencampuran, pemrosesan, dan pemfilteran yang ditemukan dalam aplikasi produksi audio desktop modern.


22

Mudah dengan Jquery

// atur tag audio tanpa preload

<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>

// tambahkan jquery untuk dimuat

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

// tulis metode untuk bermain dan berhenti

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

// putuskan cara mengontrol audio

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

EDIT

Untuk menjawab pertanyaan @ stomy, berikut adalah bagaimana Anda akan menggunakan pendekatan ini untuk memainkan daftar putar :

Setel lagu Anda di objek:

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'
}

Gunakan fungsi pemicu dan putar seperti sebelumnya:

$(".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);
      }
 }

Muat lagu pertama secara dinamis:

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

Setel ulang sumber audio ke lagu berikutnya dalam daftar putar, ketika lagu saat ini berakhir:

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

Lihat di sini untuk contoh kode ini dalam aksi.


Ini memutar semua tag audio dengan class = "my_audio" secara bersamaan. Bagaimana Anda memainkan satu demi satu (dalam daftar putar)?
stomy

@stomy apakah Anda memposting ini karena pertanyaannya sendiri di StackOverflow? Jika Anda melakukannya, biarkan aku tahu. Saya dapat membantu Anda dengan itu. jika tidak, saya akan menawarkan ini - Anda dapat (setelah mulai memutar lagu) mendengarkan endedacara yang akan dipancarkan dan memulai file audio berikutnya dalam daftar (mungkin Anda melacak baik di DOM, memori JS, dll. ). developer.mozilla.org/en-US/docs/Web/Events/ended
Sgnl

@stomy silakan periksa EDIT dalam jawaban saya untuk membuat daftar putar yang memutar lagu secara berurutan.
Cybernetic

15

Tambahkan audio tersembunyi dan mainkan.

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

Jika Anda mendapatkan kesalahan berikut:

Tidak tertangkap (berjanji) DOMException: play () gagal karena pengguna tidak berinteraksi dengan dokumen terlebih dahulu.

Itu berarti pengguna harus berinteraksi dengan situs web terlebih dahulu (seperti pesan kesalahan). Dalam hal ini Anda perlu menggunakan clickatau hanya pendengar acara lain, sehingga pengguna dapat berinteraksi dengan situs web Anda.

Jika Anda ingin memuat audio secara otomatis dan tidak ingin pengguna berinteraksi dengan dokumen terlebih dahulu, Anda dapat menggunakannya setTimeout.

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

Suara akan mulai setelah 0,5 detik.


Itu tidak bekerja. Tidak di Chrome. Tidak lagi.
Arfeo



5

Solusi yang cukup sederhana jika Anda memiliki tag HTML seperti di bawah ini:

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

Cukup gunakan JavaScript untuk memainkannya, seperti:

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

Apakah Anda bermaksud menggunakan </a> atau </audio>. Hanya penasaran.
Cooper

Saya menggunakan tag <audio>.
Ben Stafford

1
Ben, contoh Anda memiliki tag penutup yang tidak benar itu sebabnya @Cooper menanyakan pertanyaan itu. Saya mengedit jawaban dengan tag penutup yang benar.
Sgnl

4

Saya memiliki beberapa masalah yang berkaitan dengan pengembalian objek janji audio dan beberapa masalah yang berkaitan dengan interaksi pengguna dengan suara yang akhirnya saya gunakan objek kecil ini,

Saya akan merekomendasikan untuk mengimplementasikan suara yang paling dekat dengan interaksi yang digunakan oleh pengguna.

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;
          });
      }
  }
};

Dan implementasikan sebagai berikut:

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

Tidak bekerja di Safari jika saya memicu putar otomatis dari JS.
maki10

1
@ maki10 Hai, saya mengujinya di safari desktop Versi 12.0.3 (14606.4.5) dan berfungsi di sini: jsfiddle.net/xf5zyv4q/5
talsibony

Juga berfungsi pada safari mobile IOS 12
talsibony

Saya memperbarui tautan untuk masalah saya jsfiddle.net/6431mfb5 . Bagi saya, putar otomatis hanya berfungsi pertama kali di safari dan yang lebih baru.
maki10

@ maki10 karena Anda menyebutnya tanpa interaksi pengguna, putar otomatis tidak akan berfungsi tanpa interaksi pengguna seperti sentuhan klik, hapus baris terakhir: soundPlayer.play (' interactive-examples.mdn.mozilla.net/media/examples/… );
talsibony

3

Saya menggunakan metode ini untuk memainkan suara ...

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

2

jika Anda ingin memutar audio Anda setiap kali halaman dibuka maka lakukan seperti ini.

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

dan panggil playMusic ini () kapan pun Anda butuhkan dalam kode game Anda.


2

Dengan persyaratan keamanan bahwa pengguna harus berinteraksi dengan laman web agar audio diizinkan, beginilah cara saya melakukannya, berdasarkan pada membaca banyak artikel, termasuk di situs ini

  1. Tentukan file audio yang diperlukan dalam html Anda
  2. Miliki tombol mulai permainan dengan klik
  3. Ketika tombol diklik, mainkan dan jeda SEMUA file audio bilah yang ingin Anda mainkan di awal

Karena semua file audio telah "diputar" di OnClick yang sama, kini Anda dapat memutarnya kapan saja di game tanpa batasan

Perhatikan bahwa untuk kompatibilitas terbaik tidak menggunakan file wav, MS tidak mendukungnya

Gunakan mp3 dan ogg, yang mencakup semua perangkat

Contoh:

<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>

ulangi sesuai kebutuhan untuk semua audio dalam game

Kemudian:

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

ulangi sesuai kebutuhan kecuali jangan menghentikan audio yang ingin Anda dengar saat permainan dimulai


1

Anda dapat menggunakan API Audio Web untuk memainkan suara. Ada beberapa perpustakaan audio di luar sana seperti howler.js, soundjs dll. Jika Anda tidak khawatir tentang browser lama maka Anda juga dapat memeriksa http://musquitojs.com/ . Ini menyediakan API sederhana untuk membuat dan memutar suara.

Misalnya, memainkan suara yang harus Anda lakukan adalah.

import $buzz from 'musquito';

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

buzz.play();

Perpustakaan juga mendukung Audio Sprite.


0

Ini adalah beberapa JS yang saya buat dengan proyek bayi AI yang sedang saya kerjakan. Saya harap ini bisa membantu Anda.

<!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

Gunakan ini saja:

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

Atau, untuk membuatnya lebih sederhana:

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

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

</video>

Sampel:

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

TIDAK PUNYA IDEA jika ini berfungsi di browser lain selain Chrome 73 !!


Ini adalah jawaban yang mudah dan bersih. Sama sekali tidak jquery !!
IMSMART

0

Saya memiliki beberapa masalah dengan memutar audio, terutama karena Chrome telah memperbarui bahwa pengguna harus berinteraksi dengan dokumen terlebih dahulu.

Namun, di hampir semua solusi yang saya temukan adalah bahwa kode JS harus secara aktif mengatur pendengar (mis. Klik tombol) untuk menerima acara pengguna untuk memutar audio.

Dalam kasus saya, saya hanya ingin permainan saya untuk bermain BGM segera setelah pemain berinteraksi dengannya, jadi saya membuat diri saya menjadi pendengar sederhana yang terus memeriksa apakah halaman web sedang berinteraksi atau tidak.

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

Ini adalah solusi untuk tahun 2020 ketika Anda melihat kesalahan:

[Kesalahan] Penolakan Janji Tidak Tertangani: NotSupportedError: Operasi tidak didukung. (fungsi anonim) rejectPromise play (fungsi anonim) (testaudio.html: 96) pengiriman (jquery-3.4.1.min.js: 2: 42577)


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

Jangan licin dan berpikir ooh itu sekolah tua oclick, saya hanya akan memindahkannya ke halaman jQuery saya atau file JavaScript eksternal saya. Nggak. Perlu menjadi onclick.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.