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

如何使用C#播放从sql server传输到桌面客户端(通过wcf)的mp3字节块?,c#,sql,mp3,desktop,playback,C#,Sql,Mp3,Desktop,Playback,我在sql数据库中有音频的块(以mp3格式),也就是说,你可以想象一个mp3文件,分成大小相等的块,每个块都保存在sql服务器数据库上的一条记录上。这些块通过WCF服务返回到桌面客户端。当然,客户机在接收到下一个块时会请求下一个块(它们将按顺序接收,因此头先到!) 问题是,我如何在我的桌面应用程序中依次播放收到的块? 我可以使用每个区块来缓冲播放器,将它们背靠背播放吗 请注意: -桌面客户端是C语言的# -玩家可以是wmp,如果它为此目的工作! -块以字节形式保存 -由于某些原因,“chunk

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

请注意: -桌面客户端是C语言的# -玩家可以是wmp,如果它为此目的工作! -块以字节形式保存 -由于某些原因,“chunk on sql”系统已经由其他人实现了。我只需要找到一种方法,像在桌面上播放流一样播放它们


谢谢

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

  • 用户请求mp3
  • 做:
  • 检查并向客户端发送可用的块
  • 如果有区块要播放,则按定义的顺序播放(将其添加到流中)
  • while:在那些块中没有遇到页脚//end do

  • 基本上,在遇到页脚之前,向用户发送可用的块,并像播放完整的块一样播放这些块。

    假设您的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;
        }
    
    private byte[]GetDataBlock()
    {
    while(data.Count==0)
    {
    //TODO:从数据库读取更多数据
    指数=0;
    }
    返回data.Peek();
    }
    私有void RemoveDataBlock()
    {
    data.Dequeue();
    指数=0;
    }
    队列数据=新队列();
    int指数=0;
    公共重写整型读取(字节[]缓冲区、整型偏移量、整型计数)
    {            
    int左=计数;
    指数=0;
    而(左>0)
    {
    字节[]前端=GetDataBlock();
    int available=front.Length-索引;
    //我们可以从当前区块复制多少?
    
    int length=(是否有任何理由相信不能将这些块连接成一个连续的
    byte[]
    ?是的,事实上,我不知道它们是否已经完成,或者在播放时是否还会继续!好吧,我们可以用这两种方法来管理,如果你只有块,那就更复杂了。我担心它们都是块,我的意思是,它们可能在客户端请求时被添加到sql中。因此,没有办法知道结果在播放时,它们的确切结尾!我只能假设它们的播放顺序与此无关?是的,但我不知道如何在下载它们时将这些块流提供给媒体播放器,我不知道有什么方法可以做到这一点!谢谢,我将尝试一下……你的基本假设,即,能够从流播放物体是问题的另一部分,事实上,你们知道有并没有免费的mp3播放器可以做到这一点?这也许可以回答这个问题