Implementierung der Miniprogramm-Aufzeichnungsfunktion

Implementierung der Miniprogramm-Aufzeichnungsfunktion

Vorwort

Bei der Entwicklung eines Miniprogramms besteht die Notwendigkeit, eine Aufnahmefunktion zu implementieren, die Aufnahme abzuspielen und die Aufnahme auf einen Server hochzuladen. Während des Entwicklungsprozesses wurde das Taro-Framework verwendet. Die Aufnahmefunktion wird über die Schnittstelle Taro.getRecorderManager() implementiert, das Hochladen der Aufnahme auf den Server wird über die Schnittstelle Taro.uploadFile implementiert und die Wiedergabe der Aufnahme wird über die Schnittstelle Taro.createInnerAudioContext() implementiert. Nachfolgend finden Sie eine detaillierte Einführung in die Implementierung des gesamten Prozesses.

Mini-Programmaufzeichnung

Holen Sie sich zuerst das Aufnahmemanagermodul:

const recorderManager = Taro.getRecorderManager();

Registrieren Sie das Aufzeichnungsüberwachungsereignis, wenn die Komponente bereitgestellt wird:

useEffect(() => {
 // Auf Aufnahmestart warten recorderManager.onStart(() => {
   console.log('Aufzeichnung starten');
  });
 // Monitor-Aufnahmepause recorderManager.onPause(() => {
   console.log('Aufzeichnung pausieren');
  });
 // Warten Sie auf die Aufnahme, um fortzufahren recorderManager.onResume(() => {
   console.log('Aufzeichnung fortsetzen');
  });
 // Monitoraufzeichnung stoppen recorderManager.onStop((res) => {
   wenn (Res.Dauer < 1000) {
    Taro.showToast({
     Titel: 'Aufnahmezeit ist zu kurz',
     Dauer: 1000,
     Symbol: „keine“,
    });
   } anders {
    console.log('Aufzeichnung beenden');
    DateiUpload(res.tempFilePath);
   }
  });

  recorderManager.onError(() => {
   Taro.showToast({
    Titel: ,,Aufnahme fehlgeschlagen! ',
    Dauer: 1000,
    Symbol: „keine“,
   });
  });
 }, []);

In der Rückruffunktion der Aufzeichnung onStop können wir die temporäre Adresse der Aufzeichnung res.tempFilePath abrufen, aber diese Adresse hat ein Ablaufdatum, sodass wir die Aufzeichnung auf das Server-Backend hochladen und speichern müssen, bevor sie später normal verwendet werden kann.

In der onStop-Callback-Funktion rufen wir die fileUpload-Funktion auf, um die Datei hochzuladen. Die Implementierung der fileUpload-Funktion ist wie folgt:

const fileUpload = (tempFilePath) => {
  Taro.uploadDatei({
   url: 'http://127.0.0.1:7001/record', // Serveradresse Dateipfad: tempFilePath,
   Name: 'Datei', // Dies kann nach Belieben ausgefüllt werden Header: {
    'content-type': 'multipart/form-data', // Das Format muss dieses sein Autorisierung: Taro.getStorageSync('token'),
   },
   // formData wird verwendet, um andere Informationen als Dateien zu übertragen formData: {
    record_name: 'Rezitation Werke',
    Gedicht-ID: GedichtInfo.id,
    Kategorie: GedichtInfo.Kategorie,
   },
   Erfolg: (res) => {
    konsole.log(res);
    const url = res.data;
    playAudio(url); // Aufnahme abspielen},
   fehlgeschlagen: (Fehler) => {
    console.log('fehlgeschlagen!');
    konsole.fehler(fehler);
   },
  });
 };

Zu beachten sind folgende Punkte: Der Inhaltstyp im Header muss „multipart/form-data“ sein.

Aufzeichnung der Ereignisverarbeitung

Der erste Klick auf handleClick löst den Beginn der Aufnahme aus, und dann wird der aktuelle Status verwendet, um zu bestimmen, ob die Aufnahme angehalten oder fortgesetzt werden soll. handleComplete wird verwendet, um die Aufzeichnung zu stoppen.

