PDA

View Full Version : ضبط و پخش صدا



negar84
یک شنبه 19 شهریور 1385, 10:07 صبح
سلام
من توی برنامه ام نیاز به ضبط و پخش صدا دارم ولی هر چی گشتم مطلبی که بتونه نیازمو براورده کنه پیدا نکردم توی برنامه من کاربر باید بتونه پیام مورد نظرش رو ضبط کنه و بعدا هم بتونه پیامی که ضبط کرده رو بشنوه (اگر دکمه های ضبط و پخش به شکل رایجشون باشند بهتره )کسی می تونه کمک کنه
ممنون

M.GhanaatPisheh
یک شنبه 19 شهریور 1385, 13:17 عصر
برای پخش صدا می تونید از کنترل Media Player استفاده کنید.
و اما ضبط صدا، یه سری کامپوننت وجود داره که این امر رو میسر میکه.
ولی پیشنهاد می کنم از API های موجود استفاده کنید. کد زیر رو مطالعه بفرمائید(unsafe نوشته شده و باید Command Line کامپایل کنید، دلیل Unsafe کد نوشتن هم تعریف اشاره گر هایی هست که مشاهده می کنید) :


using System;
using System.Data;
using System.Runtime.InteropServices;

namespace Cowburn.Win32
{
public class VoiceRecorder
{
#region API prototypes
[DllImport("voicectl.dll", EntryPoint="VoiceRecorder_Create")]
private unsafe static extern IntPtr VoiceRecorder_Create(CM_VOICE_RECORDER* voicerec);

[DllImport("coredll.dll", EntryPoint="GetForegroundWindow")]
private unsafe static extern IntPtr GetForegroundWindow();
#endregion

[StructLayout(LayoutKind.Sequential)]
public unsafe struct CM_VOICE_RECORDER
{
public int cb;
public wndStyle dwStyle;
public int xPos;
public int yPos;
public IntPtr hwndParent;
public int id;
public char* lpszRecordFileName;
}

public enum wndStyle : uint
{
VRS_NO_OKCANCEL = 0x0001, // No OK/CANCLE displayed
VRS_NO_NOTIFY = 0x0002, // No parent Notifcation
VRS_MODAL = 0x0004, // Control is Modal
VRS_NO_OK = 0x0008, // No OK displayed
VRS_NO_RECORD = 0x0010, // No RECORD button displayed
VRS_PLAY_MODE = 0x0020, // Immediately play supplied file when launched
VRS_NO_MOVE = 0x0040, // Grip is removed and cannot be moved around by the user
VRS_RECORD_MODE = 0x0080, // Immediately record when launched
VRS_STOP_DISMISS = 0x0100 // Dismiss control when stopped
}

private unsafe CM_VOICE_RECORDER _VoiceRec;
private IntPtr _hRecorder;
private string wavFile = @"\My Documents\~VRec_0.wav";

private IntPtr _Hwnd = (IntPtr)0;

public IntPtr Hwnd
{
get { return _Hwnd; }
set
{
_VoiceRec.hwndParent = value;
_Hwnd = value;
}
}

public unsafe VoiceRecorder()
{
_hRecorder = new IntPtr();
char[] temp = new char[32];

this.Hwnd = GetForegroundWindow();

// Populate temp with the file path of the WAV file
Buffer.BlockCopy(wavFile.ToCharArray(),0,temp,0,2* wavFile.Length);

fixed(char* lpszFileName = temp)
{
_VoiceRec = new CM_VOICE_RECORDER();

_VoiceRec.hwndParent = _Hwnd;
_VoiceRec.dwStyle = wndStyle.VRS_NO_MOVE | wndStyle.VRS_MODAL;
_VoiceRec.cb = (int)Marshal.SizeOf(_VoiceRec);
_VoiceRec.xPos = -1;
_VoiceRec.yPos = -1;
_VoiceRec.lpszRecordFileName = lpszFileName;
}
}

// Show the voice recorder
public unsafe void Show()
{
fixed(CM_VOICE_RECORDER* _VoiceRecPtr = &_VoiceRec)
{
_hRecorder = VoiceRecorder_Create(_VoiceRecPtr);
}
}
}
}

negar84
یک شنبه 19 شهریور 1385, 16:25 عصر
سلام
با تشکر از جوابتون
من کدی که داده بودین رو امتحان کردم تیک allow unsafe code رو هم زدم اما بازم error می ده ...
منظورتون رو از command line کامپایل کنید رو نمی فهمم می شه یه کم بیشتر توضیح بدین
ممنون

M.GhanaatPisheh
یک شنبه 19 شهریور 1385, 16:55 عصر
Command Prompt مربوط به Visual Studio رو باز کنید و با دستور CSC پروژه رو کامپایل کنید.
در مورد switch های این دستور توی MSDN تحقیق کنید.

rezayat
چهارشنبه 13 دی 1385, 17:46 عصر
من نتونستم از این کد استفاده کنم حتی با این حال که اون را به dll تبدیل کردم اولا روش استفادشو اصلا بلد نیستم چه برسه روش کارشو و الان هم نیاز به این دارم که بتونم یک صدا را ضبط کنم لطفا روش استفاده را توضیح دهید .
در ضمن با ایجاد یک شی از نوع آن یک error پیدا می شد که coredll را نمی تونست پیدا کنه آیا شما متوانید یک نمونه برنامه ساده از این کد را برای من بفرستید:لبخندساده:
masoud_rezayat_eng@yahoo.com

rezayat
پنج شنبه 14 دی 1385, 15:10 عصر
در مورد ضبط صدا باز بیشتر تحقیق کردم و در codproject به یک کد با C# رسیدم که آدرس اون
http://www.codeproject.com/cs/media/nbass.asp هست.
دوستان میتونن از این کد که چندین مثال داره البته برای پخش کردن صدا مثال داره و برای ضبط آن مثالی نزده استفاده کنند .
هر اطلاعات جدیدی که پیدا کردم در همین تاپیک قید خواهم کرد .
دوستان اگر بتوانند و این کد را بیشتر آنالیز کنند و از آن استفاده کنند تا توانیم بهتر باگ های نرم افزاری آن را پیدا کنیم لطف کرده اند.:لبخندساده: