3

Window Phone 7 アプリで、Shoutcast ストリームをストリーミングしようとしています。

このように非同期HttpWebRequestを開始します

//Init Request

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://ACommonoShoutCastUrl:8000");

myHttpWebRequest.Headers["Icy-MetaData"] = "1";

myHttpWebRequest.UserAgent = "WinampMPEG/5.09";

myHttpWebRequest.AllowReadStreamBuffering = true;

//Call

 // Create an instance of the RequestState and assign the previous myHttpWebRequest object to its request field.  

RequestState myRequestState = new RequestState();

 myRequestState.request = myHttpWebRequest;

 // Start the asynchronous request.

 IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallBack), myRequestState);

問題は、CallBack->RespCallBack が呼び出されないことです...

このコードは、他の環境では正常に機能しましたが、電話では機能しませんでした...

データをストリーミングしそうな WebClient を使うのも疲れましたが、

この場合の問題は、endelss シャウトキャスト ストリームが原因で、最後に OpenReadCompleted が呼び出されないことです。

ご支援ありがとうございます

任意の助けをいただければ幸いです

4

4 に答える 4

3

SHOUTcast は独自のプロトコルを実装しているため、直接アクセスして再生することはできません。DownloadStringAsync (これにはWebClientインスタンスが必要です) を使用してPLSファイルをダウンロードし、RegEx を使用して URL を読み取ることができます。

URL を取得したら、MediaStreamSourceを実装して生のオーディオ データを読み取り、 MediaElementを使用してコンテンツを再生できます。

ここでMediaStreamSource のサンプル実装を見つけることができます。

于 2010-09-18T19:20:27.473 に答える
1

以下をページに配置するだけで、ボタンのクリックに応答してコールバックが呼び出されました。throw(ステートメントにブレークポイントを設定したところ、ヒットしました。)

    private HttpWebRequest myHttpWebRequest;

    public MainPage()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //Init Request 
        //The following URI was chosen at random
        myHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://yp.shoutcast.com/sbin/tunein-station.pls?id=1377200");
        myHttpWebRequest.Headers["Icy-MetaData"] = "1";
        myHttpWebRequest.UserAgent = "WinampMPEG/5.09";
        myHttpWebRequest.AllowReadStreamBuffering = true;

        // Start the asynchronous request.
        myHttpWebRequest.BeginGetResponse(RespCallBack, myHttpWebRequest);
    }

    private void RespCallBack(IAsyncResult ar)
    {
        throw new NotImplementedException();
    }
于 2010-09-17T21:13:59.623 に答える
0

独自の MediaStreamSource クラスを介して MediaElement に Shoutcast ストリーミングを実装しようとしています。Shoutcast サーバーからデータをダウンロードし、そのデータを MediaStreamSource クラスに設定するループがあります。これはまだ完全には機能しませんが、別のより重要な問題を発見しました。私はテストをしました。ストリームを mp3 (ストリームは mp3 形式) ファイルにダウンロードし、このファイルをアプリケーションに配置して MediaStreamSource に設定しました。このコードは次のとおりです。

private void Button_Click(object sender, RoutedEventArgs e)
{
    var assembly = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
    var res = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Demo1.sample.mp3");

    byte[] data = new byte[res.Length];
    res.Read(data, 0, data.Length);

    MemoryStream ms = new MemoryStream();
    ms.Write(data, 0, data.Length);
    ms.Position = 0;

    ShoutcastMediaStreamSource ss = new ShoutcastMediaStreamSource(ms);
    player.SetSource(ss);             
}

MenagedMediaHelpers に基づく私の ShoutcastMediaStreamSource。したがって、このストリームをデバッガーの ShoutcastMediaStreamSource に配置すると、メソッドOpenMediaAsync()が適切に呼び出され、GetSampleAsync()が MediaElement によってループで呼び出されることがわかります。ここでもすべて問題ありませんが、そこでこのアプリを実行すると音が出ません!エミュレーターでもデバイスでも、エラーはありません。GetSampleAsync() メソッドの実行が速すぎると思います。これは、ファイル (およびストリーム) の期間が約 30 秒であり、このアプリが約 30 秒後に終了するためです。10秒 とはいえ、音(スクラッチ)はあるはずです。

しかし、驚くべきことに、このアプリは Silverlight で Web ページとして動作します。 音楽が流れています。私は混乱しています。

ここにすべてのアプリがあります

http://timheuer.com/blog/archive/2010/08/16/download-and-store-media-for-playback-in-windows-phone-7-using-mediastreamsource.aspx

そしてコメントがあります:

Mp3MediaStreamSource が MediaElement のソースとして設定されている場合、MediaElement はそのファイルを再生せず、Windows Phone 7 SDK RTM バージョンでエラーを表示しません。previsios バージョンでは動作していましたが、Windows phone 7 SDK の最終リリースでは動作しません。

于 2010-12-03T16:32:47.373 に答える
0

読み取りストリームのバッファリングを無効にすると、コールバックが呼び出されます。

webRequest.AllowReadStreamBuffering = false;
于 2010-11-30T19:46:24.933 に答える