TimeReference در BWF مبدأِ نمونهٔ نخست را بهصورت شمارشِ نمونه از نیمهشب اعلام میکند؛ با ثانیهٔ سپریشده از آغازِ فایل یکی نیست. برای وصلکردنِ یک موقعیتِ نسبی به این مبدأ، مقدارِ Low/Highِ bext و نرخِ fmt را کنار هم میخوانیم. این تمرین فقط metadataِ دو فایلِ ساختگی را بررسی میکند؛ ساعتِ واقعیِ دستگاه یا UTC را تأیید نمیکند.
سه زمان را جدا بنویسیم
موقعیتِ فریم در فایل، شمارشِ نمونهٔ مبدأ و تاریخ/زمانِ توصیفی سه شاهدِ متفاوتاند. در فایلِ اصیلِ این صفحه، نرخ۹۶۰۰۰است و TimeReference عددِ۴٬۸۰۰٬۰۰۰٬۰۰۰را دارد. تقسیمِ این عدد بر نرخ،۵۰۰۰۰ثانیه از نیمهشبِ اعلامی میدهد؛ این فقط حسابِ metadata است، نه اثباتِ درستبودنِ ساعتِ ضبط.
EBU Tech3285 ساختارِ bext و TimeReference را تعریف میکند. ما زیرمجموعهٔ bextِ نسخهٔ صفر با اندازهٔ ثابتِ۶۰۲بایت را میسازیم؛ فیلدهای UMID و loudnessِ نسخههای بعدی را جعل نمیکنیم. نرخ از fmtِ PCMِ تککانالهٔ۱۶بیتی میآید. این reader همهٔ نسخهها یا کدگذاریهای BWF را پوشش نمیدهد.
عددِ۶۴بیتی از Low وHigh ساخته میشود
در بدنهٔ bext، چهار بایتِ Low از offsetِ۳۳۸و چهار بایتِ High از۳۴۲خوانده میشوند؛ ترتیب little-endian است. مقدارِ کامل برابر با High ضربدر۲بهتوان۳۲،بهاضافهٔ Low است. عددِ نمونه با Lowِ۵۰۵٬۰۳۲٬۷۰۴وHighِ۱واقعاً بازسازی میشود؛ حذفِ High مبدأ را بسیار عقب میبرد.
offsetِ بالا نسبت به شروعِ payloadِ bext است، نه ابتدایِ کلِ فایل. کد مرزهای RIFF وchunk را پیش از خواندن کنترل میکند؛ جستوجوی تصادفیِ واژهٔ bext در بایتها روشِ خواندنِ معتبر نیست. از اندازهٔ نامطمئن، حافظهٔ بزرگ تخصیص داده نمیشود و bufferِ تمرین سقفِ محدود دارد.
چند فریمِ معلوم را به مبدأ وصل کنیم
نمونه۴۸۰۱فریمِ صفر دارد؛ این سکوتِ اصیل گفتارِ انسان نیست. سه اندیسِ موجودِ۰،۲۴۰۰و۴۸۰۰را میخوانیم. در نرخ۹۶۰۰۰،فاصلهٔ نسبی آنها بهترتیب۰،۰٫۰۲۵و۰٫۰۵ثانیه است. شمارشِ نسبتدادهشده به مبدأ برابر با TimeReference+اندیسِ فریم میشود.
| اندیسِ فریم | ثانیهٔ نسبی | شمارشِ نمونه با مبدأ |
|---|---|---|
| ۰ | ۰ | ۴٬۸۰۰٬۰۰۰٬۰۰۰ |
| ۲۴۰۰ | ۰٫۰۲۵ | ۴٬۸۰۰٬۰۰۲٬۴۰۰ |
| ۴۸۰۰ | ۰٫۰۵ | ۴٬۸۰۰٬۰۰۴٬۸۰۰ |
حساب با Fraction انجام میشود تا همین نسبتها دقیق بمانند. این جدول متن را با صوت همتراز نمیکند؛ هیچ timestampِ کلمه یا گوینده تولید نشده است. برای تطبیقِ یک کلمهٔ واقعی با ضبط، شاهدِ خودِ صوت و روشِ مستقلِ همترازی لازم است.
همان PCM، مبدأِ متفاوت
فایلِ دوم دقیقاً همان بایتهای PCM را دارد، اما TimeReference آن۹۶۰۰۰نمونه جلوتر است. هشِ PCMِ دو فایل برابر و مبدأ یک ثانیه متفاوت است. بنابراین یکسانبودنِ محتوای داده، برابر بودنِ نقطهٔ آغازِ اعلامی را تضمین نمیکند. هشِ کلِ فایل هم بهدلیلِ metadata میتواند فرق کند.
در نمونهٔ سوم bext وجود ندارد؛ نگاشتِ مبدأ null برمیگرداند و آن را صفرِ معتبر پر نمیکند. وقتی expected_rateِ۴۸۰۰۰با fmtِ۹۶۰۰۰نمیخواند، کد خطا میدهد؛ تبدیلِ نرخ یا دوبرابرکردنِ زمان را پنهانی حدس نمیزند. frameِ خارج از دادهٔ موجود هم پذیرفته نمیشود.
از این داده ساعتِ معتبر نسازیم
فیلدهای تاریخ و زمان در نمونه ساختگیاند و با برچسبِ unverified گزارش میشوند. TimeReference بهتنهایی منطقهٔ زمانی، UTC، تنظیمِ درستِ ساعت، عبورِ روز یا صحتِ دستگاه را ثابت نمیکند. حتی اگر حاصلِ تقسیم شبیهِ ساعتِ روز باشد، بدون زمینهٔ معتبر نباید آن را زمانِ جهانیِ وقوعِ رویداد نامید.
برنامه فقط بایتهای داخلِ حافظه را میخواند؛ هشِ اصلِ نمونه پیش و پس از بازرسی برابر میماند. هیچ فایلِ مشتری بازنویسی، بارگذاری یا پخش نمیشود. این کنترلِ فقطخواندنی، گواهِ سالمبودنِ گفتار، کاملبودنِ ضبط یا مجوزِ انتشارِ داده نیست.
در تحویلِ متن چه چیزی را همراه کنیم؟
مشخصاتِ WAV نرخ و فریم را روشن میکند و برچسبهای توصیفیِ INFO بخشِ دیگری از metadata را میخواند. این صفحه بهطور خاص مبدأِ نمونهٔ bext و نگاشتِ موقعیتِ موجود را دارد؛ جایِ آن بررسیها را نمیگیرد.
برای درخواستِ اپرانگار، اگر خروجیِ زماندار لازم است، نسخهٔ فایل و مبدأِ مطلوبِ زمان را مشخص کنید. دربارهٔ قالبِ قابلپذیرش و خروجی با تیم توافق کنید؛ پشتیبانیِ BWF یا خواندنِ خودکارِ TimeReference در اپرا از این تمرین نتیجه نمیشود.
فایل تمرین و منبع
کد کامل تمرین محلی و کنترلهای ورودی · دادهٔ ساختگی و خروجیِ اجرای واقعیِ تمرین
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.