Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.03.2021, 19:06
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

Запись аудио: нет длительности у файла
Добрый день!

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

Использую mediaRecorder, все работает, все скачивается.
Но почему-то при воспроизведении не могу перемотать вперед (ни на страничке, ни на компе, после того как скачала).
На компе длительность в проигрывателе стоит 435 часов, хотя запись около 10 секунд.
В свойствах файла графа продолжительность пустая.

Подскажите, пожалуйста, в какую сторону копать?
Мне как-то надо самой свойство файла заполнить?

Клиентская часть:
navigator.mediaDevices.getUserMedia({ audio: true})
	.then(function(stream){
		const mediaRecorder = new MediaRecorder(stream);

		document.querySelector('#start').addEventListener('click', function(){
			mediaRecorder.start();
		});
		let audioChunks = [];
		mediaRecorder.addEventListener("dataavailable",function(event) {
			audioChunks.push(event.data);
		});

		document.querySelector('#stop').addEventListener('click', function(){
			mediaRecorder.stop();
		});

		mediaRecorder.addEventListener("stop", function() {
			const audioBlob = new Blob(audioChunks, {
				type: 'audio/wav'
			});

			let fd = new FormData();
			fd.append('voice', audioBlob);
			sendVoice(fd);
			audioChunks = [];
		});
	});
	
async function sendVoice(form) {
	let promise = await fetch(URL, {
		method: 'POST',
		body: form});
	if (promise.ok) {
		let response =  await promise.json();
		console.log(response.data);
		let audio = document.createElement('audio');
		audio.src = response.data;
		audio.controls = true;
		audio.autoplay = false;
		document.querySelector('#messages').appendChild(audio);
	}
};


На сервере:
$uploadDir = 'records/';
$typeFile = explode('/', $_FILES['voice']['type']);
$uploadFile = $uploadDir . $pass.'_'.$q.'_'.time().'.'.$typeFile[1];
if (move_uploaded_file($_FILES['voice']['tmp_name'], $uploadFile)) {
    $response = ['result'=>'OK', 'data'=>'../voice_record/' . $uploadFile];
} else {
    $response = ['result'=>'ERROR', 'data'=>''];
}

echo json_encode($response);
Ответить с цитированием
  #2 (permalink)  
Старый 06.03.2021, 19:34
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

const mediaRecorder = new MediaRecorder(stream);

Вы не указываете второй параметр, определяющий mimetype.
Вы уверены, что по умолчанию он будет записывать в audio/wav?

Откуда приходит страница? MediaRecorder работает только, если страница приходит по https: или с localhost.
Ответить с цитированием
  #3 (permalink)  
Старый 07.03.2021, 16:47
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

voraa,

страница приходит с https.

Спасибо за наводку про mimetype.
Почитала, действительно браузер в другом формате записывает.
Добавила проверку на поддерживаемые форматы, и выставила mimetype соответствующий.

Хром записывает только в webm, видимо поэтому перемотка не работает, а другие форматы он не поддерживает.

Проблему решает конвертация записи в любой другой формат.

Спасибо Вам за помощь!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имя файла не соответствует имени класса - итог приложение не запускается, ошибок нет khusamov ExtJS 15 29.05.2015 15:58
Проверка файла. Узнать существует он или нет. Node js vlzkonopatov AJAX и COMET 8 28.11.2014 19:28
Чтение и запись файла kilogram Серверные языки и технологии 0 16.05.2012 23:59
Работа с radiobutton djsadd Элементы интерфейса 2 06.04.2011 08:37
Чтение и запись с txt или csv файла vitaver AJAX и COMET 0 23.12.2010 20:43