我正在编写一个带有monotouch的iOS应用程序。 我正在通过AVrecorder录制声音文件。我创建了一个工作的wav文件(我检查)。 我希望通过将其作为字节数组传递给我的服务器(似乎是最好的方法) 问题是传递给服务器的文件已损坏。 这就是我将wav转换为byte []的方法。我有什么想法吗?
(我迭代查找文件大小一次,然后复制所有内容。我这样做的原因是GetProperty返回了错误的文件大小。)
string path = GlobalData.UserDefaults.StringForKey(GlobalData.HeykuSoundPathDefault);
AudioFile song = AudioFile.Open(path,AudioFilePermission.Read,AudioFileType.WAVE);
byte [] audioBuffer = new byte[4000000];
int copied = 0;
int offset = 0;
while(true)
{
copied = song.Read(offset,audioBuffer,0,4096,false);
if(copied == -1)
{
break;
}
else
{
offset += copied;
Console.WriteLine(offset);
}
}
audioBuffer = new byte[offset];
copied = song.Read(0,audioBuffer,0,offset,false);
答案 0 :(得分:0)
您是否尝试过简单地使用流?像这样:
using (var fileReader = new StreamReader("filename_here"))
{
using (var webStream = webClient.OpenWrite("http://www.myuploader.com"))
{
fileReader.BaseStream.CopyToAsync(webStream);
}
}
上述方法应该复制整个文件,包括Wave标头。我怀疑AudioFile可能会返回你不包含标题的纯PCM音频。这是标头编写器功能的一个示例:
private void WriteHeader()
{
this.writer.Seek(0, SeekOrigin.Begin);
// chunk ID
this.writer.Write('R');
this.writer.Write('I');
this.writer.Write('F');
this.writer.Write('F');
this.writer.Write(this.ByteCount);
this.writer.Write('W');
this.writer.Write('A');
this.writer.Write('V');
this.writer.Write('E');
this.writer.Write('f');
this.writer.Write('m');
this.writer.Write('t');
this.writer.Write(' ');
this.writer.Write((int)16);
this.writer.Write((short)1);
this.writer.Write((short)this.ChannelCount);
this.writer.Write((int)this.SampleRate);
this.writer.Write((int)this.SampleRate*2);
this.writer.Write((short)2);
this.writer.Write((short)this.BitsPerSample);
this.writer.Write('d');
this.writer.Write('a');
this.writer.Write('t');
this.writer.Write('a');
this.writer.Write((int)this.byteCount);
}
有关文件格式的更多信息:https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
至于从AudioFile读取数据,这可能会更好:
var song = AudioFile.Open(path,AudioFilePermission.Read,AudioFileType.WAVE);
var audioBuffer = new byte[song.Length];
int copied = 0;
while (copied < audioBuffer.Length)
{
copied += song.Read (copied, audioBuffer, copied, 4096, false);
}