Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Воспроизведение музыки на сайте с прерванного места (https://javascript.ru/forum/misc/77961-vosproizvedenie-muzyki-na-sajjte-s-prervannogo-mesta.html)

Lefseq 07.07.2019 12:11

Воспроизведение музыки на сайте с прерванного места
 
Здравствуйте.

Возможно ли выполнить следующую задачу?

При заходе на страницу example.html начинает играть мелодия, но если страницу обновить мелодия начинает играть с самого начала, возможно ли сделать, чтобы после обновления страницы мелодия начинала звучать с прерванного места?

Malleys 07.07.2019 16:59

Цитата:

Сообщение от Lefseq
При заходе на страницу example.html начинает играть мелодия, но если страницу обновить мелодия начинает играть с самого начала, возможно ли сделать, чтобы после обновления страницы мелодия начинала звучать с прерванного места?

Да, надо запомнить время, и при загрузке восстановить его! Этот способ требует добавления уникального id ко всем аудио...
<audio id="my-audio" src="audio.mp3" controls autoplay></audio>
<script>
	addEventListener("beforeunload", function(event) {
		localStorage.audioLastTimes = JSON.stringify(Array.from(document.querySelectorAll("audio[id]"))
		.reduce(function(data, audio) {
			data[audio.id] = audio.currentTime % audio.duration;

			return data;
		}, {}));
	});

	if("audioLastTimes" in localStorage) {
		Object.entries(JSON.parse(localStorage.audioLastTimes)).forEach(function(pair) {
			var audio = document.getElementById(pair[0]);
			if(!audio) return;
			audio.currentTime = pair[1];
		});
	}
</script>

рони 07.07.2019 17:17

Lefseq,
не самый рациональный, но возможный вариант.
let audio = document.querySelector("audio");
let currentTime = Number(localStorage.audioTime||0);
audio.currentTime = currentTime;
let loop = ()=> {
localStorage.audioTime = audio.currentTime;
requestAnimationFrame(loop);
}
requestAnimationFrame(loop)
//audio.play()

Lefseq 07.07.2019 18:00

Malleys,
Мне нужно чтобы без плеера на странице, просто фоновая музыка

Lefseq 07.07.2019 18:03

рони,
А где тут ссылку на песню прописать? Только мне нужно чтобы музыка звучала без наличия плеера на странице, просто фоном. Подскажите пожалуйста.

рони 07.07.2019 18:08

Цитата:

Сообщение от Lefseq
А где тут ссылку на песню прописать?

как создать автовоспроизведение не знаю.

Malleys 07.07.2019 21:02

Цитата:

Сообщение от Lefseq
Мне нужно чтобы без плеера на странице, просто фоновая музыка

Так удалите атрибут controls

Если у вас предполагается проигрывание всё время одного файла, то можно и так...
<script>

(function() {
	var audio = new Audio();
	audio.src = "audio.mp3";
	audio.currentTime = "audioLastTime" in localStorage ? localStorage.audioLastTime : 0;
	audio.loop = true;
	audio.play();

	addEventListener("beforeunload", function(event) {
		localStorage.audioLastTime = audio.currentTime % audio.duration;
	});
})();

</script>


Цитата:

Сообщение от рони
не самый рациональный, но возможный вариант.

Это вообще бессмысленно, оно ничего не рисует (и тем более, если переключиться на другую вкладку, то requestAnimationFrame не будет вызываться!)

рони 07.07.2019 21:07

Malleys,
как заставить работать этот параметр autoplay или audio.play()?
браузеры против.

Malleys 08.07.2019 04:26

Цитата:

Сообщение от рони
как заставить работать этот параметр autoplay или audio.play()?

В спецификации HTML5 написано, что когда у аудио-элемента представлен атрибут autoplay, то браузер автоматически начнёт проигрывание аудио-ресурса с того момента, как только он сможет проигрывать без прерывании.

В новых версиях Google Chrome запуск программного проигрывания возможно только в том случае, если пользователь уже взаимодействовал со страницей. Это было сделано с целью предотвратить шумные вкладки.

Если запустить Google Chrome c аргументом --autoplay-policy=no-user-gesture-required, то оно работает так, как описано в спецификации
Код:

chrome --autoplay-policy=no-user-gesture-required

рони 08.07.2019 08:04

Цитата:

Сообщение от Malleys
Если запустить Google Chrome c аргументом

спасибо за вариант, но
Firefox тоже не хочет воспроизводить, для клиента добавлять аргументы на запуск, наверно не выход.

Malleys 08.07.2019 14:04

Цитата:

Сообщение от рони
для клиента добавлять аргументы на запуск, наверно не выход.

Вот именно поэтому эти аргументы и были добавлены! Чтобы можно было по прежнему запускать звук в программах и ОС, и была возможность избавиться от шумных вкладок!

Цитата:

Сообщение от рони
для клиента добавлять аргументы на запуск, наверно не выход.

У меня такое чувство, что если я не добавил кнопку Посмотреть! и не дописал полностью рабочий пример, то вы вообще не понимаете, о чём там речь!

Цитата:

Сообщение от рони
Firefox тоже не хочет воспроизводить

Во всех браузерах воспроизводится, просто вам нужно обрабатывать исключение...

Например, автозапуск в браузере Google Chrome со звуком разрешен, если:
  • Пользователь взаимодействовал с доменом (щёлкнул мышью, прикоснулся к сенсорному экрану и т. д.).
  • На настольном компьютере ранее воспроизводил звуком (на основе значения индекса заинтересованности пользователя)
  • На мобильном телефоне пользователь добавил сайт на свой домашний экран

Добавил обработку исключения...

Цитата:

Сообщение от Lefseq
Только мне нужно чтобы музыка звучала без наличия плеера на странице, просто фоном.

Фоновая музыка без возможности её отключить является плохой практикой!

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <style>
    
.audio-muting-button {
	position: fixed;
	top: 1em;
	left: 1em;
	background: white;
	border: 1px solid #f1f1f1;
	border-radius: 0.5em;
	box-shadow: 0 0.5em 1em rgba(0, 0, 0, 0.1);
	font: 1em -apple-system, system-ui, sans-serif;
	text-transform: uppercase; 
	display: flex;
	align-items: center;
	padding: 0.5em;
	overflow: hidden;
	outline: none;
}

.audio-muting-button::before {
	content: "volume_off";
	font: 2em Material Icons;
	text-transform: none;
	margin-right: 0.25em;
}

.audio-muting-button.muted::before {
	content: "volume_up";
}

.audio-muting-button::after {
	content: "";
	position: absolute;
	background: #EEEEEE;
	width: 50px;
	height: 50px;
	top: 50%;
	left: 50%;
	margin: -25px;
	border-radius: 50%;
	transition: 300ms linear;
	transform: scale(0);
	z-index: -1;
}

.audio-muting-button:focus::after {
	transform: scale(5);
}
    
    </style>
	<script>

document.addEventListener("DOMContentLoaded", function() {
	var audio = new Audio("https://cdn.glitch.com/2e4efa25-4991-43a3-9729-bd42c161c6ce%2Faudio.mp3?v=1");
	audio.currentTime = "audioLastTime" in localStorage ? localStorage.audioLastTime : 0;
	audio.loop = true;
	audio.play().catch(function() {
		audio.muted = true;
		renderMutingLabel();
	});
	
	var button = document.createElement("button");
	button.className = "audio-muting-button";
	renderMutingLabel();
	button.addEventListener("click", function() {
		audio.muted ^= true;
		renderMutingLabel();
		audio.play();
	});
	function renderMutingLabel() {
		button.textContent = audio.muted ? "Tap to unmute" : "Tap to mute";
		button.classList.toggle("muted", audio.muted);
	}
	document.body.appendChild(button);

	addEventListener("beforeunload", function(event) {
		localStorage.audioLastTime = audio.currentTime % audio.duration;
	});
});

	</script>
  </head>
  <body></body>
</html>


Интересно, что после того как я нажал эту кнопку (у себя по адресу localhost:5000) пару десятков раз, браузер разрешил автозапуск (очевидно же, что на основе значения индекса заинтересованности пользователя)

UPD Интересно, что на форуме уже со второго раза разрешает автозапуск! (По крайней мере у меня!)

рони 08.07.2019 14:52

Malleys,
спасибо за код, добавил в сундучок.
Цитата:

Сообщение от Malleys
У меня такое чувство, что если я не добавил кнопку Посмотреть! и не дописал полностью рабочий пример, то вы вообще не понимаете, о чём там речь!

да, я не владею терминологией и современными средствами разработки, знаю только простой js и jquery.


Часовой пояс GMT +3, время: 03:19.