سوالات متداول صوتی وب

در چند ماه گذشته، WebKit Web Audio API به عنوان یک پلتفرم قانع کننده برای بازی ها و برنامه های صوتی در وب ظاهر شده است. همانطور که توسعه دهندگان خود را با آن آشنا می کنند، من سؤالات مشابهی را مکررا می شنوم. این به‌روزرسانی سریع تلاشی برای پاسخگویی به برخی از سؤالات متداول‌تر است تا تجربه شما با Web Audio API دلپذیرتر شود.

س: کمک، من نمی توانم صدا ایجاد کنم!

پاسخ: اگر با Web Audio API تازه کار هستید، نگاهی به آموزش شروع یا دستور اریک برای پخش صدا بر اساس تعامل کاربر بیندازید.

س. چند متن صوتی باید داشته باشم؟

پاسخ: به طور کلی، شما باید یک AudioContext در هر صفحه بگنجانید، و یک زمینه صوتی واحد می تواند بسیاری از گره های متصل به آن را پشتیبانی کند. اگرچه ممکن است چندین AudioContext را در یک صفحه قرار دهید، این می تواند منجر به موفقیت در عملکرد شود.

س: من یک AudioBufferSourceNode دارم که به تازگی آن را با noteOn() پخش کردم، و می خواهم دوباره آن را پخش کنم، اما noteOn() کاری انجام نمی دهد! کمک کنید

A: هنگامی که یک گره منبع به پایان رسید، نمی تواند بیشتر پخش شود. برای پخش مجدد بافر زیرین، باید یک AudioBufferSourceNode جدید ایجاد کنید و noteOn() را فراخوانی کنید.

اگرچه ایجاد مجدد گره منبع ممکن است ناکارآمد به نظر برسد، گره های منبع به شدت برای این الگو بهینه شده اند. بعلاوه، اگر یک دسته برای AudioBuffer نگه دارید، نیازی به درخواست دیگری از دارایی برای پخش مجدد همان صدا ندارید. اگر متوجه شدید که نیاز به تکرار این الگو دارید، پخش را با یک تابع کمکی ساده مانند playSound(buffer) کپسوله کنید.

س: هنگام پخش یک صدا، چرا باید هر بار یک گره منبع جدید ایجاد کنید؟

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

س: چگونه می توانم صدا را از برچسب های audio و video پردازش کنم؟

پاسخ: MediaElementAudioSourceNode در حال کار است! در صورت موجود بودن، تقریباً به صورت زیر کار می کند (افزودن یک افکت فیلتر به نمونه ای که از طریق برچسب صوتی پخش می شود):

<audio src="sounds/sample.wav" controls>
var audioElement = document.querySelector('audio');
var mediaSourceNode = context.createMediaElementSource(audioElement);
mediaSourceNode.connect(filter);
filter.connect(context.destination);

این ویژگی در این crbug ردیابی می شود. توجه داشته باشید که در این تنظیمات، نیازی به فراخوانی mediaSourceNode.noteOn() نیست، تگ صوتی پخش را کنترل می کند.

س: چه زمانی می توانم صدا را از میکروفون دریافت کنم؟

A: بخش ورودی صوتی این به عنوان بخشی از WebRTC با استفاده از getUserMedia پیاده سازی می شود و به عنوان یک گره منبع ویژه در Web Audio API در دسترس خواهد بود. این در ارتباط با createMediaElementSource کار خواهد کرد.

س: چگونه می توانم بررسی کنم که پخش AudioSourceNode به پایان رسیده است؟

پاسخ: در حال حاضر باید از تایمر جاوا اسکریپت استفاده کنید زیرا Web Audio API از این عملکرد پشتیبانی نمی کند. قطعه زیر از آموزش شروع به کار با Web Audio API نمونه ای از این عمل است:

// Assume source and buffer are previously defined.
source.noteOn(0);
var timer = setTimeout(function() {
    console.log('playback finished');
}, buffer.duration * 1000);

یک اشکال باز وجود دارد که باعث می‌شود Web Audio API پاسخگوی دقیق‌تری را اجرا کند.

س: بارگیری صداها باعث می شود که کل رشته رابط کاربری قفل شود و رابط کاربری من پاسخگو نباشد. کمک!**

A: از API decodeAudioData برای بارگیری ناهمزمان استفاده کنید تا از مسدود کردن رشته اصلی جلوگیری کنید. این مثال را ببینید.

س: آیا می توان از Web Audio API برای پردازش صداها سریعتر از زمان واقعی استفاده کرد؟

پاسخ: بله، راه حلی در حال کار است. لطفا در جریان باشید!

س: من یک برنامه Web Audio API عالی ساخته ام، اما هر زمان که برگه ای که در حال اجراست در پس زمینه می رود، صداها بسیار عجیب می شوند!

پاسخ: احتمالاً به این دلیل است که از setTimeouts استفاده می‌کنید که اگر صفحه پس‌زمینه باشد، رفتار متفاوتی دارد. در آینده، Web Audio API می‌تواند در زمان‌های خاص با استفاده از تایمر داخلی صدای وب (ویژگی context.currentTime ) تماس بگیرد. برای اطلاعات بیشتر، لطفاً این درخواست ویژگی را ببینید.

به طور کلی، ممکن است ایده خوبی باشد که وقتی برنامه شما به پس‌زمینه می‌رود، پخش را متوقف کنید. با استفاده از صفحه Visibility API می‌توانید تشخیص دهید که صفحه‌ای به پس‌زمینه می‌رود.

س: چگونه می توانم زیر و بم صدا را با استفاده از Web Audio API تغییر دهم؟

A: playbackRate را در گره منبع تغییر دهید.

س: آیا می توانم بدون تغییر سرعت، زمین را تغییر دهم؟

پاسخ: Web Audio API می‌تواند یک PitchNode در زمینه صوتی داشته باشد، اما پیاده‌سازی آن سخت است. این به این دلیل است که هیچ الگوریتم ساده ای برای تغییر زمین در جامعه صوتی وجود ندارد. تکنیک های شناخته شده، مصنوعات را ایجاد می کنند، به ویژه در مواردی که جابجایی زمین زیاد است. دو نوع رویکرد برای مقابله با این مشکل وجود دارد:

  • الگوریتم‌های حوزه زمان، که باعث تکرار مکرر آرتیفکت‌های پژواک بخش می‌شوند.
  • تکنیک های حوزه فرکانس، که باعث ایجاد مصنوعات صوتی طنین انداز می شوند.

اگرچه هیچ گره بومی برای انجام این تکنیک ها وجود ندارد، می توانید آن را با JavaScriptAudioNode انجام دهید. این قطعه کد ممکن است به عنوان نقطه شروع عمل کند.

س: چگونه می توانم یک AudioContext با نرخ نمونه انتخابی خود ایجاد کنم؟

پاسخ: در حال حاضر هیچ پشتیبانی برای این وجود ندارد، اما ما در حال بررسی آن هستیم. این درخواست ویژگی را ببینید.

اگر سؤالات دیگری دارید، با استفاده از تگ web-audio از آنها در StackOverflow بپرسید.