Skip to content

AudioRecorder

صدای میکروفون را در یک Blob ضبط می‌کند و در همان حال، به‌جای اینکه صرفاً MediaRecorder را بپیچد، از یک اشکال واقعی مرورگر می‌گذرد.

کروم (و مرورگرهای کرومیوم‌بنیاد) فایل‌های WEBMِ برآمده از MediaRecorder را بدون فرادادهٔ مدت می‌نویسد: فایل پخش می‌شود، اما تا وقتی کل blob یک بار رمزگشایی نشود، نه می‌توان در آن جابه‌جا شد و نه مدتش را نشان داد. AudioRecorder میکروفون را می‌خواهد، ضبط می‌کند و هنگام stop() میدان مدت را در ظرف WEBM همان‌جا وصله می‌زند و سپس Blob را پس می‌دهد؛ پس ضبط از همان آغاز مانند یک فایل صوتی معمولی رفتار می‌کند.

ضبط بایت‌ها و بازشناسی گفتار دو کار جدا هستند. اگر آنچه واقعاً می‌خواهید رونوشت گفتار است و نه فایل صوتی، createSpeechRecognizer را ببینید.

کاربرد

ts
import { AudioRecorder } from 'ranuts/utils';

const recorder = new AudioRecorder(); // بی‌درنگ اجازهٔ میکروفون را می‌خواهد

startButton.addEventListener('click', () => recorder.start());
pauseButton.addEventListener('click', () => recorder.pause());

stopButton.addEventListener('click', () => {
  const blob = recorder.stop();
  if (blob) audioEl.src = URL.createObjectURL(blob);
});

API

new AudioRecorder()

همین که ساخته شود getUserMedia({ audio: true }) را می‌خواهد و به‌محض صدور اجازه ضبط را آغاز می‌کند. گام جداگانه‌ای برای «آماده‌سازی» نیست: ساختن، خودش همان درخواست اجازه است.

start()

اگر با pause() نگه داشته شده بود، ضبط را از سر می‌گیرد. MediaRecorderِ زیرین را برمی‌گرداند، و تا وقتی جریان میکروفون آماده نباشد undefined.

pause()

ضبطِ در جریان را نگه می‌دارد. MediaRecorderِ زیرین را برمی‌گرداند، وگرنه undefined.

stop()

ضبط را متوقف می‌کند و Blobِ ضبط‌شده را همگام برمی‌گرداند، آن هم پیش از آنکه اصلاح ظرف (fixDuration) واقعاً اجرا شده باشد. وصله زدن مدت به کل بافر نیاز دارد و آن تنها پس از شلیک رویداد stop در MediaRecorderِ زیرین فراهم است. در عمل، این تنها آنگاه اهمیت دارد که مقدار بازگشتی recorder.stop() را دقیقاً در همان لحظه بخوانید و نه اندکی بعد؛ منتظر ماندن برای ریزوظیفهٔ بعدی، یا خواندن recorder.blob پس از آنکه توالی dataavailable و stop ته‌نشین شد، ترتیب امن است.

یادداشت‌ها

  1. یک ضبط‌کننده، یک جریان. نه destroy() هست و نه برچیدنی؛ همین که اجازه صادر شود، شیار میکروفون تا پایان عمر مؤلفه باز می‌ماند. برای هر ضبط یک AudioRecorder تازه نسازید؛ یکی را نگه دارید و start() و stop() را صدا بزنید.
  2. اجازه هنگام ساختن خواسته می‌شود، نه در start(). اگر می‌خواهید پرسش اجازهٔ مرورگر تا وقتی کاربر واقعاً روی ضبط بزند به تعویق بیفتد، ساختنِ خودِ AudioRecorder را به تعویق بیندازید، نه فقط فراخوانی start() را.
  3. اصلاح مدت تنها به audio/webm دست می‌زند. دیگر نوع‌های MIME که مرورگر ممکن است برگزیند (audio/mp4، audio/ogg، audio/wav، audio/aac) همان‌طور برمی‌گردند.
  4. خطاهای حین getUserMedia (اجازهٔ ردشده، نبودِ میکروفون) به‌جای پرتاب شدن یا رسیدن از راه فراخوان، در کنسول ثبت می‌شوند. به‌جای تکیه بر این کلاس برای گزارش ردِ اجازه، در رابط کاربری خودتان وارسی کنید که پرسش MediaDevices واقعاً پدیدار می‌شود یا نه.

منتشرشده تحت مجوز MIT.