Javascript ile ses mi çalıyorsunuz?


692

HTML5 ve Javascript ile oyun yapıyorum.

Javascript ile nasıl oyun sesi çalabilirim?


9
Html5 olduğu için var <audio>. Bu eleman, 'play', 'pause' vb.Için uygun JS kancalarına sahip olacak ...
Marc B

1
@Marc Peki bu kancaların ne olduğu hakkında bilgi verebilir misiniz?
Ryan

14
Bahse girerim, belgelerin tüm ses yöntemleri için nerede olduğunu merak ediyorsunuz: stackoverflow.com/questions/4589451/…
Bryan Downing

Yanıtlar:


1334

HTML öğeleriyle uğraşmak istemiyorsanız:

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

Bu, HTMLAudioElementsesi <audio>öğeyle aynı şekilde çalan arayüzü kullanır .


Daha fazla işlevselliğe ihtiyacınız varsa, howler.js kütüphanesini kullandım ve basit ve kullanışlı buldum.


9
Bu yöntem, mp3 çalmak için çalışır, ancak wav dosyaları için geçerli değildir. Wav dosyalarını oynatmanın bir yolu var mı?
user781486

12
@ user3293156 Bu yöntem HTML5'lerle aynı biçimleri destekler <audio>. Wikipedia'da bir ses biçimi uyumluluk tablosu vardır . new Audio()Internet Explorer dışındaki tüm tarayıcılarda WAV dosyalarını yürütebilir.
Rory O'Kane

283
@ RoryO'Kane böylece herkes microsoft dışında microsoft'un ses formatını çalabilir mi? lol
Dave Cousineau

10
Çift uyarılar: (1) Firefox mp3 çalamaz . Bunun yerine bir ogg dosyasına ihtiyacınız olacak. (2) İçeriği https üzerinden yayınlıyorsanız Safari / iOS oynatılmaz . Geçerli bir sertifikanız olması gerekir.
Peter

9
Chrome'da Nisan 2018'den itibaren, kullanıcı belgede en az bir kez tıklamadığı sürece ses dosyalarını oynatmayacağına dikkat edin. Buraya bakın .
Nils Lindemann

181

Kolay, sadece öğenizi alın audiove play()yöntemi çağırın :

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

Bu örneği inceleyin: http://www.storiesinflight.com/html5/audio.html

Bu site aşağıdaki gibi yapabileceğiniz diğer serin bazı şeyleri ortaya çıkarır load(), pause()ve birkaç diğer özellikleri audioelemanı.


38

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

SoundManager 2, IE 6+ dahil herhangi bir modern tarayıcıda sesin çalınmasına izin veren kullanımı kolay bir API sağlar. Tarayıcı HTML5'i desteklemiyorsa, flaştan yardım alır. Kesinlikle HTML5 istiyor ve flaş yok, bunun için bir ayar var,preferFlash=false

İPad, iPhone (iOS4) ve diğer HTML5 özellikli cihazlarda + tarayıcılarda% 100 Flash içermeyen sesi destekler

Kullanımı şu kadar basit:

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

İşte bununla ilgili bir demo: http://www.schillmania.com/projects/soundmanager2/demo/christmas-lights/


3
Genellikle bu web sitesinde bir bağlantı verdiğinizde, yayınınızdaki bağlantıdan bazı bilgiler sağlarsınız. Sadece basit bir bağlantı yayınlamak ve "buna tıklayın" demek cesaretini kırıyor.
Ryan

7
Üzgünüm, sitenin kendini açıklayacağını düşündüm. O zaman onu düzenleyeceğim
LordZardeck

32

Bu oldukça eski bir soru ama bazı yararlı bilgiler eklemek istiyorum. Starter konusu olduğunu belirtti "making a game". Bu nedenle, oyun geliştirme için sese ihtiyaç duyan herkes için sadece bir <audio>etiket veya a'dan daha iyi bir seçim var HTMLAudioElement. Web Ses API'sının kullanımını göz önünde bulundurmanız gerektiğini düşünüyorum :

