Воспроизведение аудиофайла с помощью jQuery при нажатии кнопки

93

Я пытаюсь воспроизвести аудиофайл, когда нажимаю кнопку, но он не работает, мой html-код:

<html>    
    <body>
        <div id="container">
            <button id="play">
                Play Music
            </button>
        </div>
    </body>
</html>

мой JavaScript:

$('document').ready(function () {
    $('#play').click(function () {
        var audio = {};
        audio["walk"] = new Audio();
        audio["walk"].src = "http://www.rangde.org/static/bell-ring-01.mp3"
        audio["walk"].addEventListener('load', function () {
            audio["walk"].play();
        });
    });
});   

Для этого я тоже создал Fiddle .

Суреш Патту
источник
Вы использовали аудио из HTML5
OnesimusUnbound

Ответы:

147

Какой подход?

Вы можете воспроизводить звук с помощью <audio>тегов или <object>или <embed>. Ленивая загрузка (загрузка, когда она вам нужна) звук - лучший подход, если его размер небольшой. Вы можете создать аудиоэлемент динамически, когда он загружен, вы можете запустить его .play()и приостановить с помощью .pause().

Вещи, которые мы использовали

Мы будем использовать canplayсобытие, чтобы определить, что наш файл готов к воспроизведению.

Нет .stop()функции для аудиоэлементов. Мы можем только приостановить их. И когда мы хотим начать с начала аудиофайла, мы меняем его .currentTime. Мы будем использовать эту строку в нашем примере audioElement.currentTime = 0;. Для достижения этой .stop()функции мы сначала приостанавливаем файл, а затем сбрасываем его время.

Мы можем захотеть узнать длину аудиофайла и текущее время воспроизведения. Мы уже узнали .currentTimeвыше, чтобы узнать его длину, мы используем .duration.

Пример руководства

  1. Когда документ готов, мы динамически создали аудиоэлемент.
  2. Мы устанавливаем его источник с аудио, которое хотим воспроизвести.
  3. Мы использовали событие «завершено», чтобы снова запустить файл.

Когда currentTime станет равным его продолжительности, аудиофайл перестанет воспроизводиться. Когда бы вы ни использовали play(), он будет начинаться с самого начала.

  1. Мы использовали timeupdateсобытие для обновления текущего времени при .currentTimeизменении звука .
  2. Мы использовали canplayсобытие для обновления информации, когда файл готов к воспроизведению.
  3. Мы создали кнопки для воспроизведения, паузы, перезапуска.

$(document).ready(function() {
    var audioElement = document.createElement('audio');
    audioElement.setAttribute('src', 'http://www.soundjay.com/misc/sounds/bell-ringing-01.mp3');
    
    audioElement.addEventListener('ended', function() {
        this.play();
    }, false);
    
    audioElement.addEventListener("canplay",function(){
        $("#length").text("Duration:" + audioElement.duration + " seconds");
        $("#source").text("Source:" + audioElement.src);
        $("#status").text("Status: Ready to play").css("color","green");
    });
    
    audioElement.addEventListener("timeupdate",function(){
        $("#currentTime").text("Current second:" + audioElement.currentTime);
    });
    
    $('#play').click(function() {
        audioElement.play();
        $("#status").text("Status: Playing");
    });
    
    $('#pause').click(function() {
        audioElement.pause();
        $("#status").text("Status: Paused");
    });
    
    $('#restart').click(function() {
        audioElement.currentTime = 0;
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
    <h2>Sound Information</h2>
    <div id="length">Duration:</div>
    <div id="source">Source:</div>
    <div id="status" style="color:red;">Status: Loading</div>
    <hr>
    <h2>Control Buttons</h2>
    <button id="play">Play</button>
    <button id="pause">Pause</button>
    <button id="restart">Restart</button>
    <hr>
    <h2>Playing Information</h2>
    <div id="currentTime">0</div>
</body>

Ахмет Джан Гювен
источник
1
И вы должны поместить этот скрипт в конец <body> *
tbleckert
вот разметка, которая в основном работает во всех браузерах .
Shaijut
Очень хорошо, хотя OP явно сказал, что хочет сделать это в jQuery. В вашем примере вы используете чистый javascript для манипуляций с dom и прослушивателей событий.
Жак
У меня проблема с этим фрагментом: как я могу автоматически остановить звук по окончании mp3? теперь, с моим очень коротким звуком, это продолжает звучать в цикле
Доменико Монако
1
@DomenicoMonaco Просто удалите endedсобытие, которое воспроизводит звук с самого начала.
Ахмет
49
$("#myAudioElement")[0].play();

Это не работает так, $("#myAudioElement").play()как вы ожидаете. Официальная причина заключается в том, что включение его в jQuery добавит play()метод к каждому элементу, что вызовет ненужные накладные расходы. Поэтому вместо этого вы должны ссылаться на него по его положению в массиве элементов DOM, которые вы извлекаете $("#myAudioElement"), иначе 0.

Эта цитата взята из сообщенной об ошибке , которая была закрыта как "feature / wontfix":

Для этого нам нужно добавить имя метода jQuery для каждого имени метода элемента DOM. И, конечно же, этот метод ничего не сделает для немедиа-элементов, поэтому не похоже, что он стоит дополнительных байтов, которые потребуются.

скверна
источник
3
Спасибо! Именно то, что я искал!
utdrmac
21

Для всех, кто следит за мной, я просто взял ответ Ахмета и обновил здесь jsfiddle исходного вопроса , заменив:

audio.mp3

за

http://www.uscis.gov/files/nativedocuments/Track%2093.mp3

ссылки в свободно доступном mp3 вне сети. Спасибо, что поделились простым решением!

Техас-Брониус
источник
Работает над Firefox 42 на Ubuntu
Боян Когой,
1
Событие загрузки не запускается в этом jsfiiddle в Chrome. Играет только из-за атрибута автозапуска.
Том
12

У меня есть хорошее и универсальное решение с запасным вариантом:

<script type="text/javascript">
    var audiotypes={
        "mp3": "audio/mpeg",
        "mp4": "audio/mp4",
        "ogg": "audio/ogg",
        "wav": "audio/wav"
    }

    function ss_soundbits(sound){
        var audio_element = document.createElement('audio')
        if (audio_element.canPlayType){
            for (var i=0; i<arguments.length; i++){
                var source_element = document.createElement('source')
                source_element.setAttribute('src', arguments[i])
                if (arguments[i].match(/\.(\w+)$/i))
                    source_element.setAttribute('type', audiotypes[RegExp.$1])
                audio_element.appendChild(source_element)
            }
            audio_element.load()
            audio_element.playclip=function(){
                audio_element.pause()
                audio_element.currentTime=0
                audio_element.play()
            }
            return audio_element
        }
    }
</script>

После этого вы можете инициализировать столько аудио, сколько захотите:

<script type="text/javascript" >
    var clicksound  = ss_soundbits('your/path/to/click.ogg', "your/path/to/click.mp3");
    var plopsound  = ss_soundbits('your/path/to/plopp.ogg', "your/path/to/plopp.mp3");
</script>

Теперь вы можете получить доступ к инициализированному аудиоэлементу где угодно с помощью простых вызовов событий, таких как

onclick="clicksound.playclip()"

onmouseover="plopsound.playclip()"
Андре Р. Коль
источник
4

Что о:

$('#play').click(function() {
  const audio = new Audio("https://freesound.org/data/previews/501/501690_1661766-lq.mp3");
  audio.play();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Луис Дэвид
источник
это самый простой способ, работает как шарм, и вы можете запустить это же действие, используя ванильные js-события, если хотите.
Андреа Мауро,