8

"chunks"在数据库上有音频(mp3格式),sql即,您可以想象一个mp3文件,分成相等大小的块,每个块都保存在sql服务器数据库的记录中。这些chunks通过WCF服务返回给桌面客户端。当然,客户端在收到一个块时会要求下一个块。(它们将按顺序接收,因此标题首先出现!)这是一个问题,我如何才能chunks在我的桌面应用程序中依次播放收到的这个?我可以使用每个块来缓冲播放器来背靠背播放它们吗?

请注意: - 桌面客户端是 C# - 如果它可以用于此目的,播放器可以是 wmp!-块以字节为单位保存-由于某些原因,“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 回答