Web'deki ses artık bir eklenti gerektirmezken, ses etiketi sofistike oyunlar ve etkileşimli uygulamalar uygulamak için önemli sınırlamalar getirir. Web Audio API, web uygulamalarındaki sesi işlemek ve sentezlemek için üst düzey bir JavaScript API'sıdır. Bu API'nın amacı, modern oyun ses motorlarında bulunan yetenekleri ve modern masaüstü ses üretim uygulamalarında bulunan bazı karıştırma, işleme ve filtreleme görevlerini eklemektir.


22

Jquery ile kolay

// önyükleme olmadan ses etiketlerini ayarlama

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

// yüklemek için jquery ekle

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

// oynatma ve durdurma yöntemleri yazma

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

// sesi nasıl kontrol edeceğinize karar verin

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

DÜZENLE

@ Stomy'nin sorusunu ele almak için, bu yaklaşımı bir oynatma listesi çalmak için nasıl kullanacağınız aşağıda açıklanmıştır :

Şarkılarınızı bir nesneye yerleştirin:

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

Tetikleme ve oynatma işlevlerini daha önce olduğu gibi kullanın:

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

İlk şarkıyı dinamik olarak yükleyin:

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

Geçerli şarkı sona erdiğinde ses kaynağını çalma listesindeki bir sonraki şarkıya sıfırlayın:

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

Uygulamada bu kodun bir örneği için buraya bakın .


Bu, class = "my_audio" içeren tüm ses etiketlerini aynı anda oynatır. Art arda nasıl oynarsınız (çalma listesinde)?
stomi

@stomy bunu StackOverflow'da kendi sorusu olarak gönderdiniz mi? Eğer yaparsan haberim olsun. Sana bu konuda yardımcı olabilirim. aksi halde bunu sunacağım - (bir şarkı çalmaya başladıktan sonra) endedyayınlanacak olayı dinleyebilir ve listedeki bir sonraki ses dosyasını başlatabilirsiniz (muhtemelen DOM, JS belleğinde vb. ). developer.mozilla.org/tr-TR/docs/Web/Events/ended
Sgnl

@stomy, şarkıları art arda çalan bir çalma listesi oluşturmak için lütfen cevabımdaki EDIT'i kontrol edin.
Sibernetik

15

Gizli bir ses ekleyin ve çalı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

Aşağıdaki hatayı alıyorsanız:

Yakalanmayan (vaat edilen) DOMException: play () başarısız oldu, çünkü kullanıcı önce belgeyle etkileşimde bulunmadı.

Bu, kullanıcının önce web sitesiyle etkileşime girmesi gerektiği anlamına gelir (hata mesajının belirttiği gibi). Bu durumda click, kullanıcının web sitenizle etkileşime girebilmesi için veya başka bir olay dinleyicisini kullanmanız gerekir .

Sesi otomatik olarak yüklemek istiyorsanız ve kullanıcının önce belgeyle etkileşim kurmasını istemiyorsanız kullanabilirsiniz setTimeout.

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

Ses 0,5 saniye sonra başlayacaktır.


Çalışmıyor. Chrome'da değil. Artık değil.
Arfeo



5

Aşağıdaki gibi bir HTML etiketiniz varsa oldukça basit bir çözüm:

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

Oynamak için JavaScript kullanın, şöyle:

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

</a> veya </audio> kullanmak mı istediniz? Sadece merak.
Cooper

<audio> etiketini kullandım.
Ben Stafford

1
Ben, örneğinizin yanlış bir kapanış etiketi vardı, bu yüzden @Cooper bu soruyu sordu. Cevabı doğru kapanış etiketi ile düzenledim.
Sgnl

4

Ses sözü nesnesiyle ilgili bazı sorunlar yaşadım dönüşleri ve bu küçük nesne kullanarak sonunda sesler ile kullanıcı etkileşimi ile ilgili bazı sorunlar vardı,

Oynatma seslerini, kullanıcının kullandığı etkileşim etkinliğine en yakın şekilde uygulamayı öneririm.

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

Ve aşağıdaki gibi uygulayın:

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

JS'den otomatik oynatmayı tetiklersem Safari'de çalışmıyor.
maki10

1
@ maki10 Merhaba, Safari masaüstü Sürüm 12.0.3'te (14606.4.5) test ettim ve burada çalışıyor: jsfiddle.net/xf5zyv4q/5
talsibony

Ayrıca safari mobil IOS 12 üzerinde çalışır
talsibony

