2014-10-04 2 views
0

저는 C#에서 매우 새로운데 내 코드로 문제를 찾지 못하는 것 같습니다. 나는 그것을 구글 번역 텍스트 음성 변환 사이트에서 오디오 파일을 얻을 재생하려고하지만 오류가 계속 :HTTP 요청에서 오디오 파일 재생

An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll 
Additional information: The wave header is corrupt. 

누군가가 나에게 문제가 내 코드에 알려 주시기 바랍니다 수 있습니까? 방법은 다음과 같습니다

public static void PlayWord(string Query) 
    { 
     string GoogleTranslateURL = "http://translate.google.com/translate_tts?tl=en"; 
     System.Net.WebRequest req = System.Net.WebRequest.Create(GoogleTranslateURL + (string.IsNullOrEmpty(Query) ? "" : "&q=" + Query)); 

     using (var ms = new MemoryStream()) 
     { 
      using (Stream webStream = req.GetResponse().GetResponseStream()) 
      { 
       var buffer = new byte[4096]; 
       int read; 
       while (webStream != null && (read = webStream.Read(buffer, 0, buffer.Length)) > 0) 
        ms.Write(buffer, 0, read); 
      } 
      using (SoundPlayer player = new SoundPlayer(ms)) 
      { 
       if (ms.CanSeek) ms.Seek(0, System.IO.SeekOrigin.Begin); 
       player.Stream = null; 
       player.Stream = ms; 
       player.Play(); 
      } 
     } 
    } 
+0

당신이 연설에 단어를 변환 하시겠습니까? – Yehia

답변

0
 string GoogleTranslateURL = @"http://translate.google.com/translate_tts?tl=en&q=pop"; 
     System.Net.WebRequest req = System.Net.WebRequest.Create(GoogleTranslateURL); 

     string a = req.GetResponse().ContentType; 


     using (Stream webStream = req.GetResponse().GetResponseStream()) 
     { 
      FileStream stream = new FileStream(@"C:\Projects\EverydayProject\pop.wav", FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.ReadWrite, 100, FileOptions.None); 

      webStream.CopyTo(stream); 
      stream.Close(); 
      webStream.Close(); 
     } 


     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.FileName = @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"; 
     startInfo.Arguments = @"C:\Projects\EverydayProject\pop.wav"; 
     var process = Process.Start(startInfo); 

     if(!process.HasExited) 
     { 
      process.Refresh(); 
      Thread.Sleep(1000); 
     } 

     process.CloseMainWindow(); 
     process.Close(); 

     if (File.Exists(@"C:\Projects\EverydayProject\pop.wav")) 
      File.Delete(@"C:\Projects\EverydayProject\pop.wav"); 

문제는 HTTP 요청에 없습니다! 이것이 나에게 효과적입니다. 문제는 SoundPlayer 클래스에 있습니다. SoundPlayer 사용법을 확인하십시오.

+0

'SoundPlayer'는 mp3가 아닌 wav 만 재생할 수 있기 때문에 나는 좋지 않다고 생각합니다. 또한 OP에 VLC가 없다면 어떻게 될까요? – Tony

+0

@Tony op는 문제가 Http 요청에 있다고 생각합니다. 요청은 다른 프로그램에서 작동하는 유효한 wav 파일을 반환합니다. 그 때문에 나는 이것을 게시합니다. 그는 SoundPlayer가 어떻게 작동하는지 확인해야합니다. SoundPlayer에서 오류가 발생했습니다. VLC가 없다면 원하는 모든 것을 사용할 수 있습니다. – mybirthname

+0

@ 토니 당신 말이 맞아요 SoundPlayer는 wav 만 재생할 수 있으며 응답의 콘텐츠 유형은 wav가 아닙니다! – mybirthname

0

SoundPlayer 수 있습니다 만, 여기 MSDN 말한 play WAV 파일 :

The SoundPlayer class provides a simple interface for loading and playing a .wav file.

그러나 구글은 MP3 파일로 응답, 그래서 대신 MediaPlayer 시도 :

var mp = new MediaPlayer(); 
mp.Open(new Uri(GoogleTranslateURL + (string.IsNullOrEmpty(Query) ? "" : "&q=" + Query))); 
mp.Play(); 
+0

MediaPlayer에는 매개 변수가없는 생성자가 없습니다. byte []를 추가해야합니다. 아마 코드를 고쳐야 만합니다. 그렇지 않으면 어떻게 든 오해를합니다. – mybirthname

+0

나는 당신의 코드를 시도했다. MediaPlayer에 byte []를 넣었고 예외가 있었다. – mybirthname

+0

@mybirthname 죄송합니다.하지만 다음과 같습니다 : http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.mediaplayer(v=vs.110).aspx 'MediaPlayer' 클래스입니다. – Tony