PDA

View Full Version : سوال: ضبط صدا



abasfar
شنبه 23 بهمن 1389, 16:39 عصر
سلام کسی با فضای کاری Microsoft.DirectX.DirectSound
صدا ضبط کرده که الان هم تو ویندوز 7 کار کنه میشه به من هم کدشو بده من زیاد جستجو کردم ولی هیچ کدامشان کار نکردند



using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Microsoft.DirectX;
using System.IO;
using Microsoft.DirectX.DirectSound;
using System.Threading;

using Buffer = Microsoft.DirectX.DirectSound.Buffer;

namespace WAppSoundRecord
{
public partial class Form1 : Form
{
private Thread _captureThread;

private Device device;
private Capture capture;
private Buffer buffer;
private SecondaryBuffer secondaryBuffer;
private BufferDescription bufferDesc;
private CaptureBuffer captureBuffer;
private WaveFormat waveFormat;
private CaptureBufferDescription captureBuffDesc;
private MemoryStream stream;
private byte[] streamBuffer;

public Form1()
{
InitializeComponent();

CreateDevice();

CreateWaveFormat();
CreateBufferDescription();

SetCooperativeLevel();

CreateCapture();
CreateCapureDescription();
CreateCaptureBuffer();
CreateStreamBuffer();
CreateStream();
}

private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
_captureThread = new Thread(new ThreadStart(CaptureThread));
_captureThread.Start();
}

private void CreateDevice()
{
device = new Device();
}

private void CreateBufferDescription()
{
bufferDesc = new BufferDescription();
bufferDesc.Format = waveFormat;
bufferDesc.BufferBytes = 100000;
bufferDesc.ControlPositionNotify = true;
bufferDesc.ControlFrequency = true;
bufferDesc.ControlPan = true;
bufferDesc.ControlVolume = true;
}

private void SetCooperativeLevel()
{
device.SetCooperativeLevel(
this, CooperativeLevel.Priority // The cooperative level
);
}

private void CreateWaveFormat()
{
waveFormat = new WaveFormat();
waveFormat.BitsPerSample = 8;
waveFormat.BlockAlign = 1;
waveFormat.Channels = 1;
waveFormat.AverageBytesPerSecond = 20500;
waveFormat.SamplesPerSecond = 20500;
waveFormat.FormatTag = WaveFormatTag.Pcm;
}

private void CreateCapture()
{
capture = new Capture();
}

private void CreateCapureDescription()
{
captureBuffDesc = new CaptureBufferDescription();
captureBuffDesc.BufferBytes = 100000;
captureBuffDesc.Format = this.waveFormat;
}

private void CreateCaptureBuffer()
{
captureBuffer = new CaptureBuffer(captureBuffDesc, capture);
}

private void CreateStream()
{
stream = new MemoryStream(streamBuffer);
}

private void CreateStreamBuffer()
{
streamBuffer = new byte[100000];
for (int i = 0; i < 100000; i++)
streamBuffer[i] = 0;
}

private void CaptureThread()
{
this.captureBuffer.Start(true);

while (true)
{
byte[] data = (byte[])captureBuffer.Read(0, typeof(byte), LockFlag.None, 100000);
MemoryStream stream = new MemoryStream(data, false);

buffer = new Buffer(bufferDesc, device);
buffer.Write(0, stream, (int)stream.Length, LockFlag.EntireBuffer);

secondaryBuffer = new SecondaryBuffer(stream, device);
secondaryBuffer.Play(0, BufferPlayFlags.Default);

}
}


}
}

abasfar
یک شنبه 24 بهمن 1389, 15:38 عصر
کسی نیست حتی از مدیران
با این هم نشد لطفا کمک کنید




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectSound;

namespace sound
{
public partial class Form1 : Form
{
private Thread CaptureSoundThread = null;
public CaptureBuffer applicationBuffer = null;
private SecondaryBuffer soundBuffer = null;
private Device soundDevice = null;

public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
CaptureSoundThread = new Thread(new ThreadStart(WaitThread));
CaptureSoundThread.Start();
}

private void Form1_Load(object sender, EventArgs e)
{
soundDevice = new Device();
soundDevice.SetCooperativeLevel(this, CooperativeLevel.Normal);

// Set up our wave format to 44,100Hz, with 16 bit resolution
WaveFormat wf = new WaveFormat();
wf.FormatTag = WaveFormatTag.Pcm;
wf.SamplesPerSecond = 44100;
wf.BitsPerSample = 16;
wf.Channels = 1;
wf.BlockAlign = (short)(wf.Channels * wf.BitsPerSample / 8);
wf.AverageBytesPerSecond = wf.SamplesPerSecond * wf.BlockAlign;

int samplesPerUpdate = 512;

// Create a buffer with 2 seconds of sample data
BufferDescription bufferDesc = new BufferDescription(wf);
bufferDesc.BufferBytes = samplesPerUpdate * wf.BlockAlign * 2;
bufferDesc.ControlPositionNotify = true;
bufferDesc.GlobalFocus = true;

soundBuffer = new SecondaryBuffer(bufferDesc, soundDevice);
}

private void WaitThread()
{
while (true)
{
byte[] CaptureData = null;
CaptureData = (byte[])applicationBuffer.Read(0, typeof(byte), LockFlag.None);
soundBuffer.Write(0, CaptureData, LockFlag.None);
// Start it playing
soundBuffer.Play(0, BufferPlayFlags.Looping);
}
}
}
}

