首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

1000分求个录音&保存&回放的例程(帮顶得这贴的100分)解决方案

2012-03-25 
1000分求个录音&保存&回放的例程(帮顶得这贴的100分)RT,如果直接给出Mp3格式的东西,再加500分。[解决办法]

1000分求个录音&保存&回放的例程(帮顶得这贴的100分)
RT,如果直接给出Mp3格式的东西,再加500分。

[解决办法]
我新手,没做过
友情支持
帮顶

[解决办法]
路过,帮顶
[解决办法]
友情帮顶
[解决办法]
http://www.cnblogs.com/KeithDan/archive/2006/12/19/596833.html
[解决办法]
using System;
using System.Threading;
using System.Runtime.InteropServices;

namespace WaveLib
{
internal class WaveInHelper
{
public static void Try(int err)
{
if (err != WaveNative.MMSYSERR_NOERROR)
throw new Exception(err.ToString());
}
}

public delegate void BufferDoneEventHandler(IntPtr data, int size);

internal class WaveInBuffer : IDisposable
{
public WaveInBuffer NextBuffer;

private AutoResetEvent m_RecordEvent = new AutoResetEvent(false);
private IntPtr m_WaveIn;

private WaveNative.WaveHdr m_Header;
private byte[] m_HeaderData;
private GCHandle m_HeaderHandle;
private GCHandle m_HeaderDataHandle;

private bool m_Recording;

internal static void WaveInProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
{
if (uMsg == WaveNative.MM_WIM_DATA)
{
try
{
GCHandle h = (GCHandle)wavhdr.dwUser;
WaveInBuffer buf = (WaveInBuffer)h.Target;
buf.OnCompleted();
}
catch
{
}
}
}

public WaveInBuffer(IntPtr waveInHandle, int size)
{
m_WaveIn = waveInHandle;

m_HeaderHandle = GCHandle.Alloc(m_Header, GCHandleType.Pinned);
m_Header.dwUser = (IntPtr)GCHandle.Alloc(this);
m_HeaderData = new byte[size];
m_HeaderDataHandle = GCHandle.Alloc(m_HeaderData, GCHandleType.Pinned);
m_Header.lpData = m_HeaderDataHandle.AddrOfPinnedObject();
m_Header.dwBufferLength = size;
WaveInHelper.Try(WaveNative.waveInPrepareHeader(m_WaveIn, ref m_Header, Marshal.SizeOf(m_Header)));
}
~WaveInBuffer()
{
Dispose();
}

public void Dispose()
{
if (m_Header.lpData != IntPtr.Zero)
{
WaveNative.waveInUnprepareHeader(m_WaveIn, ref m_Header, Marshal.SizeOf(m_Header));
m_HeaderHandle.Free();
m_Header.lpData = IntPtr.Zero;
}
m_RecordEvent.Close();
if (m_HeaderDataHandle.IsAllocated)
m_HeaderDataHandle.Free();
GC.SuppressFinalize(this);
}

public int Size
{
get { return m_Header.dwBufferLength; }
}

public IntPtr Data
{
get { return m_Header.lpData; }
}

public bool Record()
{
lock(this)
{
m_RecordEvent.Reset();
m_Recording = WaveNative.waveInAddBuffer(m_WaveIn, ref m_Header, Marshal.SizeOf(m_Header)) == WaveNative.MMSYSERR_NOERROR;
return m_Recording;
}
}

public void WaitFor()
{
if (m_Recording)
m_Recording = m_RecordEvent.WaitOne();
else
Thread.Sleep(0);
}

private void OnCompleted()
{
m_RecordEvent.Set();
m_Recording = false;
}
}

public class WaveInRecorder : IDisposable
{
private IntPtr m_WaveIn;


private WaveInBuffer m_Buffers; // linked list
private WaveInBuffer m_CurrentBuffer;
private Thread m_Thread;
private BufferDoneEventHandler m_DoneProc;
private bool m_Finished;

private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveInBuffer.WaveInProc);

public static int DeviceCount
{
get { return WaveNative.waveInGetNumDevs(); }
}

public WaveInRecorder(int device, WaveFormat format, int bufferSize, int bufferCount, BufferDoneEventHandler doneProc)
{
m_DoneProc = doneProc;
WaveInHelper.Try(WaveNative.waveInOpen(out m_WaveIn, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));
AllocateBuffers(bufferSize, bufferCount);
for (int i = 0; i < bufferCount; i++)
{
SelectNextBuffer();
m_CurrentBuffer.Record();
}
WaveInHelper.Try(WaveNative.waveInStart(m_WaveIn));
m_Thread = new Thread(new ThreadStart(ThreadProc));
m_Thread.Start();
}
~WaveInRecorder()
{
Dispose();
}
public void Dispose()
{
if (m_Thread != null)
try
{
m_Finished = true;
if (m_WaveIn != IntPtr.Zero)
WaveNative.waveInReset(m_WaveIn);
WaitForAllBuffers();
m_Thread.Join();
m_DoneProc = null;
FreeBuffers();
if (m_WaveIn != IntPtr.Zero)
WaveNative.waveInClose(m_WaveIn);
}
finally
{
m_Thread = null;
m_WaveIn = IntPtr.Zero;
}
GC.SuppressFinalize(this);
}
private void ThreadProc()
{
while (!m_Finished)
{
Advance();
if (m_DoneProc != null && !m_Finished)
m_DoneProc(m_CurrentBuffer.Data, m_CurrentBuffer.Size);
m_CurrentBuffer.Record();
}
}
private void AllocateBuffers(int bufferSize, int bufferCount)
{
FreeBuffers();
if (bufferCount > 0)
{
m_Buffers = new WaveInBuffer(m_WaveIn, bufferSize);
WaveInBuffer Prev = m_Buffers;
try
{
for (int i = 1; i < bufferCount; i++)
{
WaveInBuffer Buf = new WaveInBuffer(m_WaveIn, bufferSize);
Prev.NextBuffer = Buf;
Prev = Buf;
}
}
finally
{
Prev.NextBuffer = m_Buffers;
}
}
}
private void FreeBuffers()
{
m_CurrentBuffer = null;
if (m_Buffers != null)
{
WaveInBuffer First = m_Buffers;
m_Buffers = null;

WaveInBuffer Current = First;
do
{
WaveInBuffer Next = Current.NextBuffer;
Current.Dispose();
Current = Next;
} while(Current != First);
}
}
private void Advance()
{
SelectNextBuffer();
m_CurrentBuffer.WaitFor();
}
private void SelectNextBuffer()
{
m_CurrentBuffer = m_CurrentBuffer == null ? m_Buffers : m_CurrentBuffer.NextBuffer;
}
private void WaitForAllBuffers()
{
WaveInBuffer Buf = m_Buffers;
while (Buf.NextBuffer != m_Buffers)
{
Buf.WaitFor();
Buf = Buf.NextBuffer;
}
}
}
}

