Я работаю с angular / nativescript с плагином 'nativescript-audio', мне нужно записать аудио с наилучшим качеством и отправить его в API с помощью HttpClient.
Есть несколько вещей, которые мне нужно сделать, например, преобразовать звук в base64 и записать его с хорошим качеством, но я не очень хорошо знаю родной звук.
В настоящее время, используя этот плагин, я могу записывать и воспроизводить аудио в самой библиотеке, но при отправке на базе 64 он становится неузнаваемым в API.
Что я делаю:
private async _startRecord(args) {
if (!this._recorder.hasRecordPermission()) await this._askRecordPermission(args);
try {
this._isRecording = true;
await this._recorder.start(this._getRecorderOptions());
} catch (err) {
console.log(err);
}
}
private _getRecorderOptions(): AudioRecorderOptions {
let audioFileName = 'record'
let audioFolder = knownFolders.currentApp().getFolder('audio');
let recordingPath = `${audioFolder.path}/${audioFileName}.${this.getPlatformExtension()}`;
let androidFormat, androidEncoder;
if (platform.isAndroid) {
androidFormat = 4;
androidEncoder = 2;
}
return {
filename: recordingPath,
format: androidFormat,
encoder: androidEncoder,
metering: true,
infoCallback: info => { console.log(JSON.stringify(info)); },
errorCallback: err => this._isRecording = false
}
}
Тогда:
let audioFileName = 'record';
let audioFolder = knownFolders.currentApp().getFolder('audio');
let file: File = audioFolder.getFile(`${audioFileName}.${this.getPlatformExtension()}`);
let b = file.readSync();
var javaString = new java.lang.String(b);
var encodedString = android.util.Base64.encodeToString(
javaString.getBytes(),
android.util.Base64.DEFAULT
);
this.service.sendFile(encodedString)
.subscribe(e => {
console.log(e);
}, error => {
console.log('ERROR ////////////////////////////////////////////');
console.log(error.status);
})
Услуга:
sendFile(fileToUpload: any): Observable<any> {
let url: string = `myapi.com`
let body = { "base64audioFile": fileToUpload }
return this.http.post<any>(url, body, {
headers: new HttpHeaders({
// 'Accept': 'application/json',
// 'Content-Type': 'multipart/form-data',
// "Content-Type": "multipart/form-data"
}),
observe: 'response'
});
}
Я уже пытался изменить параметры записи несколькими способами, но я не знаю, какой из них подходит для наилучшего качества звука и какие форматы и кодировки мне нужны:
androidFormat = 3;
androidEncoder = 1;
channels: 2,
sampleRate: 96000,
bitRate: 1536000,
Результат base64 сильно зависит от типа кодирования, который я делаю, но до сих пор мне не удалось получить ничего узнаваемого, только некоторые шипящие и неузнаваемые шумы.