Воспроизведение сырых аудиоданных BLOB - PullRequest
0 голосов
/ 20 сентября 2018

Одна из наших систем имеет возможность вернуть запись в виде данных большого двоичного объекта.Описание из документации:

GET для элемента возвращает двоичный двоичный объект записи с типом содержимого "audio / x-wav".

Когда ясохранить эти данные в файл WAV, он воспроизводим, но я не хочу сохранять, но использовать эти данные для воспроизведения файла с веб-сайта.

Возвращенные данные являются необработанными данными, такими как:

RIFF�WAVEfmt 1@YA@factddataP͗�"���Ɩۖb�V�3Ԅe��8�W�@�đ#���h�"����o�ml��D�miG�F��Rˑ �YST@��I#i�S��TT��Dr�H@47.ݧ��M�D��$���-�9n�\+1� ���) ����)S�`\ő!I,�$��Y�`䘑$��#�P&��_�r����QE �i

Я пытался преобразовать это в BLOB-URL, но безуспешно.Данные извлекаются с использованием PHP Curl.

Использование:

file_put_contents('vm.wav', $API->getVoicemail(96));

сохранит файл и сделает его воспроизводимым.Код, который я использовал для воспроизведения данных BLOB-объектов в аудиоэлементе:

var wavString = "<? echo base64_encode($API->getVoicemail(96)) ?>";
// var wavString = "<? echo $API->getVoicemail(96) ?>"; // Alternative, but makes the script crash due to the symbols
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"});
var url = URL.createObjectURL(blob);
console.log(url);
var wave = new Audio();
wave.controls = true;
wave.src = url;
document.body.appendChild(wave); 

К сожалению, безуспешно ... Есть идеи, как заставить это работать?

Редактировать:

Я попытался создать дополнительный файл с именем fetch.php, для которого я установил элемент в качестве источника.Ниже приведен код:

<?php

$vmID = $_GET['id'];

$cvm = curl_init();

curl_setopt($cvm, CURLOPT_USERPWD, 'username:password');
curl_setopt($cvm, CURLOPT_URL, "https://url.to.server/api/vms/". $vmID);
curl_setopt($cvm, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cvm, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($cvm, CURLOPT_SSL_VERIFYPEER, false);

$vmgetheaders = array();
$vmgetheaders[] = "Connection: close";
curl_setopt($cvm, CURLOPT_HTTPHEADER, $vmgetheaders);

$vmgetresult = curl_exec($cvm);
if (curl_errno($cvm)) {
    $vmgetresult = 'Error:' . curl_error($ch);
}
curl_close ($cvm); 

echo $vmgetresult;
?>

При просмотре страницы fetch.php? Id = 1 получается:

RIFF�WAVEfmt 1@YA@factddataP͗�"���Ɩۖb�V�3Ԅe��8�W�@�đ#���h�"����o�ml��D�miG�F��Rˑ �YST@��I#i�S��TT��Dr�H@47.ݧ��M�D��$���-�9n�\+1� ���) ����)S�`\ő!I,�$��Y�`䘑$��#�P&��_�r����QE �i

Но при попытке выполнить это в элементе ничего не происходит.Вот код, который я использую для элемента:

<audio src="https://url/fetch.php?id=96" controls>
  Your browser does not support the <code>audio</code> element.
</audio>

В консоли вкладки сети не появляются ошибки, а также не возникают ошибки PHP.

...