[解决办法]
我有详细的代码。需要的话,请联系我,开贴给分吧!再顶一个,记得加一百分,哈哈!
[解决办法]
我的邮箱是:tangwei168@sina.com
[解决办法]
up


[解决办法]
要求贴出,或者给出链接,学习!!! 我正好也有这方面的要求,能不能给我也发一份,huheng_0_0@163.com
[解决办法]
学习一下
[解决办法]
up
[解决办法]
顶一个!发代码学学习一下!MSN:wenyuan_penn@hotmail.com
[解决办法]
顶!能给我也发一个吗?lxmfll2000@sohu.com
[解决办法]
路过帮顶
[解决办法]
帮顶
[解决办法]
关注
[解决办法]
学习下
UP

[解决办法]
路过..

学习帮顶了...
[解决办法]
直接调windows录音机不就可以了?
[解决办法]
UP
[解决办法]
直接顶了在说...
[解决办法]
我有DX写的录音
不过不太方便给...
[解决办法]
帮顶
[解决办法]
帮顶,友情帮顶。
[解决办法]
帮顶
[解决办法]
帮顶
学习
[解决办法]
学习ing
[解决办法]
帮顶
[解决办法]
顶一下
[解决办法]
?


http://www.cnblogs.com/KeithDan/archive/2006/12/19/596833.html

刚刚仔细看了,缺了4个主要的文件!
====================================
http://www.cnblogs.com/KeithDan/archive/2006/12/19/596833.html中有一个链接,指向下边这个网址,楼主进去看看。
http://www.codeproject.com/cs/media/cswavrec.asp?df=100&forumid=16677&exp=0&select=1107344


回复人:closetome(即鹿无虞,惟入于林中。君子几,不如舍。往吝。) ( 三级(初级)) 信誉:100

老兄贴的代码是code project上面的wavelib中Waveout.cs的源码而已。
===================================
呵呵,没法一次顶过三帖的。
[解决办法]
顶一下
[解决办法]
关注
[解决办法]
不知道你有没有1000分,不过还是帮顶!
[解决办法]
mark

保存...
[解决办法]
顶一下

[解决办法]
up
[解决办法]
顶啊
------解决方案--------------------


帮顶
[解决办法]
up
[解决办法]
以前用Delphi写过 声音捕获的小程序

没有用.NET搞过

如果需要搞mp3格式需要第三方控件吧
[解决办法]
look this :
http://www.softplatz.com/Soft/Development/Components-Libraries/Audio-Sound-Recorder-for-NET.html

seems not free


[解决办法]
帮顶
学习
[解决办法]
帮顶
[解决办法]
学习中
[解决办法]

[解决办法]
郁闷!
[解决办法]
我记得我用单片机做过, hoho
[解决办法]
呵呵

热点排行