如何使用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播放器可以做到这一点?这也许可以回答这个问题