طی چند ماه گذشته، میانای برنامهسازی کاربردی Web Audio در WebKit بهعنوان پلاتفرمی جذاب برای بازیها و برنامههای صوتی در وب ظهور کرده است. همانطور که توسعهدهندگان با آن آشنا میشوند، میشنوم که سؤالات مشابهی بارها و بارها مطرح میشود. این بهروزرسانی سریع تلاشی است برای پاسخ دادن به برخیاز سؤالات متداولتر تا تجربه شما با Web Audio API لذتبخشتر شود.
پرسش: کمک، نمیتوانم صدا تولید کنم!
پاسخ: اگر با Web Audio API آشنایی ندارید، به آموزش گامبهگام شروع به کار یا دستورالعمل Eric برای پخش صدا براساس تعامل کاربر نگاهی بیندازید.
س. چند «زمینه صوتی» باید داشته باشم؟
پاسخ: بهطورکلی، باید در هر صفحه یک AudioContext قرار دهید و یک بافت صوتی واحد میتواند از گرههای زیادی که به آن متصل هستند پشتیبانی کند. اگرچه میتوانید چندین AudioContext را در یک صفحه بگنجانید، این کار میتواند منجر به کاهش عملکرد شود.
پرسش: من یک AudioBufferSourceNode دارم که آن را با noteOn() پخش کردهام و میخواهم دوباره آن را پخش کنم، اما noteOn() هیچ کاری انجام نمیدهد! راهنمایی!
پاسخ: وقتی یک گره منبع پخش را تمام کرد، دیگر نمیتواند پخش کند. برای پخش مجدد بافر زیرین، باید 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() نیست، برچسب صوتی بازپخش را کنترل میکند.
پرسش: چه زمانی میتوانم از «میکروفون» صدا دریافت کنم؟
پاسخ: بخش ورودی صوتی این ویژگی بهعنوان بخشی از 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 وجود دارد تا تماس برگشتی دقیقتری ایجاد کند.
پرسش: بار کردن صداها باعث میشود کل رشته واسط کاربر قفل شود و واسط کاربر من پاسخگو نباشد. کمک!**
الف: از «میانای برنامهسازی کاربردی» decodeAudioData برای بار کردن ناهمزمان استفاده کنید تا از مسدود شدن رشته اصلی جلوگیری کنید. این مثال را ببینید.
پرسش: آیا میتوان از Web Audio API برای پردازش صداها سریعتر از زمان واقعی استفاده کرد؟
پاسخ: بله، درحال کار روی راهحلی هستیم. لطفاً با ما همراه باشید!
پرسش: برنامه Web Audio API فوقالعادهای ساختهام، اما هربار برگهای که در آن اجرا میشود به پسزمینه میرود، صداها عجیبوغریب میشوند!
پاسخ: احتمالاً به این دلیل است که از setTimeouts استفاده میکنید که اگر صفحه در پسزمینه باشد، عملکرد متفاوتی دارد. در آینده، «میانای برنامهسازی کاربردی Web Audio» میتواند بااستفاده از زمانسنج داخلی صدای وب (ویژگی context.currentTime) در زمانهای مشخصی تماس برگشتی برقرار کند. برای اطلاعات بیشتر، لطفاً این درخواست ویژگی را ببینید.
بهطورکلی، بهتر است وقتی برنامه شما به پسزمینه میرود، پخش را متوقف کنید. بااستفاده از Page Visibility API میتوانید تشخیص دهید که صفحه چه زمانی به پسزمینه میرود.
س: چگونه میتوانم زیروبمی صدا را بااستفاده از Web Audio API تغییر دهم؟
الف: playbackRate را در گره منبع تغییر دهید.
س: آیا میتوانم زیروبم را بدون تغییر سرعت تغییر دهم؟
پاسخ: «میانای برنامهسازی کاربردی Web Audio» میتواند در بافتار صوتی «گره زیروبمی» داشته باشد، اما پیادهسازی آن دشوار است. دلیل این امر این است که هیچ الگوریتم تغییر زیروبم سادهای در انجمن صوتی وجود ندارد. تکنیکهای شناختهشده مصنوعات ایجاد میکنند، بهویژه در مواردی که تغییر زیروبم زیاد باشد. دو نوع رویکرد برای مقابله با این مشکل وجود دارد:
- الگوریتمهای حوزه زمان که باعث ایجاد مصنوعات پژواکهای بخش تکراری میشوند.
- تکنیکهای حوزه فرکانس که باعث ایجاد مصنوعات صدای طنیندار میشوند.
اگرچه هیچ گره بومی برای انجام این تکنیکها وجود ندارد، میتوانید آن را با JavaScriptAudioNode انجام دهید. این تکهکد میتواند بهعنوان نقطه شروعی عمل کند.
پرسش: چگونه میتوانم یک AudioContext با نرخ نمونه انتخابی خودم ایجاد کنم؟
پاسخ: درحالحاضر از این قابلیت پشتیبانی نمیشود، اما درحال بررسی آن هستیم. این درخواست ویژگی را ببینید.
اگر سؤالات بیشتری دارید، میتوانید آنها را در StackOverflow بااستفاده از برچسب web-audio بپرسید.