繁体   English   中英

如何从sql server播放mp3字节块,使用C#转移到桌面客户端(通过wcf)?

[英]how to play chunks of mp3 bytes from sql server, transferred to desktop client (by wcf) using C#?

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

请注意: - 桌面客户端在C#中 - 如果它适用于此目的,则播放器可以是wmp! -chunk以字节保存 - 由于某些原因,“chunk on sql”系统已经被其他人实现了..我只需要找到一种方法来像桌面上的流一样播放它们

谢谢!

假设您的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个块,但可以扩展为在单独的线程上读取并缓冲多个块。

假设您有一种在用户请求时在数据库中对它们进行适当排序的方法,那么您的故障就相当简单了。 在伪代码中

  1. 用户请求mp3
  2. 做:
  3. 检查并向客户端发送可用的块
  4. 如果有要播放的块,请按定义的顺序播放它们(将它们添加到流中)
  5. 虽然:在那些块中没有遇到页脚//结束了

实质上,将块发送给用户可用,直到遇到页脚,播放块就好像它们已经完成一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM