8

私はデータベース上に(形式"chunks"の)オーディオを持っています。つまり、ファイルを想像してみてください。チャンクと同じサイズに分割され、各チャンクはサーバー db のレコードに保存されます。これらは、サービスを介してデスクトップ クライアントに返されます。もちろん、クライアントは受信時に次のチャンクを要求します (順番に受信されるため、ヘッダーが最初に来ます!) ここで質問です。デスクトップ アプリで受信したチャンクを 1 つずつ順番に再生するにはどうすればよいですか? プレーヤーをバッファリングするために各チャンクを使用して連続して再生できますか?mp3sqlmp3sqlchunksWCFchunks

注意してください: - デスクトップ クライアントは C# です - この目的で動作する場合、プレーヤーは wmp にすることができます! - チャンクはバイト単位で保存されます - 何らかの理由で、"chunk on sql" システムは他の誰かによって既に実装されています.デスクトップ上でストリームのように再生する方法を見つける必要があるだけです

ありがとう!

4

2 に答える 2

1

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 つのチャンクのみを読み取りますが、別のスレッドで読み取り、多数のチャンクをバッファリングするように拡張できます。

于 2013-02-02T17:14:50.020 に答える
0

ユーザーが要求したときにデータベース内でそれらを適切に並べ替える方法があると仮定すると、内訳はかなり単純です。疑似コードで

  1. ユーザーリクエスト mp3
  2. 行う:
  3. 利用可能なチャンクを確認してクライアントに送信します
  4. 再生するチャンクがある場合は、定義された順序で再生 (ストリームに追加)
  5. while: フッターはそれらのチャンクで検出されていません //end do

基本的に、フッターが検出されるまでチャンクを使用可能なものとしてユーザーに送信し、チャンクを完全であるかのように再生します。

于 2013-01-28T19:23:50.720 に答える