如何在React Native Expo应用中保存和播放音频
#javascript #网络开发人员 #reactnative #expo

Video Tutorial
您是否有兴趣将录音和播放功能添加到React Native Expo应用程序中?随着基于音频的应用程序的兴起和播客的普及,在您的应用程序中添加音频功能可以增强用户体验并为参与提供新的机会。在本教程中,我们将指导您逐步录制和播放音频的过程。无论您是构建语言学习应用程序,音乐播放器还是播客平台,本教程都将为您提供为应用程序添加音频功能所需的技能。所以让我们开始吧!

在进入频道之前,不要忘记喜欢,评论并订阅频道!

步骤1-)初始化博览会应用
确保在计算机上安装了NODE.JS和NPM。您可以从官方网站下载它们:https://nodejs.org/en/download/

打开终端或命令提示

npm安装-G expo -cli

安装完成后,导航到要创建应用的目录并运行以下命令:

博览会init my-new-app

用应用程序的名称替换my-new-app。此命令将创建一个与您的应用程序相同名称的新目录,并在其中初始化一个新的博览会项目。

从可用选项列表中选择应用程序的模板。您可以选择一个空白模板,也可以从包括导航,身份验证等常见功能的预配置模板之一中进行选择。

选择了模板后,Expo将安装所有必要的依赖项并设置您的应用程序。这可能需要几分钟,具体取决于您的互联网连接。

步骤2-)将以下代码添加到您的组件:

import { Text, TouchableOpacity, View, StyleSheet } from 'react-native';
import React, { useState, useEffect } from 'react';
import { Audio } from 'expo-av';
import * as FileSystem from 'expo-file-system';
import { FontAwesome } from '@expo/vector-icons';

export default function App() {

  const [recording, setRecording] = useState(null);
  const [recordingStatus, setRecordingStatus] = useState('idle');
  const [audioPermission, setAudioPermission] = useState(null);

  useEffect(() => {

    // Simply get recording permission upon first render
    async function getPermission() {
      await Audio.requestPermissionsAsync().then((permission) => {
        console.log('Permission Granted: ' + permission.granted);
        setAudioPermission(permission.granted)
      }).catch(error => {
        console.log(error);
      });
    }

    // Call function to get permission
    getPermission()
    // Cleanup upon first render
    return () => {
      if (recording) {
        stopRecording();
      }
    };
  }, []);

  async function startRecording() {
    try {
      // needed for IoS
      if (audioPermission) {
        await Audio.setAudioModeAsync({
          allowsRecordingIOS: true,
          playsInSilentModeIOS: true
        })
      }

      const newRecording = new Audio.Recording();
      console.log('Starting Recording')
      await newRecording.prepareToRecordAsync(Audio.RECORDING_OPTIONS_PRESET_HIGH_QUALITY);
      await newRecording.startAsync();
      setRecording(newRecording);
      setRecordingStatus('recording');

    } catch (error) {
      console.error('Failed to start recording', error);
    }
  }

  async function stopRecording() {
    try {

      if (recordingStatus === 'recording') {
        console.log('Stopping Recording')
        await recording.stopAndUnloadAsync();
        const recordingUri = recording.getURI();

        // Create a file name for the recording
        const fileName = `recording-${Date.now()}.caf`;

        // Move the recording to the new directory with the new file name
        await FileSystem.makeDirectoryAsync(FileSystem.documentDirectory + 'recordings/', { intermediates: true });
        await FileSystem.moveAsync({
          from: recordingUri,
          to: FileSystem.documentDirectory + 'recordings/' + `${fileName}`
        });

        // This is for simply playing the sound back
        const playbackObject = new Audio.Sound();
        await playbackObject.loadAsync({ uri: FileSystem.documentDirectory + 'recordings/' + `${fileName}` });
        await playbackObject.playAsync();

        // resert our states to record again
        setRecording(null);
        setRecordingStatus('stopped');
      }

    } catch (error) {
      console.error('Failed to stop recording', error);
    }
  }

  async function handleRecordButtonPress() {
    if (recording) {
      const audioUri = await stopRecording(recording);
      if (audioUri) {
        console.log('Saved audio file to', savedUri);
      }
    } else {
      await startRecording();
    }
  }

  return (
    <View style={styles.container}>
      <TouchableOpacity style={styles.button} onPress={handleRecordButtonPress}>
        <FontAwesome name={recording ? 'stop-circle' : 'circle'} size={64} color="white" />
      </TouchableOpacity>
      <Text style={styles.recordingStatusText}>{`Recording status: ${recordingStatus}`}</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  button: {
    alignItems: 'center',
    justifyContent: 'center',
    width: 128,
    height: 128,
    borderRadius: 64,
    backgroundColor: 'red',
  },
  recordingStatusText: {
    marginTop: 16,
  },
});

在使用效果中,我们只是确保我们获得了用户的录制许可,我们使用音频库来做到这一点。我们还清理了使用效果的返回功能中的任何现有记录。

StarTrecording()

我们使用此功能开始从用户获取音频。

我们需要setaudiomodeasync()才能在iOS上记录

我们初始化音频对象,准备并开始在此功能中录制所有内容

stopRecording()

此功能用于简单地停止,保存和播放录音

我们使用文件系统库将录制URI移至文件系统,然后初始化一个播放对象以播放音频本身

handlerecordbuttonpress()

此功能只是根据记录的状态启动或停止录制。

app.js文件的其余部分是html和样式,您可以复制或创建自己的样式!

**请注意,Expo库可以使用模拟器故障,因此有时您可能需要关闭并重新打开它才能工作。确保您在模拟器中也会调整音量。

结论:
如果您发现此内容有用,请务必遵循频道。让我知道您是否有任何疑问。谢谢!