Skip to content

麦克风

免费插件

此插件免费开源,采用 MIT 许可证。

概述

Microphone API 提供对设备麦克风的访问以录制音频。它提供流式接口用于启动和管理录音,使用唯一标识符跟踪录音,并响应完成事件。

安装

shell
composer require nativephp/mobile-microphone

使用

PHP (Livewire/Blade)

php
use Native\Mobile\Facades\Microphone;

// 开始录音
Microphone::record()->start();

// 停止录音
Microphone::stop();

// 暂停录音
Microphone::pause();

// 恢复录音
Microphone::resume();

// 获取状态
$status = Microphone::getStatus();
// 返回: "idle"、"recording" 或 "paused"

// 获取上次录音路径
$path = Microphone::getRecording();

JavaScript (Vue/React/Inertia)

js
import { microphone, on, off, Events } from '#nativephp';

// 基本录音
await microphone.record();

// 带有用于跟踪的标识符
await microphone.record()
    .id('voice-memo');

// 停止录音
await microphone.stop();

// 暂停/恢复
await microphone.pause();
await microphone.resume();

// 获取状态
const result = await microphone.getStatus();
if (result.status === 'recording') {
    // 正在录音
}

// 获取上次录音
const result = await microphone.getRecording();
if (result.path) {
    // 处理录音
}

PendingMicrophone API

id(string $id)

为此录音设置唯一标识符。

php
Microphone::record()
    ->id('voice-note-123')
    ->start();

event(string $eventClass)

设置录音完成时要分发的自定义事件类。

php
use App\Events\VoiceMessageRecorded;

Microphone::record()
    ->event(VoiceMessageRecorded::class)
    ->start();

remember()

将录音器的 ID 存储在会话中以便稍后检索。

php
Microphone::record()
    ->id('voice-note')
    ->remember()
    ->start();

start()

显式开始音频录制。如果录音成功开始则返回 true

事件

MicrophoneRecorded

当录音成功完成时触发。

Payload:

  • string $path - 录制音频的文件路径
  • string $mimeType - 音频 MIME 类型(默认:'audio/m4a'
  • ?string $id - 如果通过 id() 方法设置,则为可选标识符
php
use Native\Mobile\Attributes\OnNative;
use Native\Mobile\Events\Microphone\MicrophoneRecorded;

#[OnNative(MicrophoneRecorded::class)]
public function handleAudioRecorded(string $path, string $mimeType, ?string $id = null)
{
    // 处理录制的音频
    $this->processAudio($path);
}
js
import { on, off, Events } from '#nativephp';
import { ref, onMounted, onUnmounted } from 'vue';

const recordings = ref([]);

const handleAudioRecorded = (payload) => {
    const { path, mimeType, id } = payload;
    recordings.value.push({ path, mimeType, id });
};

onMounted(() => {
    on(Events.Microphone.MicrophoneRecorded, handleAudioRecorded);
});

onUnmounted(() => {
    off(Events.Microphone.MicrophoneRecorded, handleAudioRecorded);
});
jsx
import { on, off, Events } from '#nativephp';
import { useState, useEffect } from 'react';

const [recordings, setRecordings] = useState([]);

const handleAudioRecorded = (payload) => {
    const { path, mimeType, id } = payload;
    setRecordings(prev => [...prev, { path, mimeType, id }]);
};

useEffect(() => {
    on(Events.Microphone.MicrophoneRecorded, handleAudioRecorded);

    return () => {
        off(Events.Microphone.MicrophoneRecorded, handleAudioRecorded);
    };
}, []);

注意事项

  • 麦克风权限: 应用首次请求麦克风访问时,用户会收到权限提示。如果被拒绝,录音功能将静默失败。
  • 后台录音: 你可以通过在配置中将 microphone_background 设置为 true 来允许应用在设备锁定时录制音频。
  • 文件格式: 录音以 M4A/AAC 音频文件(.m4a)存储。此格式在保持质量的同时优化了文件大小。
  • 录音状态: 同一时间只能有一个活动的录音。在录音进行中调用 start() 将返回 false
  • 自动启动行为: 如果不显式调用 start(),录音将在 PendingMicrophone 被销毁时自动开始。

基于 NativePHP 官方文档翻译