嗨,我已经做了一些试验与WAV文件,我需要能够播放WAV文件流。我会做什么是打开一个文件,得到的wav文件的原始数据。我通过使用由NightFox提供的这个类:
http://www.codeproject.com/KB/audio-video/CSharpWAVClassAndMixing.aspx
然后,当我有我的原始数据,提取使用WAVFile是建在函数GetNextSampleAs16Bit()。
这里是,我的类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
// I want to be able to input a list of shorts, and it will give me
// a playable stream internal wav file.
namespace Aurasen
{
class InternalWAVFile
{
private MemoryStream mMemoryStream;
private bool mStereo;
private int mSampleRateHz;
private short mBitsPerSample;
private int mDataSizeBytes;
public InternalWAVFile(short[] samples, bool pStereo, int pSampleRateHz, short pBitsPerSample)
{
if (mMemoryStream != null)
{
mMemoryStream.Close();
mMemoryStream.Dispose();
mMemoryStream = null;
}
mMemoryStream = new MemoryStream();
mStereo = pStereo;
mSampleRateHz = pSampleRateHz;
mBitsPerSample = pBitsPerSample;
Create();
foreach (short s in samples)
{
byte[] buffer = BitConverter.GetBytes(s);
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer);
AddSample_ByteArray(buffer);
}
mMemoryStream.Close();
}
public MemoryStream GetStream()
{
return mMemoryStream;
}
private void AddSample_ByteArray(byte[] pSample)
{
try
{
int numBytes = pSample.GetLength(0);
mMemoryStream.Write(pSample, 0, numBytes);
}
catch
{
}
}
// Adds the header to the memory stream so that now I can add the data
private void Create()
{
try
{
// set the member data from the params
byte mNumChannels = mStereo ? (byte)2 : (byte)1;
char[] mWAVHeader = new char[4];
char[] mRIFFType = new char[4];
"RIFF".CopyTo(0, mWAVHeader, 0, 4);
"WAVE".CopyTo(0, mRIFFType, 0, 4);
// RIFF chunk (12 bytes total)
// Write the chunk IDD ("RIFF", 4 bytes)
byte[] buffer = StrToByteArray("RIFF");
mMemoryStream.Write(buffer, 0, 4); // gets stuck here..won't write to the stream
if (mWAVHeader == null)
mWAVHeader = new char[4];
"RIFF".CopyTo(0, mWAVHeader, 0, 4);
// File size size (4 bytes) - This will be 0 for now
Array.Clear(buffer, 0, buffer.GetLength(0));
mMemoryStream.Write(buffer, 0, 4);
// RIFF type ("WAVE")
buffer = StrToByteArray("WAVE");
mMemoryStream.Write(buffer, 0, 4);
if (mRIFFType == null)
mRIFFType = new char[4];
"WAVE".CopyTo(0, mRIFFType, 0, 4);
// Format chunk (24 bytes total)
// "fmt " (ASCII characters)
buffer = StrToByteArray("fmt ");
mMemoryStream.Write(buffer, 0, 4);
// Length of format chunk (always 16, 4 bytes)
Array.Clear(buffer, 0, buffer.GetLength(0));
buffer[0] = 16;
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer);
mMemoryStream.Write(buffer, 0, 4);
// 2 bytes (always 1)
Array.Clear(buffer, 0, buffer.GetLength(0));
buffer[0] = 1;
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer, 0, 2);
mMemoryStream.Write(buffer, 0, 2);
// # of channels (2 bytes)
Array.Clear(buffer, 0, buffer.GetLength(0));
buffer[0] = mNumChannels;
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer, 0, 2);
mMemoryStream.Write(buffer, 0, 2);
// Sample rate (4 bytes)
buffer = BitConverter.GetBytes(mSampleRateHz);
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer);
mMemoryStream.Write(buffer, 0, 4);
// Calculate the # of bytes per sample: 1=8 bit Mono, 2=8 bit Stereo or
// 16 bit Mono, 4=16 bit Stereo
short bytesPerSample = 0;
if (mStereo)
bytesPerSample = (short)((mBitsPerSample / 8) * 2);
else
bytesPerSample = (short)(mBitsPerSample / 8);
// Write the # of bytes per second (4 bytes)
int mBytesPerSec = mSampleRateHz * bytesPerSample;
buffer = BitConverter.GetBytes(mBytesPerSec);
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer);
mMemoryStream.Write(buffer, 0, 4);
// Write the # of bytes per sample (2 bytes)
byte[] buffer_2bytes = BitConverter.GetBytes(bytesPerSample);
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer_2bytes);
mMemoryStream.Write(buffer_2bytes, 0, 2);
// Bits per sample (2 bytes)
buffer_2bytes = BitConverter.GetBytes(mBitsPerSample);
if (!BitConverter.IsLittleEndian)
Array.Reverse(buffer_2bytes);
mMemoryStream.Write(buffer_2bytes, 0, 2);
// Data chunk
// "data" (ASCII characters)
buffer = StrToByteArray("data");
mMemoryStream.Write(buffer, 0, 4);
// Length of data to follow (4 bytes) - This will be 0 for now
Array.Clear(buffer, 0, buffer.GetLength(0));
mMemoryStream.Write(buffer, 0, 4);
mDataSizeBytes = 0;
// Total of 44 bytes written up to this point.
// The rest of the file is the audio data
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static byte[] StrToByteArray(String pStr)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
return encoding.GetBytes(pStr);
}
}
}
但由于某些原因,当我用这个功能来发挥这样的音频:
它是所有说的头信息被破坏,即使我使用的建设作为类的WAVFile用途的创造者的wav文件内容相同的方法。
没有任何人有任何建议吗?{BR}
{C}