Cách tạo âm thanh tự động phát trên chrome


94

tự động phát âm thanh cũng hoạt động trong Mozilla, Microsoft edge và google chrome cũ nhưng không hoạt động trong google chrome mới. họ đã chặn tự động phát. có cách nào để làm cho nó tự động phát âm thanh trong google chrome không?


7
Thực tế là Google đã làm điều này là vô lý. Theo nghĩa đen, họ chỉ nói "không có nhạc cho trò chơi của bạn trừ khi người dùng nhấp vào Play Âm nhạc". Không thể chấp nhận được. Rất tức giận!
Hobbes

2
@Hobbes Đồng ý. Ít nhất nên có ngoại lệ. Như tôi đã đề cập với một người đăng khác, tôi có một trang "MUSIC", với một liên kết trang web "mymusic.html", bạn chỉ có thể truy cập bằng một liên kết / nút được dán nhãn rõ ràng LÀ NHẠC CỦA TÔI ". Khá là ngớ ngẩn khi ai đó vào đó và bị ngạc nhiên hoặc khó chịu khi nhạc mẫu được phát ở đó. Đặc biệt với nút DỪNG NHẠC "vị trí cố định" rõ ràng. Chính sách này là trường hợp phản ứng thái quá đối với các hành vi lạm dụng.
Randy

Câu trả lời:


104

Giải pháp số 1

Giải pháp của tôi ở đây là tạo một iframe

<iframe src="audio/source.mp3" allow="autoplay" style="display:none" id="iframeAudio">
</iframe> 

audiogắn thẻ cũng cho các trình duyệt không phải chrome

<audio autoplay loop  id="playAudio">
    <source src="audio/source.mp3">
</audio>

và trong tôi script

  var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
  if (!isChrome){
      $('#iframeAudio').remove()
  }
  else {
      $('#playAudio').remove() // just to make sure that it will not have 2x audio in the background 
  }

Giải pháp # 2:

Cũng có một giải pháp khác cho điều này theo @Leonard

Tạo một iframetrò chơi không phát bất cứ thứ gì chỉ để kích hoạt tự động phát trong lần tải đầu tiên.

<iframe src="silence.mp3" allow="autoplay" id="audio" style="display: none"></iframe>

nguồn tốt cho tệp mp3 im lặng.mp3

Sau đó, phát tệp âm thanh thực của bạn một cách thoải mái.

<audio id="player" autoplay loop>
    <source src="audio/source.mp3" type="audio/mp3">
</audio>

Cá nhân tôi thích giải pháp số 2 hơn vì nó là cách tiếp cận rõ ràng hơn vì không phụ thuộc quá nhiều vào JavaScript.

Cập nhật tháng 8 năm 2019

Giải pháp # 3

Để thay thế, chúng tôi có thể sử dụng <embed>

Đối với Firefox Có vẻ như tính năng tự động phát âm thanh đang hoạt động nên chúng ta không cần <embed>phần tử vì nó sẽ tạo ra âm thanh kép đang chạy.

// index.js
let audioPlaying = true,
    backgroundAudio, browser;
browser = navigator.userAgent.toLowerCase();
$('<audio class="audio1" src="audio.mp3" loop></audio>').prependTo('body');
if (!browser.indexOf('firefox') > -1) {
    $('<embed id="background-audio" src="audio.mp3" autostart="1"></embed>').prependTo('body');
    backgroundAudio = setInterval(function() {
        $("#background-audio").remove();
        $('<embed id="background-audio" src="audio.mp3"></embed>').prependTo('body');
    }, 120000); // 120000 is the duration of your audio which in this case 2 mins.
}

Ngoài ra, nếu bạn có sự kiện chuyển đổi cho âm thanh của mình, hãy đảm bảo xóa <embed>phần tử đã tạo cho âm thanh.

Lưu ý: Sau khi chuyển đổi của bạn, nó sẽ khởi động lại từ đầu vì phần tử <embed>đã bị xóa và <audio>phần tử sẽ phát như bình thường bây giờ.

