Я недавно включил реагирующий микрофон в мое приложение.Мое приложение использует React на клиентском интерфейсе и Rails на серверном.В то время как мне очень нравится использоватьact-mic, у меня возникают проблемы с преобразованием аудио-блобов в другой формат - в частности, mp3, mp4 или даже wav.Были какие-то рекомендуемые варианты действий, но я видел только то, что разработчикам нужно было бы найти какое-то решение вне библиотеки, чтобы позаботиться о преобразовании.Кроме того, автор Reaction-mic рассматривает варианты преобразования формата в качестве будущего улучшения.Я новичок во всем этом и хотел бы услышать, как другие заботятся об этом.Обратите внимание на следующее - мой код React берет аудио-BLOB-объект и отправляет его на мой сервер Rails как часть запроса POST-выборки.Бэкэнд использует CarrierWave для загрузки аудиофайла.Видя популярность React-Mic, я надеялся получить руководство о том, как позаботиться о преобразовании:
Вот мой код React с использованием библиотеки activ-mic:
import React from 'react';
import { ReactMic } from 'react-mic';
const hasGetUserMedia = !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia);
class AudioMic extends React.Component {
constructor(props){
super(props)
this.state = {
recordAudio: false,
blobAudio: null,
blobURL: null
};
};
startRecording = () => {
this.setState({
recordAudio: true
});
}
stopRecording = () => {
this.setState({
recordAudio: false
});
}
onStart = () => {
console.log('You can tap into the onStart callback');
}
onStop = (blobAudio) => {
this.setState({
blobAudio: blobAudio,
blobURL: blobAudio.blobURL
});
this.onUpload();
};
onUpload= () => {
let reader = new FileReader()
reader.onload = (event) => {
//save audio blob in FormData and use FileReader to get into proper format
let formData = new FormData();
formData.append('audio', event.target.result);
fetch('/api/v1/user_response', {
credentials: 'same-origin',
method: 'POST',
body: formData,
headers: {
'Accept': 'application/json, */*'
}
}).then(response => {
if (response.ok) {
return response;
}
else {
let errorMessage = `${response.status} (${response.statusText})`, error = new Error(errorMessage);
throw(error);
}
})
.then(response => response.json())
.then(body => {
console.log('MADE IT HERE');
console.log(body);
})
.catch(error => console.error(`Error in fetch: ${error.message}`));
};
reader.readAsDataURL(this.state.blobAudio.blob);
};
componentDidMount = () => {
if(!hasGetUserMedia) {
alert('Your browser cannot stream from your audio. Please switch to Chrome or Firefox.');
}
};
render() {
return (
<div>
<ReactMic
className='oscilloscope'
record={ this.state.recordAudio }
backgroundColor='#FF4081'
visualSetting='sinewave'
audioBitsPerSecond= { 128000 }
onStop={ this.onStop }
onStart={ this.onStart }
strokeColor='#000000'
/>
<div>
<audio ref='audioSource' controls='controls' src={ this.state.blobURL }></audio>
</div>
<Button animated='fade' onClick={ this.startRecording } >
<Button.Content visible>Start Recording</Button.Content>
<Button.Content hidden><Icon name='microphone' /></Button.Content>
</Button>
<Button animated='fade' onClick={ this.stopRecording }>
<Button.Content visible>Stop Recording</Button.Content>
<Button.Content hidden><Icon name='stop' /></Button.Content>
</Button>
<Button animated='fade' onClick={ this.upload }>
<Button.Content visible>Upload Response</Button.Content>
<Button.Content hidden><Icon name='cloud upload' /></Button.Content>
</Button>
</div>
);
};
};
Вотмой загрузчик Rails для аудио файла:
class UserResponseUploader < CarrierWave::Uploader::Base
include CarrierWave::Audio
if Rails.env.test?
storage :file
else
storage :fog
end
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
Есть предложения?Я попытался использовать carrierwave-audio для конвертации в mp3, но обнаружил, что спускаюсь по кроличьей норе, в которой упоминалось использование sox для конвертации аудио.Об этом можно позаботиться с другой библиотекой JS на внешнем интерфейсе?Вся помощь приветствуется.Заранее спасибо.