2014-05-22 27 views
0

我用c#錄製了音頻.wav文件,我試圖上傳它以獲取服務器的響應。我的問題是音頻文件的小尺寸上傳得當,但是當我上傳較大尺寸的音頻(例如10分鐘)時,即時獲取系統內存異常。上面的代碼是獲取api響應的插圖。如果有任何解決方案,請幫助。在windows phone上傳音頻時發生內存不足異常

下面我上傳了我的整個代碼。

public partial class MainPage : PhoneApplicationPage 
{ 

    private MicrophoneRecorder _recorder = new MicrophoneRecorder(); 
    private IsolatedStorageFileStream _audiostream; 
    private string _tempfilename = "tempWav.wav"; 

    public MainPage() 
    { 
     InitializeComponent(); 

    } 

    private void RecordAudio_Checked_1(object sender, RoutedEventArgs e) 
    { 
     PlayAudio.IsEnabled = false; 
     btnupload.IsEnabled = false; 
     _recorder.Start(); 

    } 

    private void RecordAudio_Unchecked_1(object sender, RoutedEventArgs e) 
    { 
     _recorder.Stop(); 
     SaveTempAudio(_recorder.Buffer); 
     PlayAudio.IsEnabled = true; 
     btnupload.IsEnabled = true; 
    } 

    private void SaveTempAudio(MemoryStream buffer) 
    { 

     if (buffer == null) 
      throw new ArgumentNullException("Attempting to save an empty sound buffer"); 

     if (_audiostream != null) 
     { 
      AudioPlayer.Stop(); 
      AudioPlayer.Source = null; 
      _audiostream.Dispose(); 

     } 



     using (IsolatedStorageFile isostore = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      if(isostore.FileExists(_tempfilename)) 
       isostore.DeleteFile(_tempfilename); 

      _tempfilename = string.Format("{0}.wav", DateTime.Now.ToFileTime()); 


      var bytes = buffer.GetWavAsByteArray(_recorder.SampleRate); 

      IsolatedStorageFileStream isostream = isostore.CreateFile(_tempfilename); 
      isostream.Write(bytes, 0, bytes.Length); 
      AudioPlayer.SetSource(isostream); 

     } 
    } 

    private void btnplay_Click(object sender, RoutedEventArgs e) 
    { 

     AudioPlayer.Play(); 


    } 

    private void btnupload_Click(object sender, RoutedEventArgs e) 
    { 


     _audiostream = new IsolatedStorageFileStream(_tempfilename, FileMode.Open, FileAccess.Read, IsolatedStorageFile.GetUserStoreForApplication()); 
     Uri songuri= new Uri(_tempfilename, UriKind.RelativeOrAbsolute); 
     Microsoft.Xna.Framework.Media.PhoneExtensions.SongMetadata metaData = new Microsoft.Xna.Framework.Media.PhoneExtensions.SongMetadata(); 
     metaData.AlbumName = "Album name" +" "+ DateTime.Now.ToString(); 
     metaData.ArtistName = "Artist Name" + " " + DateTime.Now.ToString(); 
     metaData.GenreName = "test" + " " + DateTime.Now.ToString(); 
     metaData.Name = "SongName" + " " + DateTime.Now.ToString(); 
     var library = new MediaLibrary(); 
     var song = Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions.SaveSong(library, songuri, metaData, SaveSongOperation.CopyToLibrary); 
     StreamReader reader = new StreamReader(_audiostream); 
     SendRequest("http://demosites.ephronsystems.com/timeseries/index.php/v1/report/reportFileUpload", reader.BaseStream); 

    } 

    public void SendRequest(string URL, Stream fileStream) 
    { 


     RestRequest request = new RestRequest(URL, Method.POST); 


     request.AddFile("file_source", ReadToEnd(fileStream), "test.wav"); 

     RestClient restClient = new RestClient(); 

     restClient.ExecuteAsync(request, (response) => 
     { 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       String res = response.Content; 
       MessageBox.Show(res); 
      } 


      else 
      { 
       string error = response.ErrorException.ToString(); 
       MessageBox.Show(error); 

      } 
     }); 

    } 

    // Imgae convert to byte array 
    public static byte[] ReadToEnd(System.IO.Stream stream) 
    { 
     long originalPosition = stream.Position; 
     stream.Position = 0; 

     try 
     { 
      byte[] readBuffer = new byte[4096]; 

      int totalBytesRead = 0; 
      int bytesRead; 

      while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
      { 
       totalBytesRead += bytesRead; 

       if (totalBytesRead == readBuffer.Length) 
       { 
        int nextByte = stream.ReadByte(); 
        if (nextByte != -1) 
        { 
         byte[] temp = new byte[readBuffer.Length * 2]; 
         Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
         Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); 
         readBuffer = temp; 
         totalBytesRead++; 
        } 
       } 
      } 

      byte[] buffer = readBuffer; 
      if (readBuffer.Length != totalBytesRead) 
      { 
       buffer = new byte[totalBytesRead]; 
       Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
      } 
      return buffer; 
     } 
     finally 
     { 
      stream.Position = originalPosition; 
     } 
    } 



} 

回答

1

我不familar與RestRequest,但我有同樣的問題HttpWebRequest,所以也許RestRequest實現它。要解決HttpWebRequest的問題,您必須將AllowWriteStreamBuffering設置爲false。問題的詳細信息在這裏:A POST or PUT request may fail when you use the HttpWebRequest class

雖然有一個問題,但是您需要在生成請求之前手動指定確切的POST內容長度,因此您需要知道文件的byte []長度,您的標題並將此值添加到您的請求。實施起來有點兒麻煩,但確實有效。本文詳細解決方法:Uploading large HTTP multipart request

希望這有助於。