2013-01-25 3 views
8

sqlデータベースに"chunks"の音声(mp3形式)があります。つまり、mp3というファイルを同じサイズのチャンクに分割し、各チャンクをsqlサーバーdbのレコードに保存したとします。これらのchunksWCFサービスを介してデスクトップクライアントに返されます。もちろん、クライアントは次のチャンクを受け取ったときにそのチャンクを要求します(順番に受信されるので、ヘッダーが最初に来ます)。 ここに質問があります。これを再生するにはどうすればいいですか?chunks続行? プレイヤーをバッファリングするために各チャンクを使用してそれらをバックプレーンで再生できますか?C#を使用して(wcfで)デスクトップクライアントに転送されたSQL Serverからmp3バイトのチャンクを再生する方法は?

何卒ご了承下さい。 -theデスクトップクライアントは、この目的のために動作するかどう-theプレイヤーはWMPできるC# であります! :チャンクは「チャンクSQLの」システムがすでに誰かによって実装されているいくつかの理由-forバイト に保存されているだけで、デスクトップ上のストリームのように

おかげでそれらを再生する方法を見つける必要があるelse..i!

+0

これらのチャンク*を連続した1つの 'byte []'に連結できないと思われる理由はありますか? –

+0

はい、実際に私は彼らが終了しているか、遊びの時にもっと遠くに来るのか分かりません! –

+0

さて、私たちは両方の方法を管理することができます。 –

答えて

0

ユーザーがデータベースを要求したときにデータベースに適切な順序を設定する方法があると仮定すると、あなたの内訳はかなり簡単です。

  • のチェックをして再生するチャンクが存在する場合には(ストリームに追加)、それらを再生し、利用可能チャンク
  • にクライアントに送信:擬似コードで

    1. ユーザーがmp3
    2. が何を要求します定義された順序
    3. 中:フッターはこれらのチャンクに遭遇していない//エンド本質的

    を行い、Fまでのユーザーに利用できるようにチャンクを送信ooterが遭遇し、チャンクが完成したかのように再生されます。

  • +0

    真実ですが、ダウンロードしている間にチャンクのストリームをメディアプレーヤーに供給する方法がわかりません。その方法はわかりません。 –

    2

    あなたのmp3プレーヤーと仮定すると、System.IO.Streamオブジェクトから再生し、これがキューに場所データのチャンクをある何次

    private byte[] GetDataBlock() 
        { 
         while (data.Count == 0) 
         { 
          //TODO: Read More Data from the database 
          index = 0; 
         } 
         return data.Peek(); 
        } 
        private void RemoveDataBlock() 
        { 
         data.Dequeue(); 
         index = 0; 
        } 
    
        Queue<byte[]> data = new Queue<byte[]>(); 
        int index = 0; 
        public override int Read(byte[] buffer, int offset, int count) 
        {    
         int left = count; 
         int dstIndex = 0; 
    
         while (left > 0) 
         { 
          byte[] front = GetDataBlock(); 
    
          int available = front.Length - index; 
          // how much from the current block can we copy? 
          int length = (available <= left) ? available : left; 
          Array.Copy(front, index, buffer, dstIndex, length); 
          dstIndex += length; 
          left -= length; 
          index += length; 
          // read all the bytes in the array? 
          if (length == available) 
          { 
           RemoveDataBlock(); 
          } 
         } 
    
         return count; 
        } 
    

    を使用して独自のストリームクラスを実装することができます。 Readメソッドは、追加された順にそれらを読み込みます。

    このコードは一度に1つのチャンクしか読み込まれませんが、別のスレッドで読み込み、いくつかのチャンクをバッファするように拡張できます。

    +0

    ありがとう私はそれを試してみるつもりです...基本的な前提、つまり、ストリームオブジェクトから再生できるということは、実際に問題のもう一つの部分です。実際にそれを行うことができるフリーのmp3プレーヤーを知っていますか? –

    +0

    これはそれに答えるかもしれないhttp://stackoverflow.com/questions/912356/play-mp3-from-net-code – shimpossible

    関連する問題