$(".toggle-audio").on('click', function(event) {
    audioPlaying = !audioPlaying;
    $("#background-audio").remove();

    clearInterval(backgroundAudio);
    if (audioPlaying){
        $(".audio1").play();
        // play audio 
    }
    else {
        $(".audio1").pause();
    }

Và bây giờ hãy đảm bảo ẩn các phần tử này <audio><embed>

audio, embed {
    position: absolute;
    z-index: -9999;
}

Lưu ý: diplay: nonevisibility: hiddensẽ làm cho <embed>phần tử không hoạt động.


Làm thế nào để bạn tạo vòng lặp âm thanh?
Kwarrtz

1
Giải pháp 2 đã làm việc cho tôi. Ghi chú bên lề: nếu bạn đang làm việc cho web và Phonegap cùng một lúc, thì Phonegap không cần giải pháp này và nó thực sự khá tệ. Vì vậy, nếu bạn có cơ sở mã chung cho web và Phonegap, hãy đảm bảo rằng bạn tìm cách áp dụng giải pháp này chỉ trên web.
Ignacio Segura,

2
Liên kết đến tệp im lặng đã chết, vì vậy tôi đã tìm thấy một số tệp im lặng khác trên GitHub: github.com/anars/blank-audio . Tôi đang sử dụng 1-second-of-silence.mp3cho dự án của mình, nhưng bất kỳ tệp nào trong bộ sưu tập này sẽ hoạt động, tôi đoán vậy.
Travis

13
Dường như vỡ như của Chrome 76.
mightyiam

3
Vâng, điều này không có tác dụng nữa (nếu nó đã làm việc trong quá khứ)
Yulian

28

Có một thủ thuật thực sự hữu ích để sử dụng chức năng tự động phát của thẻ âm thanh trong chrome.

Thêm vào

<iframe src="silence.mp3" allow="autoplay" id="audio"></iframe>

trong khi silence.mp3chỉ là 0,5 giây im lặng.

Điều này

<audio id="player" autoplay controls><source src="0.mp3" type="audio/mp3"></audio>

hoạt động sau đó.

Chrome nhận thấy rằng âm thanh đã được phát và cấp quyền tự động phát trong thẻ âm thanh.


5
OK, mặc dù điều này hoạt động nhưng nó cũng có cảm giác như nó đang khai thác một lỗi, hoặc ít nhất là hành vi không mong muốn. Tôi tưởng tượng ai đó sẽ báo cáo điều này với Google để tôi không dựa vào nó hoạt động lâu. Rất vui khi tìm thấy!
Neil Bryson

4
Hơi lạc đề nhưng sự im lặng của bạn.mp3 khá lớn là 36,7k. Hãy thử điều này (216 byte) - s3-eu-west-1.amazonaws.com/neilbryson.net.random/silence.mp3
Neil Bryson

3
Liên kết im lặng.mp3 đã chết. Bạn có thể tạo của riêng bạn .
idbrii 13/1218

1
@Toniq Tất nhiên, xin lỗi tất cả - s3-eu-west-1.amazonaws.com/omegasquadron.neilbryson.net/…
Neil Bryson

1
Vâng, họ đang sử dụng nó ... không hoạt động nữa trong Firefox hoặc Chrome
Stefan Reich

15

Kể từ tháng 4 năm 2018, chính sách tự động phát của Chrome đã thay đổi:

"Chính sách tự động phát của Chrome rất đơn giản:

  • Tự động phát bị tắt tiếng luôn được phép.

Tự động phát có âm thanh được phép nếu:

  • Người dùng đã tương tác với miền (nhấp, nhấn, v.v.).
  • Trên máy tính để bàn, ngưỡng Chỉ số tương tác truyền thông của người dùng đã bị vượt qua, có nghĩa là trước đó người dùng đã phát video có âm thanh.
  • Trên thiết bị di động, người dùng đã thêm trang web vào màn hình chính của họ.

Cũng thế

  • Các khung trên cùng có thể ủy quyền quyền tự động phát cho iframe của chúng để cho phép tự động phát có âm thanh. "

Trang web dành cho nhà phát triển của Chrome có thêm thông tin, bao gồm một số ví dụ lập trình, bạn có thể tìm thấy tại đây: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes


3
vì vậy bạn đang nói rằng không có cách nào chúng tôi có thể tự động phát âm thanh trong trình duyệt chrome?
Akshay Rathod

Ngoài ra, hiện có một tùy chọn quyền trong Trình duyệt Chrome trên Android mà người dùng có thể chọn để cho phép âm thanh trong tự động phát
zeta

8

Chỉ cần thêm tập lệnh nhỏ này như được mô tả trong https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio

<head>
<script>
window.onload = function() {
  var context = new AudioContext();
}
</script>
</head>

Hơn điều này sẽ hoạt động như bạn muốn:

<audio autoplay>
      <source src="hal_9000_sorry_dave.mp3">
</audio>

Bạn có thể gửi cho tôi một mẹo thực hiện này không? Nó sẽ thực sự hữu ích
Vikash

5
Nó không còn hoạt động? Nhận tin nhắn này: "Các AudioContext không được phép bắt đầu Nó phải được tiếp tục (hoặc tạo) sau khi một cử chỉ người dùng trên trang.. Developers.google.com/web/updates/2017/09/... "
thdoan

Làm việc trên Chrome 81.0.4044.138 trên mac 👍
Mosh Feu

5

Ít nhất bạn có thể sử dụng cái này:

document.addEventListener('click', musicPlay);
function musicPlay() {
    document.getElementById('ID').play();
    document.removeEventListener('click', musicPlay);
}

Nhạc bắt đầu khi người dùng nhấp vào bất kỳ đâu trên trang.

Nó cũng xóa ngay EventListener, vì vậy nếu bạn sử dụng các điều khiển âm thanh, người dùng có thể tắt tiếng hoặc tạm dừng nó và nhạc không bắt đầu lại khi anh ta nhấp vào một nơi khác ..


Tôi tin rằng điều này đang đi đúng hướng, tuân thủ các chính sách mới yêu cầu MỘT SỐ tương tác của người dùng để phát nhạc. Tôi đã thêm sự kiện này vào sự kiện cảm ứng mà tôi đã thêm cho các trình duyệt trên thiết bị di động và một sự kiện trên cuộn "đôi khi hoạt động". Rất tiếc, chính sách "no play ()" dường như không cho phép cuộn con lăn chuột được tính là tương tác của người dùng, nhưng tôi cũng đang nghiên cứu điều đó. Vấn đề là, trang của tôi là một trang MUSIC, theo nghĩa đen được gọi là "mymusic.html", mà bạn có thể truy cập vào một nút NHẠC có nhãn rõ ràng. Vì vậy, nếu có một trang nào đó để biện minh cho việc 'chơi' khi tải ', thì trang đó thực sự nên làm!
Randy

@Randy Tôi cũng đang gặp trường hợp tương tự, tôi đang làm việc trên một trang âm nhạc và muốn triển khai tính năng tự động phát. Việc thêm thuộc tính autoplay hoạt động rất mâu thuẫn - đôi khi cùng một đoạn mã hoạt động, nhưng không phải lúc nào cũng vậy. Tôi không có bảng điều khiển hoặc lỗi mạng. Bạn đã giải quyết được tình huống của mình chưa?
Lazarus Rising

@LazarusRising - Mặc dù tất cả điều này dường như bắt đầu với trình duyệt điện thoại, nhưng tôi nhận thấy các phiên bản mới hơn của trình duyệt trên máy tính để bàn cũng từ chối tự động phát. Tôi phải nói rằng, tôi hài lòng với nhu cầu có một sự kiện được kích hoạt bởi sự tương tác của người dùng bắt đầu âm nhạc. Trên thực tế, ngay cả tôi, với tư cách là tác giả của trang, cũng bắt đầu thấy khó chịu khi truy cập trang của mình và nhạc bắt đầu chỉ vì tôi chạm vào màn hình. Tôi bắt đầu thấy logic tại sao tính năng tự động phát đang bị loại bỏ. Và kể từ khi nó bắt đầu xảy ra trên toàn cầu, tôi không cảm thấy như trang web của mình là trang duy nhất không làm được điều đó.
Randy

Chrome vi phạm vì ép chơi.
Gabriel Petersson

2

Các trình duyệt đã thay đổi quyền riêng tư của họ thành video hoặc âm thanh tự động phát do Quảng cáo gây khó chịu. Vì vậy, bạn chỉ có thể lừa với mã dưới đây.

Bạn có thể đặt bất kỳ âm thanh im lặng nào vào iframe.

<iframe src="youraudiofile.mp3" type="audio/mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<audio autoplay>
    <source src="youraudiofile.mp3" type="audio/mp3">
</audio>

Chỉ cần thêm iframe ẩn với .mp3 làm nguồn của nó và allow = "autoplay" trước phần tử âm thanh. Kết quả là trình duyệt bị lừa bắt đầu bất kỳ tệp âm thanh nào tiếp theo. Hoặc tự động phát video không bị tắt tiếng.


2

Bạn có thể chỉ cần sử dụng (.autoplay = true;) như sau (được thử nghiệm trên Chrome Desktop):

<audio id="audioID" loop> <source src="path/audio.mp3"  type="audio/mp3"></audio>

<script>
var myaudio = document.getElementById("audioID").autoplay = true;
</script>

Nếu bạn cần thêm các nút dừng / phát:

<button onclick="play()" type="button">playbutton</button>
<button onclick="stop()" type="button">stopbutton</button>

<audio id="audioID" autoplay loop> <source src="path/audio.mp3"  type="audio/mp3"> 
</audio>

<script>
var myaudio = document.getElementById("audioID");

function play() { 
return myaudio.play(); 
};

function stop() {
return myaudio.pause(); 
};
</script>

Nếu bạn muốn dừng / phát chỉ là một nút:

<button onclick="PlayStop()" type="button">button</button>


<audio id="audioID" autoplay loop> <source src="path/audio.mp3"  type="audio/mp3"> 
</audio>

<script>
var myaudio = document.getElementById("audioID");

function PlayStop() { 
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>

Nếu bạn muốn hiển thị dừng / phát trên cùng một nút:

<button onclick="PlayStop()" type="button">Play</button>


<audio id="audioID" autoplay loop> <source src="path/audio.mp3"  type="audio/mp3"> 
</audio>

<script>
var myaudio = document.getElementById("audioID");

function PlayStop() { 
if (elem.innerText=="Play") {
    elem.innerText = "Stop";
}
else {
    elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};`
</script>

Trong một số trình duyệt, âm thanh có thể không hoạt động chính xác, vì vậy, hãy thử thêm iframe trước mã của bạn:

<iframe src="dummy.mp3" allow="autoplay" id="audio" style="display:none"></iframe>

<button onclick="PlayStop()" type="button">Play</button>


<audio id="audioID" autoplay loop> <source src="path/audio.mp3"  type="audio/mp3"> 
</audio>

<script>
var myaudio = document.getElementById("audioID");

function button() { 
if (elem.innerText=="Play") {
    elem.innerText = "Stop";
}
else {
    elem.innerText = "Play";
}
return myaudio.paused ? myaudio.play() : myaudio.pause();
};
</script>

Có vẻ như không hoạt động trong Phiên bản Chrome 85.0.4183.83 (Bản dựng chính thức) (64-bit)
MC9000

1

Hôm nay tôi đã bỏ qua điều này và tôi chỉ muốn thêm một chút tò mò mà tôi đã khám phá ra vào cuộc thảo luận.

Dù sao thì, tôi đã bỏ qua điều này:

<iframe src="silence.mp3" allow="autoplay" id="audio" style="display:none"></iframe>
<audio id="audio" autoplay>
  <source src="helloworld.mp3">
</audio>

Điều này:

<audio id="myAudio" src="helloworld.mp3"></audio>
<script type="text/javascript">
  document.getElementById("myAudio").play();
</script>

Và cuối cùng đây, một "giải pháp" hơi vượt quá giới hạn nếu bạn chỉ muốn tạo ra thứ của riêng bạn (mà chúng tôi làm):

<script src='https://code.responsivevoice.org/responsivevoice.js'></script>
<input onclick='responsiveVoice.speak("Hello World");' type='button' value='Play' />

Khám phá mà tôi đã thực hiện và cũng là phần thực sự hài hước (kỳ lạ? Kỳ cục? Nực cười?) Là trong trường hợp của hai điều trước, bạn thực sự có thể đánh bại hệ thống bằng cách cho f5 một cú đập thích hợp; nếu bạn nhấn làm mới một cách rất nhanh (khoảng 5-10 lần nên thực hiện thủ thuật này), âm thanh sẽ tự động phát và sau đó nó sẽ phát một vài lần sau khi làm mới một cách đáng kể chỉ để trở lại theo cách xấu. Tuyệt diệu!

Trong thông báo từ Google, nó nói rằng để các tệp phương tiện phát "tự động", phải có sự tương tác giữa người dùng và trang web. Vì vậy, "giải pháp" tốt nhất mà tôi đã tìm ra cho đến nay là thêm một nút, hiển thị việc phát các tệp ít hơn tự động, nhưng ổn định / đáng tin cậy hơn rất nhiều.


3
Dựa vào tương tác của người dùng không phải là tự động phát.
mayyiam

0

tôi đã sử dụng pixi.js và pixi-sound.js để đạt được tự động phát trong chrome và firefox.

<script>

            PIXI.sound.Sound.from({
            url: 'audios/tuto.mp3',
            loop:true,
            preload: true,
            loaded: function(err, sound) {
                    sound.play();

            document.querySelector("#paused").addEventListener('click', function() {
            const paused = PIXI.sound.togglePauseAll();

            this.className = this.className.replace(/\b(on|off)/g, '');
            this.className += paused ? 'on' : 'off';

            });
            }
            });

</script>

HTML:

<button class="btn1 btn-lg off" id="paused">
    <span class="glyphicon glyphicon-pause off"></span>
    <span class="glyphicon glyphicon-play on"></span>
</button>

nó cũng hoạt động trên thiết bị di động nhưng người dùng phải chạm vào một nơi nào đó trên màn hình để kích hoạt âm thanh.


0

Sử dụng iframethay thế:

<iframe id="stream" src="YOUTSOURCEAUDIOORVIDEOHERE" frameborder="0"></iframe>

0

sửa chữa tạm thời

$(document).on('click', "#buttonStarter", function(evt)
{
var context = new AudioContext();
document.getElementById('audioPlayer').play();
$("#buttonStarter").hide()
$("#Game").show()
});

Hoặc sử dụng trình phát tùy chỉnh để kích hoạt phát http://zohararad.github.io/audio5js/

Lưu ý: Tự động phát sẽ được bật lại vào ngày 31 tháng 12


Đây không phải là một câu trả lời, bởi vì nó không tự động phát.
mayyiam

1
@mightyiam đây là một cách giải quyết vì không có cách nào để tự động phát vì chrome đã chặn nó
Youssef KH

0

Tôi thêm thuộc tính điều khiển cũng như thẻ âm thanh và chỉ cần ẩn nó trong CSS. Và tất cả đều hoạt động tốt trong Chrome.

<audio autoplay loop controls id="playAudio">
  <source src="audio/source.mp3">
</audio>

1
Có lẽ nếu MEI của bạn cho trang web đó cho phép tự động phát. Nếu không, tôi không thấy lý do gì mà điều này sẽ hoạt động.
mayyiam

0

Google đã thay đổi chính sách của họ vào tháng trước về tính năng tự động phát trong Chrome. Vui lòng xem thông báo này .

Tuy nhiên, chúng cho phép tự động phát nếu bạn đang nhúng video và video đó bị tắt tiếng. Bạn có thể thêm thuộc mutedtính và thuộc tính này sẽ cho phép video bắt đầu phát.

<video autoplay controls muted>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
  Your browser does not support the video tag.
</video>

4
tôi muốn âm thanh phát trong nền.
Akshay Rathod

13
Không thể coi tự động phát âm thanh bị tắt tiếng là một câu trả lời.
mayyiam

@Akshay Rathod bạn đã tìm ra giải pháp chưa?
The Dead Man

0

Giải pháp không sử dụng iframe hoặc javascript:

<embed src="silence.mp3" type="audio/mp3" autostart="true" hidden="true">
        <audio id="player" autoplay controls><source src="source/audio.mp3" type="audio/mp3"></audio>

Với giải pháp này, hộp thoại mở / lưu của Internet Explorer cũng tránh được.

   <embed src="http://deinesv.cf/silence.mp3" type="audio/mp3" autostart="true" hidden="true">
        <audio id="player" autoplay controls><source src="https://freemusicarchive.org/file/music/ccCommunity/Mild_Wild/a_Alright_Okay_b_See_Through/Mild_Wild_-_Alright_Okay.mp3" type="audio/mp3"></audio>


1
Không. Không hoạt động trong Phiên bản Chrome 85.0.4183.83 (Bản dựng chính thức) (64-bit)
MC9000

0

Thẻ video cũng có thể phát âm thanh. Do thẻ âm thanh dường như không hoạt động như bình thường, bạn chỉ có thể sử dụng thẻ video cho âm thanh:

<video autoplay muted id="audio1" src="your.mp3" type="audio/mp3">
    Your browser does not support the <code>video</code> element.
</video>
<script>
    unmuteButton.addEventListener('click', function() 
        { 
            if ( unmuteButton.innerHTML == "unmute" )
            {
                unmuteButton.innerHTML = "mute";
                audio1.muted = false; 
            } else {
                unmuteButton.innerHTML = "unmute";
                audio1.muted = true; 
            }
        });
</script>

-2

Bạn có thể sử dụng <iframe src="link/to/file.mp3" allow="autoplay">, nếu nguồn gốc có quyền tự động phát. Thông tin thêm ở đây .


nó đang hiển thị các điều khiển và tôi không muốn bất kỳ thứ gì trên trang. chỉ phát và nút tạm dừng.
Akshay Rathod

và làm thế nào để lặp lại âm thanh?
Akshay Rathod

1
@AkshayRathod vui lòng kiểm tra Thuộc tính vòng lặp HTML <audio> . Trong khi đó, Trong XHTML, việc thu nhỏ thuộc tính bị cấm và thuộc tính vòng lặp phải được định nghĩa là <audio loop = "loop">.
hmd

-4

audioThuộc tính tự động phát HTML5 mặc định không hoạt động trong chrome, nhưng bạn có thể buộc tự động phát âm thanh bằng JavaScript. Thử đi:

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

Điều này làm việc cho tôi.


3
không phải là tự động phát "không hoạt động", mà là nó phải tuân theo chính sách trong đó tự động phát nếu sẽ không hoạt động nếu các yêu cầu chính sách không được đáp ứng. Xem Develop.google.com/web/updates/2017/09/… . Mã này sẽ không phá vỡ chính sách đó. Nếu nó hiệu quả với bạn, đó là vì bạn đã đạt đến ngưỡng và / hoặc đặt một số cờ nhà phát triển. Nhưng như trang đó nói, bạn không thể cho rằng nó sẽ hiệu quả với tất cả mọi người.
ADyson

Ít nhất trong FF 66, điều này cũng sẽ không hoạt động. Chính sách mới là chặn phát () nếu nó không được kích hoạt bằng cách nào đó bởi tương tác của người dùng.
Randy
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.