Sorunum için bağlantıyı güncelliyorum jsfiddle.net/6431mfb5 . Benim için, otomatik oynatma safari'de sadece ilk kez ve daha yenisinde çalışır.
maki10

@ maki10 çünkü kullanıcı etkileşimi olmadan çağırırsınız, otomatik oynatma, kullanıcının dokunma gibi etkileşimi olmadan çalışmaz, son satırı kaldırır: soundPlayer.play (' interactive-examples.mdn.mozilla.net/media/examples/… );
talsibony

3

Bu yöntemi ses çalmak için kullandım ...

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

3

Bir kullanıcının sesin izin verilebilmesi için bir web sayfasıyla etkileşime girmesi gereken güvenlik gereksinimleriyle, bu site de dahil olmak üzere birçok makaleyi okumaya dayanarak bunu nasıl yaparım?

  1. HTML'nizde gerekli ses dosyalarını tanımlayın
  2. Onclick ile oyuna başla düğmesi
  3. Düğme tıklandığında, TÜM ses dosyaları çubuğunu başında çalmak istediğiniz dosyayı çalın ve duraklatın

Tüm ses dosyaları aynı OnClick'te "oynatıldığı" için, artık bunları oyunda istediğiniz zaman kısıtlama olmadan çalabilirsiniz

En iyi uyumluluk için wav dosyalarını kullanmadığını unutmayın, MS bunları desteklemez

Tüm cihazları kapsayan mp3 ve ogg kullanın

Misal:

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

oyundaki tüm sesler için gerektiği kadar tekrarlayın

Sonra:

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

Oyun başladığında duymak istediğiniz sesi duraklatmak dışında gerektiği kadar tekrarlayın


2

sayfa açıldığında sesinizi çalmak istiyorsanız bunu yapın.

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

ve oyun kodunuzda ihtiyacınız olduğunda bu playMusic () öğesini çağırın.


1

Sesleri çalmak için Web Audio API'sını kullanabilirsiniz. Orada nasıl bazı ses kütüphaneleri howler.js, soundjs vb vardır. Eski tarayıcılar hakkında endişelenmeyin, o zaman http://musquitojs.com/ de kontrol edebilirsiniz . Sesler oluşturmak ve çalmak için basit bir API sağlar.

Örneğin, bir ses çalmak için yapmanız gereken tek şey.

import $buzz from 'musquito';

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

buzz.play();

Kütüphane ayrıca Ses Spritelarını da destekler.


0

Bu bazı JS i ile çalışan bir bebek AI projesi üzerinde geldi. Umarım bu size yardımcı olabilir.

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

Sadece şunu kullanın:

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

Veya, daha basit hale getirmek için:

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

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

</video>

Örneklem:

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

Bu, Chrome 73 dışındaki tarayıcılarda çalışıyorsa HİÇBİR Fikir YOK !!


Bu kolay ve temiz bir cevaptır. HERHANGİ BİR jquery !!
IMSMART

0

Ses çalmayla ilgili bazı sorunlar yaşadım, özellikle Chrome, kullanıcının önce belgeyle etkileşim kurması gerektiğini güncellediğinden.

Ancak, bulduğum hemen hemen tüm çözümlerde JS kodunun, sesi oynatmak için kullanıcı olaylarını almak için dinleyicileri (örn. Düğme tıklamaları) aktif olarak ayarlaması gerektiğidir.

Benim durumumda, oyuncu ile etkileşime girer girmez oyunumun BGM oynamasını istedim, bu yüzden web sayfasının etkileşimde olup olmadığını kontrol etmeye devam eden basit bir dinleyici yaptım.

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

İşte hatayı gördüğünüzde 2020 yılı için bir çözüm:

[Hata] İşlenmemiş Promise Reddi: NotSupportedError: İşlem desteklenmiyor. (anonim işlev) rejectPromise oynatma (anonim işlev) (testaudio.html: 96) gönderme (jquery-3.4.1.min.js: 2: 42577)


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

Kaygan olmayın ve ooh bu eski bir okul oclick, sadece sayfadan aşağıya jQuery veya harici JavaScript dosyama taşıyacağım. Hayır! Bunun bir olması gerekir onclick.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.