0
웨이브 파일에 에코를 추가하려면 먼저 파일을 열고 먼저 저장해야합니다. 몇 가지 방법을 썼지 만 출력 파일이 올바르지 않습니다.WAVE 파일을 읽고 쓰면 재생할 수없는 결과가 출력됩니다.
테스트 입력 파일 크기 : 731 014
출력 파일 sieze : (730) 898
그러나 "디스크 공간"733 184
오류 코드 모두 파일에 대해 동일 또는 열 때 표시되는 내용은 무엇입니까? 0xc00d36c4
여기에서 문제가 될 수있는 것은 무엇입니까? 이것은 매우 간단 해 보이지만 작동하지 않습니다.
class WaveFile
{
struct WaveHeader
{
public byte[] RiffID;
public uint fileSize;
public byte[] format;
//Wave format chunk 1
public byte[] fmtID;
public uint fmtSize;
public ushort audioFormat;
public ushort channels;
public uint sampleRate;
public uint byteRate;
public ushort blockAlign;
public int bitsPerSample;
//Wave format chunk 2
public byte[] dataID;
public uint dataSize;
}
uint samples;
public List<short> L;
public List<short> R;
WaveHeader header = new WaveHeader();
//loading file, preparation for modyfying
public bool loadWaveFile(string filePath)
{
using (FileStream fs = File.Open(filePath, FileMode.Open))
using (BinaryReader reader = new BinaryReader(fs))
{
// chunk 0
header.RiffID = reader.ReadBytes(4);
header.fileSize = reader.ReadUInt32();
header.format = reader.ReadBytes(4);
// chunk 1
header.fmtID = reader.ReadBytes(4);
header.fmtSize = reader.ReadUInt32();
header.audioFormat = reader.ReadUInt16();
header.channels = reader.ReadUInt16();
header.sampleRate = reader.ReadUInt32();
header.byteRate = reader.ReadUInt32();
header.blockAlign = reader.ReadUInt16();
header.bitsPerSample = reader.ReadInt16();
// chunk 2
header.dataID = reader.ReadBytes(4);
header.dataSize = reader.ReadUInt32();
// DATA is stereo
L = new List<short>();
R = new List<short>();
samples = header.dataSize/header.blockAlign;
for (int i = 0; i < samples; i++)
{
L.Add((short)reader.ReadUInt16());
R.Add((short)reader.ReadUInt16());
}
reader.Close();
fs.Close();
}
return true;
}
public bool addEcho(int threadsNumber, int echoesNumber, int delay, int attenuation)
{
return true;
}
public bool saveWaveFile(string savingPath)
{
using (FileStream fs = new FileStream(@savingPath + "\\echo.wav", FileMode.Create))
using (BinaryWriter writer = new BinaryWriter(fs))
{
//chunk 0
writer.Write(header.RiffID);
writer.Write(header.fileSize);
writer.Write(header.format);
//chunk 1
writer.Write(header.fmtID);
writer.Write(header.fmtSize);
writer.Write(header.audioFormat);
writer.Write(header.channels);
writer.Write(header.sampleRate);
writer.Write(header.byteRate);
writer.Write(header.blockAlign);
writer.Write(header.bitsPerSample);
//chunk 2
writer.Write(header.dataID);
writer.Write(header.dataSize);
for (int i = 0; i < samples; i++)
{
writer.Write(L[i]);
writer.Write(R[i]);
}
writer.Close();
fs.Close();
return true;
}
}
}
가를 비교하는 이진은 diff 도구를 사용하여 여기 내 헤더, 읽기 및 쓰기 방법입니다 두 파일을보고 왜 다른지 확인하십시오 –
"디스크 공간"은 문제와 관련이 없습니다. 그것에 신경 쓰지 마라. 이것은 파일 시스템의 블록 크기와 파일이 사용하는 파일 시스템 블록의 수를 곱한 것입니다. – Xaver
blockalign은 NumChannels * BitsPerSample/8입니다. 따라서 실제로 스테레오라면 samples = dataSize/blockAlign의 수를 결정할 때 정확해야합니다. 입력 파일 크기보다 짧은 116 바이트에 불과합니다. 인코딩이 여기서 문제가 될 수 있습니다> AudioFormat의 가치는 무엇입니까? 또한 [이것을 참조하십시오] (http://soundfile.sapp.org/doc/WaveFormat/) – dlatikay