برایِ پیادهسازیِ ویدئو، ابتدا باید صدایِ قابلاستفاده به دست آوریم؛ تغییرِ پسوندِ ویدئو به wav چنین کاری نمیکند. در این تمرینِ فنی، یک ویدئویِ کاملاً ساختگی را داخلِ مرورگر میسازیم، صوتش را واقعاً decode میکنیم و خروجیِ PCM16ِ WAV مینویسیم. این مسیر بازرمزگذاریِ صوت است، نه کپیِ بیتغییرِ بایتهایِ فشردهٔ ترک.
این مثال کدام قالب را واقعاً آزمایش کرده است؟
مرورگرِ ثبتشده Edge نسخهٔ154.0.4258.37 بود. ورودیِ خودمان WebM باVP8 وOpus است: تصویرِ۱۶۰در۹۰ از یک canvasِ رنگی و سیگنالِ۴۴۰هرتز با دامنهٔ۰٫۱ از oscillator. یک ترکِ تصویر و یک ترکِ صوت واردِ MediaRecorder شدند و ابعادِ ویدئویِ ذخیرهشده هم در عنصرِ video واقعاً خوانده شد.
میکروفن، صدایِ انسان، فایلِ مشتری یا تماسِ واقعی استفاده نشده است. صدا به مقصدِ ضبط وصل میشود و شاخهٔ متصل به خروجیِ دستگاه، gainِ صفر دارد؛ در آزمون، مرورگر هم mute بود. این نمونه برایِ بررسیِ تبدیلِ داده است، نه ساختِ ویدئویِ محصول یا سنجشِ کیفیتِ گفتار.
روشِ محلی را در یک پوشهٔ جدا اجرا کنیم
خوانندهٔ فنی میتواند یک پوشهٔ تازه و بدونِ فایلِ خصوصی بسازد، داخلش صفحهٔ ساده با یک دکمه بگذارد و همان پوشه را فقط رویِ loopback سرو کند. برایِ نمونه:
python -m http.server 8765 --bind 127.0.0.1صفحه را در http://127.0.0.1:8765 باز کنید، تابعهایِ فایلِ متنی را در ابزارِ توسعهٔ همان صفحه قرار دهید و از رویدادِ کلیکِ واقعی، teachingVideoAudioExtractDemo را فراخوانی کنید. خروجی report وwavBlob است؛ کد خودکار دانلود یا بارگذاری نمیکند. پس از تمرین سرورِ محلی را ببندید.
نسخهٔ همراه فقط در localhost یا127.0.0.1 کار میکند. تابعِ decodeTeachingVideoBlob یک Blobِ مجازِ غیرخالی تا۸MiB میگیرد؛ این سقفِ تمرین است، نه محدودیتِ اپرانگار یا تضمینِ مصرفِ کمِ حافظهٔ رمزگشا. فایلِ بزرگ یا نامطمئن به سیاستِ منابعِ مناسب نیاز دارد.
نتیجهٔ واقعیِ ثبتشده چه بود؟
در اجرایِ متصل به هشِ همین کد، ورودی۲۰۷۵۱بایت و صوتِ بازشده۱۷۲۸۰فریمِ هر کانال داشت. زمینهٔ decode نرخِ۱۶۰۰۰ را تعیین کرده بود؛ خروجی دو کانال و۱٫۰۸ثانیه شد. یک ترکِ صوت الزاماً یک کانال نیست. WAVِ نوشتهشده۶۹۱۶۴بایت است:۴۴بایتِ سرآیند بهعلاوهٔ فریمها ضربدرِ دو کانال و دو بایت.
| شاهدِ همان اجرایِ ثبتشده | مقدار |
|---|---|
| ابعادِ تصویرِ خواندهشده | ۱۶۰×۹۰ |
| نرخ وکانالِ صوتِ خروجی | ۱۶۰۰۰هرتز، دوکاناله |
| فریمِ هر کانال و مدت | ۱۷۲۸۰،۱٫۰۸ثانیه |
| اندازهٔ WAVِ خروجی | ۶۹۱۶۴بایت |
زمانسنجِ ضبط، مدتِ قطعیِ رسانه نیست
کد توقفِ ضبط را پس از۱۲۰۰میلیثانیه درخواست میکند، اما مدتِ decodeشدهٔ مشاهدهشده۱٫۰۸ثانیه بود. بنابراین عددِ timer را مدتِ قطعیِ فایل معرفی نمیکنیم. قالب، زمانبندی و پیادهسازی میتوانند در نتیجه اثر داشته باشند؛ اجرایِ دیگر باید مقدارِ خودش را گزارش کند.
مدتِ container در metadataِ این WebM عددِ متناهی نداد و گزارش آن را null گذاشت، نه صفر. از این شاهد، هممدتیِ دقیقِ ترکِ استخراجشده با همهٔ ویدئوها نتیجه نمیشود. برایِ کارِ واقعی، آغاز و پایان و محتوایِ شنیداری را با نسخهٔ اصلیِ مجاز کنترل کنید؛ این تمرین فقط سیگنالِ ساختگی دارد.
پشتیبانیِ ضبط، پشتیبانیِ decode را تضمین نمیکند
isTypeSupported ابتدا قابلیتِ اعلامیِ ضبطِ قالبِ fixture را میسنجد؛ سپس خودِ ضبط و رمزگشایی واقعاً امتحان میشوند. بایتِ چهارگانهٔ غیررسانهای در آزمونِ منفی رد شد. این نتیجه وعدهٔ بازشدنِ هرMP4،WebM،فایلِ چندترک، رمزگذاریشده یا خراب در هر مرورگر نیست.
decodeAudioData فایلِ کامل میخواهد و خروجی را با نرخِ زمینه بازنمونهبرداری میکند. سپس کد نمونهها را به PCM16 محدود و گرد میکند. پس این راه کپیِ losslessِ ترکِ فشرده نیست و هشِ صوتِ اصلی را بهعنوانِ هشِ خروجی اعلام نمیکند. اصلِ فایل و گزارشِ تبدیل را جدا نگه دارید.
بعد از استخراج، نیازِ متن را روشن کنیم
اندازهٔ بافرِ بازشده موضوعِ حافظه را جدا توضیح میدهد و بازرسِ WAV مشخصاتِ فایلِ خروجی را میخواند. برایِ درخواستِ اپرانگار، نوعِ فایل، مسیرِ مجاز و شکلِ متنِ موردِنیاز را با تیم تعیین کنید؛ این آزمایش وجودِ استخراجِ خودکارِ همهٔ ویدئوها در محصول را اعلام نمیکند.
فایل تمرین و منبع
تابعِ محلیِ ساختِ ویدئویِ آزمایشی، decode و خروجیِ WAV · گزارشِ واقعیِ همان نسخهٔ کد در Edge، شاملِ ابعادِ ویدئو و صوتِ استخراجشده
- مرجعِ اصلی؛ فایلِ کامل و بازنمونهبرداریِ خروجی با نرخِ زمینه
- مرجعِ اصلی؛ ساختِ ترکِ تصویر از canvas؛ نمونهٔ ما هیچ تصویرِ بیرونی نمیخواند
- مرجعِ اصلی؛ قابلیتِ اعلامیِ ضبط، بهتنهایی تضمینِ موفقیتِ واقعی نیست
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.