نحوه ذخیره و پخش صدا در برنامه React Native Expo

آموزش تصویری
آیا علاقه مند به افزودن قابلیت ضبط و پخش صدا به برنامه React Native Expo خود هستید؟ با افزایش برنامههای مبتنی بر صدا و محبوبیت پادکستها، افزودن قابلیتهای صوتی به برنامه شما میتواند تجربه کاربر را بهبود بخشد و فرصتهای جدیدی برای تعامل فراهم کند. در این آموزش، مراحل ضبط و پخش صدا در برنامه React Native Expo را به صورت گام به گام راهنمایی می کنیم. چه در حال ساخت یک برنامه یادگیری زبان، یک پخش کننده موسیقی یا یک پلتفرم پادکست باشید، این آموزش مهارت هایی را که برای افزودن عملکرد صوتی به برنامه خود نیاز دارید، در اختیار شما قرار می دهد. پس بیایید شروع کنیم!
فراموش نکنید که قبل از ورود به کانال، لایک، نظر و عضویت در کانال را داشته باشید!
مرحله 1-) یک برنامه Expo را راه اندازی کنید
مطمئن شوید که Node.js و npm را روی دستگاه خود نصب کرده اید. می توانید آنها را از وب سایت رسمی دانلود کنید: https://nodejs.org/en/download/.
ترمینال یا خط فرمان خود را باز کنید و دستور زیر را اجرا کنید تا Expo CLI را به صورت سراسری نصب کنید:
npm نصب -g expo-cli
پس از اتمام نصب، به دایرکتوری که می خواهید برنامه خود را ایجاد کنید بروید و دستور زیر را اجرا کنید:
expo init my-new-app
نام برنامه خود را جایگزین my-new-app کنید. این دستور یک دایرکتوری جدید با همان نام برنامه شما ایجاد می کند و یک پروژه Expo جدید را در داخل آن مقداردهی اولیه می کند.
از لیست گزینه های موجود، یک الگو برای برنامه خود انتخاب کنید. میتوانید یک الگوی خالی انتخاب کنید یا یکی از الگوهای از پیش پیکربندیشدهای را انتخاب کنید که شامل ویژگیهای رایجی مانند پیمایش، تأیید اعتبار و غیره است.
پس از انتخاب یک الگو، 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,
},
});
در useEffect ما به سادگی اطمینان میدهیم که مجوز ضبط را از کاربر داریم، برای انجام این کار از کتابخانه صوتی استفاده میکنیم. ما همچنین هر گونه ضبط موجود را در تابع بازگشت useEffect پاک می کنیم.
startRecording()
ما از این تابع برای شروع دریافت صدا از کاربر استفاده می کنیم.
ما به setAudioModeAsync() نیاز داریم تا بتوانیم در IOS ضبط کنیم
ما یک شیء صوتی را مقداردهی اولیه می کنیم، همه را در این تابع آماده می کنیم و شروع به ضبط می کنیم
stopRecording()
این عملکرد به سادگی برای متوقف کردن، ذخیره و پخش ضبط برای کاربر استفاده می شود
ما از کتابخانه FileSystem برای انتقال URI ضبط شده به سیستم فایل استفاده می کنیم و یک Object Playback را برای پخش خود صدا مقداردهی اولیه می کنیم.
handleRecordButtonPress()
این عملکرد به سادگی یک ضبط را بر اساس وضعیت ضبط شروع یا متوقف می کند.
بقیه فایل App.js html و استایل است که می توانید آن را کپی کنید یا سبک خود را بسازید!
**توجه داشته باشید که کتابخانه نمایشگاه ممکن است با شبیه ساز دارای اشکال باشد، بنابراین گاهی اوقات ممکن است لازم باشد آن را ببندید و دوباره باز کنید تا کار کند. مطمئن شوید که صدا را در شبیه ساز نیز افزایش داده اید.
نتیجه:
اگر این مطالب را مفید دیدید حتما کانال را دنبال کنید. در صورت داشتن هرگونه سوال در زیر به من اطلاع دهید. با تشکر!