سرآیند یک فایل WAV را بررسی کنید
سرآیند یک فایل WAV را در مرورگر شما میخواند و نرخ نمونهبرداری، عمق بیت، تعداد کانال، کدگذاری و مدت دقیق را، همراه با هر چانک RIFF موجود در فایل و کاربرد هر یک، گزارش میدهد. فایل هرگز آپلود نمیشود.
هر فایل RIFF WAVE، از جمله Broadcast Wave و RF64. در همین برگه خوانده میشود و هرگز به جایی فرستاده نمیشود.
چگونگی کار
این ابزار چه میکند
به سؤالهایی پاسخ میدهد که یک فایل WAV با پخش شدن به آنها پاسخ نمیدهد: با چه نرخی ضبط شده، چند بیت عمق دارد، چگونه کدگذاری شده و دقیقاً چقدر طول دارد. اینها ارقامی هستند که تعیین میکنند فایل وارد میشود یا نه، و در چهلوچهار بایت ابتدای فایل قرار دارند که هیچ پخشکنندهای به شما نشان نمیدهد.
دلیل اینکه خواندنشان ارزش دارد این است که سرآیند WAV میتواند اشتباه باشد. نرخ نمونهبرداری، تعداد کانال و مدت صدا همگی مستقل از خود صدا ثبت میشوند، بنابراین یک فایل میتواند از درون ناسازگار باشد و همچنان باز شود. وقتی یک ضبط با سرعت اشتباه پخش میشود، نیم ثانیه کوتاهتر در میآید، یا ابزار مسترینگی که دلیلش را نمیگوید آن را رد میکند، پاسخ معمولاً همینجا دیده میشود.
روش
یک فایل WAV یک کانتینر RIFF است: دوازده بایت مقدمه، سپس فهرستی مسطح از چانکها. هر چانک چهار کاراکتر ASCII شناسه، یک طول ۳۲ بیتی و به همان تعداد بایت بار دارد. دو چانک الزامی است — fmt ، که کدگذاری را توصیف میکند، و data، که نمونهها را نگه میدارد — و بقیه فرادادهای است که ضبطکنندهها و ویرایشگرها اضافه میکنند.
سه نکته در آن پیمایش هست که یک خوانندهٔ سادهانگار در آنها خطا میکند، و هر سه در فایلهای معمولی پیش میآیند:
بار هر چانک تا طول زوج پر میشود و بایت پرکننده شمرده نمیشود. اگر از آن بگذرید، هر چانک پس از اولین چانک با طول فرد یک بایت جابهجا خوانده میشود، که خطا نمیدهد — فهرستی قابلقبول از مزخرفات تولید میکند.
طول اعلامشده ممکن است از فایل بلندتر باشد. این یک ضبط بریدهشده است، و آنقدر رایج است که رد کردن فایل پاسخ اشتباهی باشد. طول به آنچه موجود است محدود میشود و هر دو رقم گزارش میشوند.
یک چانک ممکن است طولش را صفر اعلام کند. این مجاز است، و پیمایشی که به اندازهٔ طول اعلامشده جلو میرفت برای همیشه روی آن میماند. آفست در اینجا همیشه دستکم به اندازهٔ هشت بایت سرآیند چانک حرکت میکند.
خود مدت هیچجای فایل WAV ذخیره نمیشود. محاسبه میشود: تعداد بایتهای صدا، تقسیم بر تعداد بایتهای یک فریم نمونه، تقسیم بر تعداد فریم در ثانیه. برای PCM، float، A-law و mu-law این تقسیم دقیق است، چون هر فریم عرض یکسانی دارد. برای یک فرمت فشرده اینطور نیست — تعداد فریمها در یک بلوک متغیر است — بنابراین مدت از چانک fact میآید که دقیقاً به همین دلیل وجود دارد، و وقتی فایلی آن را ندارد به نرخ بایت میانگین برمیگردد.
یک چیز دیگر هم باز میشود. هر چیزی بالاتر از دو کانال یا بالاتر از ۱۶ بیت قرار است تگ فرمت WAVE_FORMAT_EXTENSIBLE را اعلام کند، که اصلاً یک فرمت نیست: تگ واقعی اولین بایتهای یک GUID شانزدهبایتی است که بیستوچهار بایت جلوتر در چانک قرار دارد. خوانندهای که در ابتدای fmt متوقف شود، یک مستر کاملاً معمولی ۲۴ بیتی را بهعنوان کدگذاری ناشناخته گزارش میکند.
پیش از ادامهٔ مطلب
یک چانک WAV باری به اندازهٔ ۴٬۰۰۱ بایت اعلام میکند — یک عدد فرد. چانک بعدی از کجا شروع میشود؟
۴٬۰۰۲ بایت جلوتر. بار RIFF تا طول زوج پر میشود و بایت پرکننده در طول اعلامشده شمرده نمیشود، بنابراین خوانندهای که فقط به اندازهٔ طول جلو میرود، به ازای هر چانک فردی که از آن میگذرد یک بایت منحرف میشود. چیزی که آن را به بدترین نوع باگ تبدیل میکند این است که خطا نمیدهد — فهرستی قابلقبول از مزخرفات تولید میکند، چهار بایت بار نامتراز که بهعنوان شناسهٔ چانک خوانده میشود، و فایلی که تجزیهشده به نظر میرسد. دو مورد مرتبط هم اینجا کنارش هستند: طول اعلامشدهٔ بلندتر از فایل یک ضبط بریدهشده است نه دلیلی برای رد کردن، و یک چانک ممکن است بهطور مجاز صفر اعلام کند، بنابراین پیمایش همیشه دستکم به اندازهٔ هشت بایت سرآیند چانک جلو میرود.
4,000 bytes of audioطول اعلامشدهٔ چانک data، و تنها رقمی دربارهٔ مدت که فایل واقعاً دارد.
/ 2 bytes per frame = 2,000 framesیک فریم یعنی همهٔ کانالها در یک لحظه نمونهبرداری شده باشند. اینجا یک کانال با ۱۶ بیت است، یعنی دو بایت.
/ 8,000 frames per second = 0.25 sبهصورت ۰:۰۰٫۲۵۰ نشان داده میشود. هیچچیز در سرآیند این را نمیگوید؛ هر بار محاسبه میشود.
فقط وقتی دقیق است که عرض همهٔ فریمها یکسان باشدبرای PCM، float، A-law و mu-law درست است. برای یک فرمت فشرده تعداد فریم در هر بلوک متغیر است، بنابراین شمارش از چانک fact میآید — که دقیقاً به همین دلیل وجود دارد — و وقتی فایلی آن را ندارد به نرخ بایت میانگین برمیگردد.
یک مثال کارشده
فایل tone.wav که آزمون مرورگر این ابزار از آن استفاده میکند ۴٬۰۴۴ بایت است. سرآیند آن چنین میخواند:
offset bytes meaning
0 52 49 46 46 "RIFF"
4 c4 0f 00 00 4,036 — the size of everything after this field
8 57 41 56 45 "WAVE"
12 66 6d 74 20 "fmt "
16 10 00 00 00 16 — the fmt payload is 16 bytes long
20 01 00 format tag 1: PCM
22 01 00 1 channel
24 40 1f 00 00 8,000 frames per second
28 80 3e 00 00 16,000 bytes per second
32 02 00 2 bytes per frame
34 10 00 16 bits per sample
36 64 61 74 61 "data"
40 a0 0f 00 00 4,000 bytes of audio
44 ... the audio
هر عدد در فیلدهای چندبایتی با ترتیب بایت little-endian است، بنابراین 40 1f 00 00 همان 0x00001f40 است که میشود ۸٬۰۰۰.
از آن:
| رقم | محاسبه | نتیجه |
|---|---|---|
| فریمهای نمونه | ۴٬۰۰۰ بایت ÷ ۲ بایت در هر فریم | ۲٬۰۰۰ |
| مدت | ۲٬۰۰۰ فریم ÷ ۸٬۰۰۰ در ثانیه | ۰٫۲۵ ثانیه، نشاندادهشده بهصورت ۰:۰۰٫۲۵۰ |
| نرخ بیت | ۱۶٬۰۰۰ بایت × ۸ ÷ ۱٬۰۰۰ | ۱۲۸ کیلوبیت بر ثانیه |
| چانکها | fmt در آفست ۱۲، data در آفست ۳۶ | ۲ |
دو بررسی متقاطع که نشان میدهد فایل از درون سازگار است: ۴۴ بایت سرآیند بهعلاوهٔ ۴٬۰۰۰ بایت صدا میشود ۴٬۰۴۴، که اندازهٔ فایل است؛ و اندازهٔ RIFF اعلامشده، ۴٬۰۳۶، همان رقم منهای هشت بایت شناسهٔ RIFF و فیلد طول خودش است.
اینها همان اعدادی هستند که در فایل آزمون این ابزار، در برابر همان بایتهای روی دیسک، تأیید میشوند؛ بنابراین اگر تجزیهکننده بدون آنکه این صفحه همراهش تغییر کند تغییر کند، ساخت شکست میخورد.
کاری که انجام نمیدهد
هیچ صدایی را رمزگشایی نمیکند، بنابراین نمیتواند بگوید یک برداشت کلیپ شده، بیصدا، نویزی یا خراب است — فقط آنچه فایل دربارهٔ خودش میگوید. فایلهای WAV را میخواند و بس: یک MP3، FLAC، AIFF یا M4A فقط آنقدر شناخته میشود که در پیام خطا نامش گفته شود. محتوای چانکهای فراداده را نمیخواند، بنابراین یک چانک bext با اندازه و کاربردش فهرست میشود اما تایمکد و originator آن نشان داده نمیشود. هیچچیز را تغییر نمیدهد و چیزی را بازنویسی نمیکند — تنها چیزی که تولید میکند یک توصیف JSON است که میتوانید دانلود کنید.
و یک فایل را توصیف میکند، نه اینکه از آن اثرانگشت بگیرد. اگر سؤال این است که آیا دو نسخه بایتبهبایت یکساناند، هیچ سرآیندی نمیتواند پاسخ دهد — یک چکسام فایل میتواند. اگر سرآیند سالم است و کار بعدی نگه داشتن یک بازهٔ زمانی است، پس از بررسی، فایل WAV را برش دهید.
مراحل انجام کار
- دوازده بایت اول را بخوانید و بررسی کنید که RIFF (یا RIFX یا RF64)، سپس یک اندازه و سپس WAVE باشد. هر چیز دیگری فرمت دیگری است، و پیام خطا بهجای آن میگوید فایل به نظر چه چیزی است.
- فهرست چانکها را از بایت دوازدهم پیمایش کنید. هر چانک چهار بایت ASCII شناسه، یک طول ۳۲ بیتی و به همان تعداد بایت بار (payload) دارد که اگر طول فرد باشد با یک بایت استفادهنشده پر میشود.
- هر طول اعلامشده را به بایتهای واقعاً موجود محدود کنید و همیشه دستکم هشت بایت جلو بروید، تا فایلی با جدول چانک خراب بهجای هنگ کردن یا کرش، یک پاسخ تولید کند.
- چانک fmt را برای تگ فرمت، تعداد کانال، نرخ نمونهبرداری، نرخ بایت، تراز بلوک و بیت در هر نمونه بخوانید.
- وقتی تگ فرمت WAVE_FORMAT_EXTENSIBLE است، تگ واقعی را از اولین بایتهای GUID زیرفرمت، بیستوچهار بایت جلوتر، و تعداد بیتهای معتبر را از بخش توسعه بخوانید.
- تصمیم بگیرید چند بایت صدا وجود دارد — اندازهای که چانک data اعلام میکند، مگر آنکه صفر یا بزرگتر از فایل باشد، که در آن صورت از بایتهای واقعاً موجود استفاده کنید.
- برای فرمت با عرض ثابت، صدا را بر تراز بلوک تقسیم کنید تا فریمهای نمونه به دست آید، یا برای فرمت فشرده تعداد فریم را از چانک fact بردارید؛ سپس فریمها را بر نرخ نمونهبرداری تقسیم کنید تا مدت بر حسب ثانیه به دست آید.
- ارقام را بنویسید و کل سرآیند همراه با نقشهٔ چانکها را بهصورت دانلود JSON ارائه دهید. در هیچ مرحلهای چیزی آپلود نمیشود.
فرضها
- یک فایل WAV مدت خود را هیچجا ذخیره نمیکند. مدت نشاندادهشده از اندازهٔ صدا و نرخی که سرآیند ادعا میکند محاسبه میشود، که دقیقاً همان کاری است که یک پخشکننده انجام میدهد؛ بنابراین فایلی با نرخ نمونهبرداری اشتباه در سرآیندش، اینجا مدت اشتباهی گزارش میدهد و همهجا با سرعت اشتباه پخش میشود.
- برای فرمت با عرض ثابت، تعداد فریم برابر است با اندازهٔ صدا تقسیم بر تراز بلوک، گردشده به پایین. یک فریم ناقص در انتها کنار گذاشته میشود، چون کسری از یک فریم قابل پخش نیست.
- عمق بیت، عرض کانتینری است که سرآیند اعلام میکند، نه تعداد بیتهای حامل سیگنال. صدایی که با ۲۴ بیت ضبط و در کلمههای ۳۲ بیتی بستهبندی شده، ۳۲ گزارش میشود و خط کدگذاری میگوید چند بیت از آن معتبر است.
- یک فرمت فشرده تعداد متغیری از فریمها را در هر بلوک جا میدهد، بنابراین مدت آن از چانک fact میآید. بدون آن، نرخ بایت یک میانگین است و مدت یک تخمین است، نه یک رقم دقیق.
- فقط سرآیند خوانده میشود و صدا هرگز رمزگشایی نمیشود. فایلی که سرآیندش درست است و نمونههایش سکوت، نویز یا دادههای خراب است، اینجا کاملاً سالم به نظر میرسد.
- وقتی اندازهٔ اعلامشدهٔ صدا معتبر است از همان استفاده میشود و مدت دقیق است. وقتی صفر یا بزرگتر از فایل است، حالت جایگزین هر بایت را از ابتدای صدا تا انتهای فایل میشمارد، که به اندازهٔ هر فرادادهای که پشت صدا نشسته بیشتر گزارش میکند. این خطای امنتر است: راه دیگر، یک ضبط قطعشده را به اندازهٔ کل صدایش کمتر گزارش میکرد.
- کل فایل در این برگه خوانده میشود، هرچند فقط چند صد بایت اول لازم است، و به همین دلیل به ۲۵۶ مگابایت محدود شده است. چیزی به جایی فرستاده نمیشود.
پرسشهای رایج
آیا فایل صوتی من جایی آپلود میشود؟
خیر. فایل در همین برگهٔ مرورگر خوانده میشود و یک worker که روی دستگاه خودتان اجرا میشود آن را تجزیه میکند. سروری برای فرستادنش وجود ندارد، و آزمون خودکار این صفحه اگر در حین بارگذاری فایل درخواستی از سایت خارج شود شکست میخورد.
چرا اینجا ۳۲ بیت میگوید در حالی که ضبطکنندهٔ من ۲۴ بیت میگوید؟
چون اینها دو عدد متفاوتاند و فایل هر دو را دارد. یک نمونهٔ ۲۴ بیتی بهراحتی در تعداد صحیحی از بایتها جا نمیشود، بنابراین بسیاری از ضبطکنندهها و ویرایشگرها آن را در یک کانتینر ۳۲ بیتی مینویسند و تعداد بیتهای معتبر را روی ۲۴ میگذارند. عمق بیتی که نشان داده میشود همان کانتینر است؛ خط کدگذاری میگوید چند بیت واقعاً حامل سیگنال است.
چرا مدت، کسری از ثانیه با پخشکنندهٔ من فرق دارد؟
به احتمال زیاد چون چانک data اندازهای اعلام میکند که با بایتهای موجود نمیخواند. ضبطی که با باتری خالی یا کارت پر قطع شده، اغلب اندازهٔ اعلامشده را صفر رها میکند یا پیش از آن متوقف میشود، و نرمافزارهای مختلف این را به شکلهای مختلفی حل میکنند. در بخش «گزینههای بیشتر» میتوانید با جابهجایی بین اندازهای که سرآیند اعلام میکند و هر بایت تا انتهای فایل، هر دو رقم را ببینید.
میگوید این یک فایل WAV نیست، اما نامش به .wav ختم میشود
پسوند یک برچسب است، نه یک تضمین، و نرمافزارهای زیادی یک MP3 یا AIFF مینویسند و نامش را .wav میگذارند. بررسی اینجا روی بایتهای ابتدای فایل است، و پیام بهجای آن میگوید فایل به نظر چیست — یک MP3، یک Ogg، یک FLAC، یک AIFF یا یک کانتینر MP4.
این همه چانک اضافی چیست؟
یک فایل WAV فهرستی از چانکهاست و فقط دو تای آنها الزامی است. بقیه فرادادهای است که یک ضبطکننده یا ویرایشگر اضافه کرده — bext برای تایمکد برودکست، iXML برای یادداشتهای تولید، LIST برای تگهای هنرمند و توضیحات، cue و smpl برای نشانگرها و نقاط حلقه، و JUNK یا FLLR بهعنوان لایی (padding) که باقی گذاشته میشود تا ویرایش بعدی بتواند سرآیند را بدون بازنویسی فایل بزرگ کند.
آیا میتواند بگوید ضبط خوب است یا نه؟
نه. سرآیند را میخواند و هرگز نمونهای را رمزگشایی نمیکند، بنابراین میتواند بگوید فایلی ادعا میکند ۹۶ کیلوهرتز استریو است، اما نه اینکه آیا چیزی بالاتر از ۲۰ کیلوهرتز در آن هست، و نه اینکه آیا برداشت کلیپ شده، بیصدا یا خراب است.