Запись и отправка аудио в nativescript / nativescript-audio - PullRequest
0 голосов
/ 10 июня 2019

Я работаю с 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 сильно зависит от типа кодирования, который я делаю, но до сих пор мне не удалось получить ничего узнаваемого, только некоторые шипящие и неузнаваемые шумы.

1 Ответ

0 голосов
/ 10 июня 2019

Прежде всего, вы можете просто передать байты непосредственно в метод encodeToString(...).Вам не нужно создавать строку из байтов, это недопустимо.

Также используйте флаг NO_WRAP вместо DEFAULT.

    var encodedString = android.util.Base64.encodeToString(
        b,
        android.util.Base64.NO_WRAP
    );

Здесь находится игровая площадкаПример , который я написал недавно для тестирования base64-кодирования на iOS и Android.Возможно, вам придется обновить URL-адрес файла, который в источнике дает 404 (я только что выбрал случайный mp3-файл из Интернета для тестирования).

...