Unknownlive
چهارشنبه 04 اسفند 1389, 17:55 عصر
دوست عزیز جواب را برات ارسال کردم برو ببین مشکلی داشتی بپرس راه های زیاد دیگه ای هم دارم

abasfar
پنج شنبه 05 اسفند 1389, 11:29 صبح
ممنون از کمکتان اما من میخوام فقط wav را زخیره کنم اما به روش اسون تا من ارائه بدم تا تمام همکلاسی های من انرا حفظ کنند در امتحان بنویسیم (راستش)
وبه چون هدر را باید خودمان بنویسیم اگر امکانش باشه به صورت باینری باشه تا ما بتوانیم هدر را اضافه کنیم البته روش هدر بندی هم تو پروژه باشه خیلی ممنون میشم.

abasfar
پنج شنبه 05 اسفند 1389, 15:13 عصر
دوست عزیز ببین این پروژه پیشنهادی شما lame_enc.dll داره که سورس شو نداده

exlord
پنج شنبه 05 اسفند 1389, 16:55 عصر
من برای ضبط صدا از NAudio (http://naudio.codeplex.com/)استفاده کردم ... خیلی سادس اون ...

hassan_kahrizy
پنج شنبه 05 اسفند 1389, 17:03 عصر
بسمه تعالی
با سلام
کلاس fmod هم خیلی قوی و خوب هستش
اون هم تست کنید بد نیست
مثال هم داره که زیاد در گیر کدهاش نشید
چون نسخه مورد نیاز شما رایگاه هستش تو فرومش هم پشتیبانی خوبی داره

abasfar
جمعه 06 اسفند 1389, 23:18 عصر
من برای ضبط صدا از NAudio (http://naudio.codeplex.com/)استفاده کردم ... خیلی سادس اون ...

ممنون از جواب شما اما این خودش خیلی کار و سخت کرده چون باید سخت افزار را بشناسه ونصبت به ان عکس العمل نشان بده

به نظر من کار خیلی راحتر میشه با directx



کلاس fmod هم خیلی قوی و خوب هستش
اون هم تست کنید بد نیست
مثال هم داره که زیاد در گیر کدهاش نشید
چون نسخه مورد نیاز شما رایگاه هستش تو فرومش هم پشتیبانی خوبی داره

ممنون از جواب شما اما یا من مثال پیدا نکردم ویا نمیتوانیم به فایل بافر ان دستیابی پیدا کنیم

hassan_kahrizy
شنبه 07 اسفند 1389, 08:56 صبح
بسمه تعالی
با سلام
http://fmod.org/
http://www.fmod.org/forum/
وقتی برنامه را نصب می کنید مثال هاش رو داخل شاخه نصب میریزه

برای سوال هاتون برید تو فروم جواب می گیرید
بازی هایی مثل need for speed هم با این کلاس نوشته شده است

hassan_kahrizy
شنبه 07 اسفند 1389, 08:59 صبح
مشتری های آن
http://www.fmod.org/index.php/customers

exlord
شنبه 07 اسفند 1389, 09:27 صبح
ممنون از جواب شما اما این خودش خیلی کار و سخت کرده چون باید سخت افزار را بشناسه ونصبت به ان عکس العمل نشان بده


یعنی شما میخوای بدونه اینکه سخت افزارتو شناسایی بکنی و با هر چی که شد صدا رو ضبط بکنی ؟


int waveInDevices = WaveIn.DeviceCount;
for (int i = 0; i < waveInDevices; i++)
{
WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(i);
cmbAudioD.Items.Add(deviceInfo.ProductName);
if (deviceInfo.ProductName == Properties.Settings.Default.AudioD)
cmbAudioD.SelectedIndex = i;
}

private WaveIn waveInStream;
private WaveFileWriter writer;
private void RecordAudio()
{
waveInStream = new WaveIn();
waveInStream.DeviceNumber = cmbAudioD.SelectedIndex;
int sampleRate = Properties.Settings.Default.ASampleRate;// 8000 ? 11025 ? 22050 ? 44100
int channels = WaveIn.GetCapabilities(cmbAudioD.SelectedIndex).Ch annels;//mono ? sterio
int bits = Properties.Settings.Default.ASampleBit;// 8 ? 16
waveInStream.WaveFormat = new WaveFormat(sampleRate, bits, channels);

writer = new WaveFileWriter(this.wavFilePath, waveInStream.WaveFormat);
new FileInfo(this.wavFilePath).Attributes = FileAttributes.Hidden;
waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
waveInStream.StartRecording();
}
void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
{
writer.WriteData(e.Buffer, 0, e.BytesRecorded);
}
private void StopAudioRecording()
{
waveInStream.StopRecording();
waveInStream.Dispose();
waveInStream = null;
writer.Close();
writer = null;
}