带有monotouch上传wav文件的iOS失败

时间:2014-01-11 16:18:02

标签: ios xamarin.ios wav

我正在编写一个带有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);

1 个答案:

答案 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);
        }