یک فایل WAV را بدون بازرمزگذاری برش دهید
یک بازهٔ زمانی را از یک WAV از نوع PCM یا IEEE-float میبُرد و آن را بدون رمزگشایی، نمونهبرداری مجدد یا بازرمزگذاری صدا بهصورت یک WAV جدید مینویسد. هر بایت نمونهٔ نگهداشتهشده بدون تغییر میماند و فایل هرگز از این برگهٔ مرورگر خارج نمیشود.
WAV از نوع PCM یا IEEE-float، از جمله RF64 و WAVE_FORMAT_EXTENSIBLE. فایل در همین برگه میماند.
چگونگی کار
این ابزار چه چیزی را محاسبه میکند
یک WAV فهرستی از ثانیهها را که بتوان بهسادگی حذف کرد ذخیره نمیکند. دنبالهای از فریمهای نمونه را ذخیره میکند: در هر تیکِ نرخ نمونهبرداری، یک نمونه برای هر کانال. بنابراین یک فایل استریوی ۲۴ بیتی در هر فریم شش بایت دارد — سه بایت برای نمونهٔ چپ و سه بایت برای نمونهٔ راست — و یک برش امن باید بین گروههای کامل ششبایتی آغاز و پایان یابد.
این ابزار دو زمان را به آن مرزهای فریم تبدیل میکند، گروههای انتخابشده را بدون تغییر کپی میکند و اندازههایی را که یک سرآیند WAV جدید نیاز دارد مینویسد. این همان تفاوت مهم میان برش و تبدیل صوتی است: هیچ نمونهای هرگز بهعنوان صدا تفسیر نمیشود، بنابراین چیزی برای کوانتیزه کردن، نمونهبرداری مجدد یا فشردهسازی وجود ندارد.
روش
دوازده بایت اول، کانتینر را مشخص میکنند. RIFF یعنی WAV معمولی لیتلاندین؛ RF64 یعنی همان ساختار چانک با طولهای ۶۴ بیتی در یک چانک ds64؛ پس از هر دو باید WAVE بیاید. RIFX هر مقدار چندبایتی را وارونه میکند و عمداً رد میشود. نوشتن بایتهای نمونهٔ آن در یک فایل لیتلاندین جدید بدون تبدیل، صدای معتبر را به نویز تبدیل میکند.
پس از آن، فهرستی تخت از چانکها میآید. هرکدام یک نام چهارنویسهای، یک طول بار دادهٔ ۳۲ بیتی، خود بار داده و — وقتی آن طول فرد باشد — یک بایت همترازی دارد. دو چانک هرچه در اینجا لازم است فراهم میکنند:
fmtمیگوید هر فریم چقدر پهن است و در هر ثانیه چند فریم پخش میشود.dataخودِ دنبالهٔ فریمها است.
برای PCM ساده یا IEEE float، عرض فریم ثابت است:
بایت در هر نمونه = بیت در هر نمونه / 8
بایت در هر فریم = کانالها × بایت در هر نمونه
کل فریمها = بایتهای data / بایت در هر فریم
فریم آغاز = round(ثانیهٔ آغاز × نرخ نمونهبرداری)
فریم پایان = min(کل فریمها، round(ثانیهٔ پایان × نرخ نمونهبرداری))
فریمهای نگهداشتهشده = فریم پایان − فریم آغاز
بایتهای نگهداشتهشده = فریمهای نگهداشتهشده × بایت در هر فریم
فیلد blockAlign سرآیند پیش از هر کپی با آن عرض فریم مقایسه میشود. اگر با هم نخوانند، انتخاب هرکدام از دو رقم حدسی دربارهٔ جای پایان یک فریم و آغاز فریم بعدی خواهد بود، بنابراین فایل رد میشود و دو رقم متناقض نام برده میشوند. همین قاعده چانک data را که به نیم فریم ختم میشود رد میکند.
سپس خروجی از یک سرآیند RIFF دوازدهبایتی، بار دادهٔ اصلی fmt ، یک شمارش فریم fact چهاربایتی برای صدای float، و یک چانک data جدید سرهم میشود. بازهٔ دادهٔ انتخابشده در قطعههای ۴ مگابایتی کپی میشود تا یک فایل بزرگ بتواند پیشرفت واقعی را گزارش کند و میان قطعهها به لغو پاسخ دهد. بازهٔ کپیشده هرگز رمزگشایی نمیشود؛ یک آزمون آن را مستقیماً با همان بازهٔ بایتی در منبع مقایسه میکند.
فراداده منتقل نمیشود. این فقط یک پیشفرض حریم خصوصی نیست. یک نشانه (cue) در فریم ۹۶٬۰۰۰ در یک منبع ۴۸ کیلوهرتزی به دو ثانیه پس از آغاز تعلق دارد، اما پس از حذف ثانیهٔ اول باید در فریم ۴۸٬۰۰۰ باشد. کپی کردن چانک cue قدیمی نشانگری معتبرنما در جای نادرست میسازد. نقاط حلقه، ناحیهها و مهرهای زمانی Broadcast Wave همین مشکل را دارند، بنابراین یک کانتینر پاک تنها پاسخی است که بیسروصدا دروغ نمیگوید.
پیش از ادامهٔ مطلب
یک WAV استریوی ۲۴ بیتی با نرخ ۴۸ کیلوهرتز از ۱٫۰۰۰ ثانیه تا ۱٫۰۰۱ ثانیه برش داده میشود. چند بایت صوتی نگه داشته میشود؟
این بازه ۴۸ فریم نمونه دارد. هر فریم یک نمونهٔ سهبایتی چپ و یک نمونهٔ سهبایتی راست دارد، بنابراین عرض آن شش بایت است و صدای نگهداشتهشده ۴۸ × ۶ = ۲۸۸ بایت میشود. همین عرض فریم، نه تعداد ظاهری میلیثانیهها، چیزی است که یک مرز بایتی را امن میکند. سرآیند جداگانه است؛ ۲۸۸ فقط بار دادهٔ صوتیِ بدون تغییر است.
یک نمونه کار شده
آزمون واحد از یک WAV مونوی ۸ بیتی PCM عمداً کوچک استفاده میکند تا بتوان حساب هر بایت را داشت. نرخ نمونهبرداری آن ۸ هرتز است و چانک data آن ۱۶ فریم یکبایتی دارد، بنابراین مدت فایل اصلی دقیقاً دو ثانیه است. بازهٔ درخواستی از ۰٫۲۵ ثانیه تا ۱٫۲۵ ثانیه است.
| مقدار | محاسبه | نتیجه |
|---|---|---|
| فریم آغاز | round(۰٫۲۵ × ۸) | ۲ |
| فریم پایان | round(۱٫۲۵ × ۸) | ۱۰ |
| فریمهای نگهداشتهشده | ۱۰ − ۲ | ۸ |
| مدت برشخورده | ۸ ÷ ۸ هرتز | ۱ ثانیه |
| بایتهای صوتی نگهداشتهشده | ۸ فریم × ۱ بایت | ۸ بایت |
| فایل خروجی | سرآیند PCM ۴۴ بایتی + ۸ بایت صوتی | ۵۲ بایت |
این آزمون صدای منبع را با مقادیر بایتی شناختهشده پر میکند و تأیید میکند که صدای خروجی دقیقاً بایتهای ۲ تا ۹ منبع است — از فریم ۲ (شامل) تا فریم ۱۰ (غیرشامل). همچنین شمارههای فریم، هر دو مدت، اندازهٔ فایل ۵۲ بایتی، نوع MIME مربوط به WAV و نام دانلود را تأیید میکند. اگر پیادهسازی و این مثال دیگر یک عملیات را توصیف نکنند، آزمون شکست میخورد.
کاری که انجام نمیدهد
این یک برشگر فریم است، نه یک ویرایشگر. لبهها را محو تدریجی نمیکند، سکوت را پیدا نمیکند، بلندی صدا را نرمال نمیکند، کانالها را میکس نمیکند، نرخ نمونهبرداری را تغییر نمیدهد، عمق بیت را تبدیل نمیکند و پیشنمایش ضبط را نشان نمیدهد. هرکدام از اینها به خواندن مقادیر نمونهها و یک تصمیم کیفی جداگانه نیاز دارد؛ هیچکدام در ابزاری جا ندارد که وعدهاش این است که مقادیر نگهداشتهشده دستنخورده میمانند.
همچنین تلاشی برای ترمیم یک WAV آسیبدیده نمیکند. ضبطکنندهای که در میانهٔ یک فریم متوقف شده یا طول چانکی را فراتر از انتهای فیزیکی فایل نوشته است، ممکن است صدای قابلبازیابی داشته باشد، اما انتخاب اینکه چه چیزی دور ریخته شود کار بازیابی است، نه برش. ابتدا سرآیند را بررسی کنید تا ببینید کدام ادعا ناسازگار است؛ سپس پیش از برش، ضبط را در یک ویرایشگر صوتی ترمیم کنید.
و چون فراداده عمداً حذف میشود، این عملیات درستی برای تحویل یک Broadcast Wave نیست که باید تایمکد، یادداشتهای تولید iXML یا ناحیههای نشانه را حفظ کند. وقتی خروجی مورد نظر خودِ صدای انتخابشده در یک WAV جمعوجور، خصوصی و معمولی باشد، عملیات درستی است.
اگر یک فایل همراه SRT یا WebVTT پیش از برش با صدا همتراز شده بود، زمانبندی زیرنویس را به اندازهٔ مقدار حذفشده از ابتدا جابهجا کنید. این کار ساعت نشانههای خارجی را تغییر میدهد؛ به نمونههای صوتی کپیشده دست نمیزند و فرادادهٔ زیرنویس را در WAV قرار نمیدهد.
مراحل انجام کار
- بررسی کنید که دوازده بایت اول، یک فایل WAVE از نوع RIFF یا RF64 لیتلاندین را معرفی کند. فایل RIFX بیگاندین رد میشود، زیرا کپی کردن نمونههای آن در یک کانتینر لیتلاندین معنای آنها را تغییر میدهد.
- فهرست چانکهای RIFF را، با رعایت بایت پرکننده پس از بار دادهٔ با طول فرد، پیمایش کنید تا هر دو چانک fmt و data پیدا شوند. برای RF64، طول ۶۴ بیتی صدا را از چانک ds64 آن بخوانید.
- تعداد کانالها، نرخ نمونهبرداری، همترازی بلوک و عمق بیت را از fmt بخوانید. اگر فرمت WAVE_FORMAT_EXTENSIBLE است، GUID زیرفرمت آن را باز کنید تا PCM از IEEE float تشخیص داده شود.
- بررسی کنید که فرمت، PCM یا IEEE float با عرض ثابت باشد و همترازی بلوک اعلامشده با حاصلضرب تعداد کانالها در بایتهای هر نمونه برابر باشد. فایل فشرده یا ناسازگار در درون خود، به جای برش در یک مرز حدسی، رد میشود.
- طول data را بر همترازی بلوک تقسیم کنید تا تعداد دقیق فریمهای نمونهٔ کامل و از روی آن، مدت ضبط به دست آید.
- هر زمان درخواستی را در نرخ نمونهبرداری ضرب کنید و به نزدیکترین فریم کامل گرد کنید. پایانی فراتر از ضبط را به آخرین فریم آن محدود کنید؛ شروعی در پایان یا فراتر از آن را رد کنید.
- بازهٔ فریم انتخابشده را در قطعههای ۴ مگابایتی در یک WAV تازه کپی کنید. بلوک فرمت حفظ میشود، برای صدای float یک شمارش fact جدید نوشته میشود و اندازههای RIFF و data دوباره محاسبه میشوند.
- چانکهای فراداده را از نتیجه کنار بگذارید، زیرا موقعیت نشانهها، نقاط حلقه و ارجاعهای زمانی آنها ضبطِ برشنخورده را توصیف میکنند. WAV جدیدِ بدون فراداده را برای دانلود ارائه دهید.
فرضها
- فایلهای WAV از نوع PCM و IEEE-float، از جمله WAVE_FORMAT_EXTENSIBLE و RF64، پشتیبانی میشوند. کدگذاریهای فشردهٔ WAV و RIFX بیگاندین پشتیبانی نمیشوند، زیرا برش امن هرکدام به رمزگشایی یا تبدیل ترتیب بایت نیاز دارد.
- زمان درخواستی میتواند بین دو فریم نمونه بیفتد. به نزدیکترین فریم کامل گرد میشود، بنابراین بزرگترین جابهجایی زمانی نیم فریم است — حدود ۰٫۰۱۱ میلیثانیه در ۴۴٫۱ کیلوهرتز.
- زمان پایانِ فراتر از فایل به آخرین فریم کامل محدود میشود. شروعی در آن فریم یا فراتر از آن هیچ صدای قابلپخشی باقی نمیگذارد و به جای تولید یک فایل خالی، رد میشود.
- نرخ نمونهبرداری، تعداد کانالها، عمق بیت، بلوک فرمت و بایتهای نمونهٔ نگهداشتهشده کپی میشوند. هیچ تغییر بهره (گین)، محو تدریجی، نمونهبرداری مجدد، دیدر یا گذر از کدک وجود ندارد.
- فراداده عمداً کپی نمیشود. ارجاعهای زمانی Broadcast Wave، نقاط نشانه، ناحیهها، حلقهها، برچسبها، تصویر جلد و توضیحات در غیر این صورت به خط زمانی قدیمی اشاره میکردند یا جزئیاتی را فاش میکردند که بازدیدکننده قصد نگه داشتن آنها را نداشته است.
- چانک data باید تعداد صحیحی فریم نمونه داشته باشد و درون فایل جا بگیرد. فریم آخرِ ناقص یا طول چانکی که از انتهای فایل میگذرد، ناقصبودن (truncation) فایل تلقی میشود، نه اینکه بیسروصدا ترمیم شود.
- کل ورودی و خروجی برشخورده همزمان در حافظه قرار دارند. بنابراین ورودی به ۲۵۶ مگابایت محدود است و نتیجهٔ RF64 که در این حد باشد بهصورت یک RIFF WAV معمولی نوشته میشود.
پرسشهای رایج
آیا برش یک WAV کیفیت صدای آن را کاهش میدهد؟
خیر، نه برای فایلهای PCM و IEEE-float پشتیبانیشده. فریمهای نمونهٔ کامل بایتبهبایت کپی میشوند، بنابراین هیچ نسل تازهای از کدک، نمونهبرداری مجدد، تغییر بهره یا دیدر در کار نیست. فایل کامل بایتهای متفاوتی دارد، زیرا اندازههای کانتینر آن جدید است و فرادادهاش حذف شده، اما بار دادهٔ صوتی نگهداشتهشده بدون تغییر است.
چرا برش کسری از میلیثانیه با زمانی که وارد کردم فاصله دارد؟
صدای دیجیتال فقط میتواند روی یک فریم نمونه آغاز شود، نه بین دو فریم. هر زمان به نزدیکترین فریم گرد میشود و این اختلاف را به نیم فریم محدود میکند: حدود ۰٫۰۱۱ میلیثانیه در ۴۴٫۱ کیلوهرتز یا ۰٫۰۱۰ میلیثانیه در ۴۸ کیلوهرتز.
چه نوع فایلهای WAV را میتوان با این ابزار برش داد؟
فایلهای RIFF و RF64 لیتلاندین که حاوی PCM صحیح یا صدای IEEE-float ۳۲ بیتی یا ۶۴ بیتی هستند پشتیبانی میشوند، از جمله فرمت extensible که برای عمق بیتهای بالا و ضبطهای چندکاناله به کار میرود. WAV فشرده و RIFX بیگاندین به رمزگشا یا تبدیل ترتیب بایت نیاز دارند و رد میشوند.
چرا نشانگرها و توضیحات WAV من پس از برش ناپدید شدهاند؟
آنها عمداً کنار گذاشته شدهاند. یک نقطهٔ نشانه، مرز حلقه یا ارجاع زمانی Broadcast Wave نسبت به ضبط اصلی سنجیده میشود؛ کپی کردن بدون تغییر آن، آن را در نقطهٔ نادرستی از فایل برشخورده قرار میدهد. خروجی فقط شامل فرمت صدا، در صورت نیاز یک شمارش فریم، و خود صدا است.
آیا WAV هنگام برش از مرورگر من خارج میشود؟
خیر. یک Worker در همین برگه سرآیند را میخواند و بایتهای انتخابشده را کپی میکند، سپس مرورگر آن بایتها را بهصورت یک دانلود محلی ارائه میدهد. آزمون خودکار مرورگریِ این صفحه یک WAV واقعی را بارگذاری میکند و اگر تا وقتی فایل حاضر است درخواستی از سایت خارج شود، شکست میخورد.
چرا MP3 من را حتی وقتی نامش را به .wav تغییر دادهام برش نمیدهد؟
نام فایل فرمت صدا را تغییر نمیدهد. MP3 فریمهای فشردهای را با مرزها و قواعد زمانبندی ذخیره میکند که فریم نمونهٔ WAV نیستند، بنابراین به جای اعتماد به پسوند فایل، بایتهای اول بررسی میشوند. تبدیل یا برش MP3 به کدک نیاز دارد و عملیات دیگری است.