Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Воспроизведение аудио (https://javascript.ru/forum/misc/81263-vosproizvedenie-audio.html)

him 10.11.2020 11:50

Удалось запустить воспроизведение двумя способами:
var audio = new Audio();
audio.src = URL.createObjectURL(new Blob([data], {type: "audio/x-wav"}));
audio.play();


var wavString = data;
var audio = new Audio();
var len = wavString.length;
var buf = new ArrayBuffer(len);
var view = new Uint8Array(buf);
for (var i = 0; i < len; i++) {
	view[i] = wavString.charCodeAt(i) & 0xff;
}
var blob = new Blob([view], {type: "audio/x-wav"});
audio.src = URL.createObjectURL(blob);
audio.play();


Оба варианта портят звук. Второй вариант портит меньше.
В чем может быть причина ??

him 10.11.2020 15:30

Что бы не портились данные пришлось закодироваться. :)
Но возникла другая проблема, где то обрезаются по длине.

toFile("len.txt", strlen($rawWave));
echo base64_encode($rawWave);


success: function(data) {
var decodeWave = atob(data);
var len = decodeWave.length;
console.log(len);


Получаю:
95384
71538
Куда могли деться 23846 ??

Nexus 10.11.2020 15:38

him, покажите код, который отправляет запрос на сервер и получает содержимое вашего wav-файла.

Nexus 10.11.2020 15:42

Цитата:

Сообщение от him
Получаю:
95384
71538
Куда могли деться 23846 ??


https://wtools.io/php-sandbox/b22Y
<?php
    $string = '������';
    
    var_dump([
        strlen($string), // 4
        mb_strlen($string, 'UTF-8') // 1
    ]);


alert('������'.length);// 2

him 11.11.2020 12:35

header('Content-type: audio/x-wav');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.mb_strlen($rawWave, '8bit'));

toFile("len.txt", strlen($rawWave));              // 95384
toFile("len2.txt", mb_strlen($rawWave, '8bit'));  // 95384
echo base64_encode($rawWave);


$.ajax({
type: "POST",
..
success: function(data) {
var decodeWave = atob(data);

var len = decodeWave.length;  // 71538
console.log(len);



Как то так ..

him 20.11.2020 09:35

Вобщем, на обычном компьютере все работает. Но радость моя была не долгой.
На iPad-е аудио не проигрывается.
Лазил в интернете. Своя система безопасности (статья от 2012 года). Нужно пользователю что то нажать. Ну у меня вроде нажимает.
Да, у меня нету тега <audio> в html документе. Но он вроде не обязательный.
В чем может быть проблема еще ?
<form>
<input type="button" id="But" value="Проиграть">
</form>
...
$(document).on('click', '#But', function(e) {
	...
	$.ajax({
	..
	success: function(data) {
		var audio = new Audio();
		...
		var blob = new Blob([view], {type: "audio/wav"});
		audio.src = URL.createObjectURL(blob);
		audio.addEventListener('ended', function () { console.log(" ended !! ");});
		audio.play();
		...

Nexus 20.11.2020 12:10

Цитата:

Сообщение от him
В чем может быть проблема еще ?

Проблема, почти уверен, в том, что после нажатия пользователем на кнопку вы сначала отправляете запрос (что требует какого-то времени) и только после этого пытаетесь воспроизвести audio.

Попробуйте предзагружать аудио и воспроизводить его сразу после нажатия пользователем на кнопку.

laimas 20.11.2020 13:50

Цитата:

Сообщение от him
mb_strlen($rawWave, '8bit')

То есть, бинарные данные, это как пить дать в UTF будут? :)

him 20.11.2020 13:56

Цитата:

Попробуйте предзагружать аудио и воспроизводить его сразу после нажатия пользователем на кнопку.
Как я могу что то загрузить, не зная что выбрал пользователь.
Пользователь выбирает что ему надо, и жмет кнопку.
На основании этих данных формируется ответ.
Или я не правильно что то понял ?

Цитата:

То есть, бинарные данные, это как пить дать в UTF будут?
Наверно. Посути содержимое файла wave.

voraa 20.11.2020 14:02

Цитата:

Сообщение от him
Нужно пользователю что то нажать. Ну у меня вроде нажимает.

Разные браузеры по разному могут трактовать, что play запускается после события вызванного действием пользователя.
Если запустить непосредственно в обработчике 'click' - это одно.
Но вы запускаете уже в обработчике другого события - какого то события XMLHttpRequest.

Надо бы проверить, может быть на fetch они среагируют более благосклонно.


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