سلام خب این برنامهای هست که قولش رو داده بودم تا به فرمت دلخواه صدا را ضبط کنید. آن هم به شکلی خیلی ساده. راههای زیادی برای رسیدن به ضبط صدا هست! اما هدف من در اینجا ضبط صدا به فرمت دلخواه است، مثلا mp3 و بدون استفاده از ابزارهای برنامهنویسی نظیر ActiveX و ... ما میخواهیم با استفاده از توابع API به این هدف برسیم. توابع در دسترس برای پخش و ضبط صدا عبارتند از mciSendString، mciSendCommand و mciExecute. (برای آشنا شدن با این توابع میتوانید به سراغ MSDN بروید.) این توابع هر کدام پیچیدگی خاص خودشان را دارند. مخصوصا اگر قصد ضبط صدا را داشته باشید که باید پارامترهای زیادی را تنظیم کنید که نرخنمونه برداری، تعداد کانال صوتی، بافر و ... را شامل میشوند. من قصد دارم شما را با تابع mciSendCommand آشنا کنم که با وجود پیچیدگی بیش از حد، استفاده راحتتری از آن هم میسر هست و البته به طریقی که آموزش میدهم. بهتر هست با یک مثال شروع کنیم: شکل کلی این تابع این چنین هست:
Public Declare Function mciSendCommand Lib "winmm.dll" _ Alias "mciSendCommandA" (ByVal wDeviceID As Long, _ ByVal uMessage As Long, _ ByVal dwParam1 As Long, _ ByVal dwParam2 As Any) As Long
پخش فایل صوتی شامل چند مرحله است: 1- باز کردن فایل صوتی 2- دستور پخش 3- بستن فایل (که حتما باید انجام بشه) باز کردن فایل صوتی خود شامل پارامترهایی است که در ساختار زیر مشخص میشود:
Private Type MCI_OPEN_PARMS dwCallback As Long wDeviceID As Long lpstrDeviceType As String lpstrElementName As String lpstrAlias As String End Type البته باید ذکر کنم که برخی پارامترها در شرایط خاصی مقدار دهی میشوند تا کار مشخصی را انجام دهند (پارامتر سوم، بعدا مثال میآرم) کد زیر یک فایل صوتی را باز میکند و هندل آن را در صورت موفقیت جایی نگه میداریم، چون از این به بعد ما با این هندل خیلی کار داریم. پارامتر آخر از تابع mciSendCommand حاوی ساختار مرتبط با نحوه عمل است.
Dim dwReturn As Long Dim mciOpenParms As MCI_OPEN_PARMS 'Open a waveform-audio device with filename for play. mciOpenParms.lpstrDeviceType = "WaveAudio" mciOpenParms.lpstrElementName = filename dwReturn = mciSendCommand(0, MCI_OPEN, _ MCI_OPEN_ELEMENT Or MCI_OPEN_TYPE, _ mciOpenParms) If dwReturn Then MsgBox "Failed to open device; don't close it, just return error." Exit Sub End If 'The device opened successfully; get the device ID. wDeviceID = mciOpenParms.wDeviceID
و برای پخش از کد زیر استفاده میکنیم که بعد از کد باز کردن فایل میگذاریم:
dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, 0, vbNull) If dwReturn Then mciSendCommand wDeviceID, MCI_Close, 0, vbNull MsgBox "MCI_PLAY not succed!" Exit Sub End If
اگر دقت کنید پارامتر سوم مقدار صفر را داراست. این پارامتر میتواند به نحوی مشخص شود که با اجرای دستور پخش، کنترل به برنامه داده شود یا تا زمانی که پخش به اتمام نرسیده برنامه منتظر بماند. و مشخههای دیگر. چون ذکر نکردیم پس کنترل برنامه را در حین پخش در دست میگیریم. و سرانجام با این کد فایل را میبندیم:
Dim dwReturn As Long dwReturn = mciSendCommand(wDeviceID, MCI_Close, MCI_WAIT, vbNull) If dwReturn Then mciSendCommand wDeviceID, MCI_Close, 0, vbNull MsgBox "MCI_Close not succed!" Exit Sub End If
و اما ضبط صدا. برای ضبط باید از ساختار پیچیده زیر استفاده کنیم:
Private Type MCI_WAVE_SET_PARMS dwCallback As Long dwTimeFormat As Long dwAudio As Long wInput As Long wOutput As Long wFormatTag As Integer wReserved2 As Integer nChannels As Integer wReserved3 As Integer nSamplesPerSec As Long nAvgBytesPerSec As Long nBlockAlign As Integer wReserved4 As Integer wBitsPerSample As Integer wReserved5 As Integer End Type
برای یک ضبط ساده باید این همه پارامتر را مقدار دهی کنید و تازه ممکن است صدا بر اساس مقادیر اشتباه بی کیفیت و نامطلوب ضبط شود. از همه اینها که بگذریم قصد من این بود تا ترفندی را به شما آموزش بدهم که خیلی راحت صدا را به هر فرمتی که خواستید ضبط کنید.
.:: CODEC ::. این کلمه مخفف واژههای COmpress/DECompress هست و به زبان سادهتر درایوری است که عمل کدسازی و دیکودسازی اطلاعات را انجام میدهد، البته برای کاربر محسوس نیست و به نوعی در پشت پرده انجام میگیرد. وقتی شما فایلهای wav را در سیستم پخش میکنید، باید codec فایلهای wav در سیستم نصب شده باشد وگرنه قادر به پخش نیستید که البته بهمراه ویندوز این درایورها نصب میشوند. برای فایلهای mp3 نیز همین قضیه صادق هست و غیره. برای اینکه بدانید بر روی سیستم شما چه codecهایی نصب شده مراحل زیر را دنبال کنید:
Control Panel -> Sound & Audio Device -> Hardware -> select Audio Codec from list -> click on Properties.
با این توضیحاتی که آمد میخواهیم بر اساس یکی از codecهای نصب شده اقدام به ضبط صدا کنیم. لازم به ذکر است که برخی codecها فقط حاوی بخش پخش هستند و امکان ضبط رو ندارند! برسیم به هدف اصلی از این صحبتها.
1- Sound Recorder ویندوز رو باز کنید و سپس از منوی File گزینه Save As... را انتخاب کنید. 2- دکمه Change را کلیک کنید تا لیست codec ها ظاهر شود. 3- گزینه Format را با codecی که میخواهید تنظیم کنید. 4- OK کنید و بعد نام فایل را مشخص کنید و Save نمائید.
با طی این 4 مرحله شما یک فایل صوتی ساختید که فقط حاوی تنظمیات صدا است. یعنی تمام پارامترهای ساختار MCI_WAVE_SET_PARMS
حالا اگر با تابع mciSendCommand این فایل را باز کنید و اقدام به ضبط صدا نمائید، در واقع دارید به فرمتی که میخواهید صدا را ضبط میکنید و درگیر تنظیمات خاصی نیستید. سورسی را که مربوط به همین بخش است، این صحبتها را پیادهسازی کرده و نمونه کاملی از ضبط و پخش به فرمت دلخواه را انجام میدهد. و این نکته که دو فایل با پسوند mrf در کنار برنامه هست، در واقع فایلهای حاوی ساختار هستند(wav) که پسوندشان عوض شده.
برنامه ابتدا لیست تمام فایلهای با پسوند mrf را لیست میکند و در هنگام ضبط به همان فرمتی که انتخاب میکنید اقدام به ضبط میکند. شما میتوانید هر ساختاری را که دوست داشتید با Sound Recorder بسازید و با پسوند mrf در کنار برنامه ذخیره کنید و از نزدیک با چگونگی عمل ضبط آشنا شوید.
امیدوارم که مفید واقع شده باشه اگر سوالی بود حتما بپرسید. موفق باشید
|