我用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;
}
}
}