2013-07-28 84 views
0

我试图创造一个MP3流光,但我没有草草收场:-)如何使用AudioTrackStreamer流式传输MP3?

我有我的AudioTrackStreamer如下:

 protected override void OnBeginStreaming(AudioTrack track, AudioStreamer streamer) 
     { 
      //TODO: Set the SetSource property of streamer to a MSS source 
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://api.soundcloud.com/tracks/85085126/stream?consumer_key=db840ada2477a93d5fdbcc96a46b37c1"); 
      req.ContentType = "application/octet-stream"; 

      try 
      { 
       req.BeginGetRequestStream((callback) => 
        { 
         HttpWebRequest request = (HttpWebRequest)callback.AsyncState; 
         Stream stream = request.EndGetRequestStream(callback); 
         Mp3MediaStreamSource src = new Mp3MediaStreamSource(stream, 1000); 

         streamer.SetSource(src); 

         NotifyComplete(); 

        }, req); 
      } 
      catch { } 

而失败,与捕获ProtocolIViolationException消息:

[Arg_InvalidOperationException] 
Arguments: 
Debugging resource strings are unavailable. Often the key and arguments provide sufficient information to diagnose the problem. See http://go.microsoft.com/fwlink/?linkid=106663&Version=4.0.50829.0&File=mscorlib.dll&Key=Arg_InvalidOperationException 

的URL文件的东西,我发现谷歌搜索,而免费的音乐,如果你打开它,你去下载一个MP3文件...这样的来源应该是合法的?

+0

Jason94嗨,你能创建一个Mp3MediaStreamSource MP3流光? – burakk

回答

1
  1. 您正在使用错误的数据流。将[Begin/End]GetRequestStream替换为[Begin/End]GetResponse,在完成处理程序调用WebResponse.GetResponseStream中访问正确的流。
  2. 请勿从OnBeginStreaming拨打NotifyComplete。当曲目播放到最后时,请拨打NotifyComplete
  3. BeginGetResponse之前,您应该设置req.AllowReadStreamBuffering = false;,否则您的MP3将在播放前完全下载。

更新 - 我while()循环看起来像这样:

while(true) 
{ 
    if(cancel.IsCancellationRequested) 
     return; 

    if(buffer.hasFreeSpace()) 
    { 
     int cb = await this.downloadAsync().ConfigureAwait(false); 
     var buffWaiter = m_bufferAwaiter; 
     if(0 == cb) 
     { 
      Exception ex = new Exception("runBackgroundAsync: connection dropped");; 
      if(null != buffWaiter) 
       buffWaiter.Fail(ex); 
      throw ex; 
     } 

     if(null != buffWaiter) 
     { 
      // The client is waiting for the data to be pre-buffered 
      if(buffWaiter.haveBuffer(buffer.cbLength)) 
      { 
       // Sufficient data has been downloaded, so playback is going to resume after this haveBuffer() call. 
       m_bufferAwaiter = null; 
      } 
     } 
     continue; //< Continuing to while(true) without a single sleep. 
    } 
    await TaskEx.Delay(this.tsSleepTimeWhenBufferFull, cancel).ConfigureAwait(false); 
} 
+0

怎么样在 Mp3MediaStreamSource src = new Mp3MediaStreamSource(stream,1000); ? 它不会停在指定长度(1000)的末尾吗? – burakk

+0

我试过使用Mp3MediaStreamSource,花了一些时间试图修复它,但失败了。我创建了自己的MediaStreamSource实现。抱歉,无法帮助您使用Mp3MediaStreamSource。记住它不是一个SDK类,它只是一个开源项目。 – Soonts

+0

AllowReadStreamBuffering属性:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.allowreadstreambuffering(v = vs.105)。 aspx 默认值为true。文档说明,当整个流被下载到内存中时,它的真正的BeginGetResponse回调被引发。 收音机的流量是_infinite_长度:收音机一直播放。 没有了req.AllowReadStreamBuffering = false,GetRequestStream回调将永远不会被调用。相反,应用程序最终会崩溃,内存不足例外。 – Soonts

相关问题