const handleClick = () => {
  const curPause = pause;
  setPause(!aktuellePause);

  if (ersterDatensatz) {
   setzeErstenDatensatz(false);

   recorderManager.start({
    Dauer: 60000,
    Beispielrate: 44100,
    Anzahl der Kanäle: 1,
    encodeBitRate: 192000,
    Format: 'mp3',
    Rahmengröße: 50,
   });

   Taro.showToast({
    Titel: 'Aufnahme starten',
    Dauer: 1000,
    Symbol: „keine“,
   });

  } anders {
   if (aktuellePause) {
    recorderManager.pause(); // Aufnahme pausieren } else {
    recorderManager.resume(); //Aufnahme fortsetzen}
  }
 };

 const handleComplete = () => {
  recorderManager.stop(); // Aufnahme stoppen};

Der Hintergrund realisiert die Aufzeichnungsspeicherung und gibt die Aufzeichnungsadresse zurück

Die meisten Blogs im Internet behandeln diesen Inhalt nicht. Hier werde ich vorstellen, wie man ihn implementiert. Das von mir verwendete Hintergrundframework ist Alibabas egg.js.

Informationen zur für den Dateiupload erforderlichen Konfiguration finden Sie im offiziellen Dokument: egg.js-Dateiupload. Hier verwenden wir zur Implementierung den ersten Dateimodus.

Da das egg.js-Framework über ein integriertes Multipart-Plugin verfügt, kann es hochgeladene Daten vom Typ „Multipart/Formulardaten“ analysieren.

Schreiben Sie zunächst die mehrteilige Konfiguration in die Konfigurationsdatei config.default.js:

module.exports = (app) => {
 Konstantenkonfiguration = (Export = {});
 
 ...

 config.multipart = {
  Modus: "Datei",
  Dateigröße: „50 MB“,
 }
 ...

 zurückkehren {
  ...Konfiguration,
  ...Benutzerkonfiguration,
 };
};

Definieren Sie dann die Routen in router.js:

// Aufnahme senden router.post('/record', auth, controller.record.postRecord);

Definieren Sie die Datei record.js im Controller-Verzeichnis und schreiben Sie den folgenden Inhalt:
const Controller = require('egg').Controller;

Klasse RecordController erweitert Controller {
 asynchroner PostRecord() {
  const { ctx } = dies;
  const Datei = ctx.request.files[0];
  const { Datensatzname, Gedicht-ID, Kategorie } = ctx.request.body;
  
  const res = warte auf ctx.service.record.postRecord(Datei, Datensatzname, Gedicht-ID, Kategorie);

  ctx.body = res;
 }
}

module.exports = DatensatzController;

Definieren Sie record.js im Serviceverzeichnis und schreiben Sie die spezifische Implementierung:

const Service = erfordern('egg').Service;
Lassen Sie OSS = erfordern ('ali-oss');

lass aliInfo = {
 // https://help.aliyun.com/document_detail/31837.html
 Region: 'oss-cn-guangzhou',
 Eimer: 'Gedicht-Mini-Programm',
 accessKeyId: 'xxx', // Füllen Sie die accessKeyId von Alibaba Cloud aus
 accessKeySecret: 'xxx', // Füllen Sie Alibaba Clouds accessKeySecret aus
};

let client = neues OSS(aliInfo);

Klasse RecordService erweitert Service {
 async postRecord(Datei, Datensatzname, Gedicht-ID, Kategorie) {
  const url = warte auf dies.uploadOSS(Datei);
  warte auf Folgendes.updateRecord(URL, Datensatzname, Gedicht-ID, Kategorie);

  URL zurückgeben;
 }

 asynchroner UploadOSS(Datei) {
  const { ctx } = dies;

  lass resultieren;
  versuchen {
   // Dateien verarbeiten, beispielsweise in die Cloud hochladen result = await client.put(file.filename, file.filepath);
  Endlich
   // Temporäre Dateien müssen gelöscht werden. Warten Sie auf ctx.cleanupRequestFiles();
  }
  gib result.url zurück;
 }

 async updateRecord(url, Datensatzname, Gedicht-ID, Kategorie) {
  const { ctx } = dies;

  console.log('OpenID von ctx.locals abrufen');
  Konsole.log(ctx.locals.openid);
  const openid = ctx.locals.openid;

  // Benutzerinformationen in der Datenbank aufzeichnen const res = await ctx.model.Record.create({
   Datensatzname: Datensatzname,
   record_url: URL,
   Gedicht-ID: Gedicht-ID,
   Kategorie: Kategorie,
   OpenID: OpenID,
  });
 }
}
module.exports = Datensatzdienst;

Bitte beachten Sie:

  • Sie müssen ein Alibaba Cloud-Konto registrieren und einen neuen Bucket im Objektspeicher erstellen, um Audio zu speichern. Dies ist die Implementierung des Cloud-Speichers.
  • Sie müssen das Paket ali-ossnpm installieren, um eine Verbindung zu Alibaba Cloud Object Storage herzustellen. Nachdem die vom Front-End hochgeladene temporäre Datei empfangen wurde, lädt der Hintergrund das Audio in den Alibaba Cloud Object Storage (client.put) hoch.

