برای چسباندن دو WAV، همهٔ بایتهای دو فایل را پشت سر هم کپی نکنید؛ هر فایل سرآیند خودش را دارد. باید مشخصات صوت سازگار باشد، دادهٔ فریمها به ترتیب مطلوب کنار هم قرار گیرد و یک ظرف خروجی تازه ساخته شود. کد این صفحه این کار را برای PCM16 کوچک در حافظه انجام میدهد؛ میکس، همپوشانی یا تغییر نرخ نیست.
چه چیزهایی باید یکسان باشند؟
در قراردادِ این تمرین، تعداد کانال، عرض نمونه، نرخ نمونه و نوع فشردهسازی باید برابر باشند. فقط PCM صحیح۱۶بیتیِ فشردهنشده با یک یا دو کانال پذیرفته میشود. یکسانبودن پسوند WAV کافی نیست. اگر یک قطعه۸۰۰۰هرتز و دیگری۱۶۰۰۰هرتز است، تابع آنها را رد میکند؛ سرآیند دومی را بدون بازنمونهبرداری به اولی شبیه نمیکند.
مثال هفت نمونه، نه مکالمهٔ واقعی
قطعهٔ اول [۱۰۰،−۱۰۰،۰،۵۰] و قطعهٔ دوم [−۵۰،۰،۲۰۰] است. هر دو تککاناله و۸۰۰۰هرتزند. دو WAV واقعاً در حافظه ساخته و بازخوانی میشوند؛ خروجی هفت فریم و مدت۷÷۸۰۰۰یعنی۰٫۰۰۰۸۷۵ثانیه دارد. این سیگنال کوتاه، گفتار، نمونهٔ کیفیت شنیداری یا فایل قابل نمایش مشتری نیست.
کد بازخوانی میکند که هفت مقدار خروجی دقیقاً به همان ترتیب باشند. پس تعداد فریم و ترتیب هر دو کنترل شدهاند؛ برابرشدن طول بهتنهایی کافی نیست. با جابهجاکردن ترتیب دو ورودی، خروجی واقعاً تغییر میکند. تابع فهرست را خودکار بر اساس نام فایل مرتب نمیکند؛ ترتیبِ دریافتشده قرارداد اتصال است.
چرا کنترل طولِ داده لازم است؟
تعداد فریمِ اعلامشده در سرآیند ممکن است با دادهٔ در دسترس جور نباشد. در هر قطعه، طول payload با تعداد فریم ضرب در کانال و بایتِ نمونه تطبیق داده میشود؛ قطعهٔ ناقص پذیرفته نمیشود. چون getnframes تعداد را به فریمِ کامل گرد میکند، کد عمداً یک فریم بیش از آن میخواند تا بایتِ باقیماندهٔ فریمِ ناقص هم دیده و رد شود؛ خواندن فقط nفریم میتواند آن باقیمانده را پنهان کند. آزمونها واقعاً ورودی خالی، نرخ متفاوت، کانال متفاوت، عرض۸بیتی ، حذفِ یک بایت از انتها و دو data chunk با طولِ نامضربِ فریم در تککانال و استریو را رد کردهاند؛ جمعاً هفت حالتِ رد آزموده شده است.
فایل اصلی فقط در حافظهٔ تمرین ساخته میشود و تابع هیچ مسیر فایل را جایگزین نمیکند. برای نشاندادن سازوکار، سقف محلیِ یک میلیون بایت برای هر قطعه گذاشتهایم؛ این کد برای اتصال صدها فایل بزرگ یا پردازش عملیاتی آماده نشده و همهٔ داده را در حافظه نگه میدارد. سقف نمونه، محدودیت سرویس اپرا نیست.
اتصال دقیق، مرز شنیداری خوب را تضمین نمیکند
دو سیگنال میتوانند مشخصات برابر داشته باشند اما در محل اتصال پرش دامنه، سکوت ناخواسته یا بریدگیِ واژه ایجاد کنند. این کد crossfade، تنظیم بلندی، حذف سکوت یا ترمیم انجام نمیدهد. روی فایل واقعی، دو سوی مرز را با نسخهٔ مجاز گوش دهید؛ آزمون بایت را با آزمون شنیداری یکی نگیرید. ما در این تمرین صوت پخش نکردهایم.
اگر زمانهای قطعهٔ دوم محلیاند، مبدأ تازهٔ آن پس از طول دقیقِ قطعهٔ اول است؛ اما افزودن همپوشانی یا تغییر سرعت، این نگاشت ساده را عوض میکند. زمان متن و زیرنویس باید با ترتیب و نسخهٔ تازه تطبیق داده شود. تقسیم WAV و دفتر زمان قطعهها عملیات برش را توضیح میدهد؛ اینجا پذیرش یا ردِ اتصال چند منبع و ترتیب خروجی را اجرا میکنیم.
چه چیزی کپی نمیشود؟
خروجی سرآیند تازه و PCM دارد؛ متادیتای جانبی و نشانگرهای تدوینِ ورودیها حفظ نشدهاند. آن را نسخهٔ آرشیویِ عیناً برابرِ همهٔ فایلها ننامید. برای بررسی مشخصاتِ قبل از کار، بازرسی محلی WAV را ببینید.
برای دریافت متن از چند فایل در اپرانگار ابتدا دربارهٔ نیاز به اتصال، حفظِ جداگانهٔ شناسهها و زمانهای خروجی با تیم هماهنگ کنید. یکیکردن فایلها همیشه برای پیادهسازی لازم نیست؛ قرارداد تحویل، تصمیم را مشخص میکند.
فایل تمرین و منبع
اتصال واقعیِ WAVهای کوچک در حافظه با کنترل سازگاری · ترتیب صریحِ دو قطعه و هفت نمونهٔ خروجی مورد انتظار
منابع در ۳ نوامبر ۲۰۲۶ خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.