Aufnahme abspielen

Aufmerksame Freunde bemerken möglicherweise, dass nach dem Hochladen der Aufnahme mithilfe der Taro.uploadFile-Schnittstelle die Funktion playAudio im Erfolgsrückruf aufgerufen wird, um das Audio abzuspielen. Lassen Sie uns als Nächstes darüber sprechen, wie das Audio abgespielt wird.

Verwenden Sie zunächst Taro.createInnerAudioContext, um das Audiokontextobjekt abzurufen:

const innerAudioText = Taro.createInnerAudioContext();

Registrieren Sie genau wie bei der Aufzeichnung ein Listener-Ereignis, wenn die Komponente bereitgestellt wird:

useEffect(() => {
  innerAudioText.onPlay(() => {
   console.log('Mit der Wiedergabe beginnen');
  });

  innerAudioText.onError((e) => {
   console.log('Wiedergabestörung');
   konsole.log(e);
  });
 }, []);

Nachdem die Aufnahmedatei erfolgreich hochgeladen wurde, rufen Sie die Methode playAudio auf, um die Aufnahme abzuspielen:

const playAudio = (URL) => {
 innerAudioText.autoplay = true;
 innerAudioText.src = URL;
};

Wenn src ein Wert zugewiesen wird, wird die Aufnahme abgespielt.

Zusammenfassen

Dies ist das Ende dieses Artikels über die Implementierung der Miniprogramm-Aufzeichnungsfunktion. Weitere relevante Inhalte zur Miniprogramm-Aufzeichnung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Miniprogramm zur Implementierung der Aufnahmefunktion
  • Aufzeichnungs- und Uploadfunktion des WeChat-Applets (mithilfe eines Knotens zum Parsen und Empfangen)
  • WeChat-Applet realisiert Aufnahmefunktion
  • Das Applet realisiert die Spracherkennung durch Drücken und Loslassen der Aufnahmetaste
  • Das Applet sammelt Aufzeichnungen und lädt sie in das Backend hoch
  • Das Miniprogramm implementiert die Funktion zum Hochladen von Aufnahmen
  • WeChat-Applet zum Erzielen eines Mikrofonanimationseffekts beim Aufzeichnen
  • Aufnahme- und Wiedergabefunktion des WeChat-Applets
  • Beispiel für die Audiowiedergabeanimation eines WeChat-Applet-Entwicklungsrecorders (echte Maschine verfügbar)
  • WeChat-Applet - Bilder, Aufnahmen, Audiowiedergabe, Musikwiedergabe, Videos, Dateien Codebeispiele

<<:  Führen Sie die Schritte zum Erstellen des NFS-Dateifreigabespeicherdienstes in CentOS 7 aus

>>:  So erlauben Sie allen Hosts den Zugriff auf MySQL

Artikel empfehlen

Einführung in die Stammverzeichniserweiterung unter Linux

1. Überprüfen Sie den Linux-Festplattenstatus df ...

Methode zum dynamischen Laden von Geojson basierend auf Vue+Openlayer

Laden eines oder mehrerer Features <Vorlage>...

Vier Möglichkeiten zum Erstellen von Objekten in JS

Inhaltsverzeichnis 1. Objekte durch Literalwert e...

Erfahrung im Webdesign

<br />Der Autor war früher ein Anfänger im W...

jQuery-Plugin zum Erzielen eines Code-Rain-Effekts

In diesem Artikel wird der spezifische Code des j...

Vue implementiert Tab-Tab-Umschaltung

In diesem Artikelbeispiel wird der spezifische Co...

Docker mountet lokale Verzeichnisse und Datenvolumen-Container-Operationen

1. Docker mountet das lokale Verzeichnis Docker k...

Detaillierte Erklärung des Übergangsattributs einer einfachen CSS-Animation

1. Verständnis der Übergangsattribute 1. Das Über...

So installieren Sie Grafana und fügen Influxdb-Überwachung unter Linux hinzu

Installieren Sie Grafana. Die offizielle Website ...

Webdesign-Tutorial (5): Visuelles Webdesign

<br />Vorheriger Artikel: Webdesign-Tutorial...

JavaScript-Grundlagen für Schleife und Array

Inhaltsverzeichnis Schleife - für Grundlegende Ve...