我正在开发一个电台的网站,我创建了一个C#后端写入字节流在当前的HTTP响应,然后装上HTML5 音频标记。HTML5音频标签好好尝试一下页面上的内容刷新刷新
我的问题是:我有例如5首歌曲。期望的行为是每次页面加载时,它都应该要求控制器随机播放一首歌曲。实际发生的情况是,首次加载页面时,控制器会被调用并且歌曲正常播放,但如果用户重新加载页面,或导航到新页面并将它们导回到收音机,则会使用音频代替再次调用控制器,只是播放上次调用时在音频缓冲区中下载的内容,并且只有当下载的缓冲区结束播放时,音频标签才会调用控制器,从而产生不需要的跳跃,如播放歌曲15秒并开始一首新歌。
我的音频HTML是在“render”方法上动态创建的。我试图让id随机,尝试强制缓冲区清理干净,但即使使用新的id,即使preload属性设置为“none”,该标记仍将播放预加载缓冲区的内容。除此之外,我尝试将一个随机标记作为参数发送给c#控制器,以尝试避免基于URL的任何缓存问题,但这种方法并不奏效。
继承人我的控制器:
public void GetStream(StreamType? type, string token)
{
var files = this.GetFiles(type);
int rnd;
rnd = new Random((int)DateTime.Now.Ticks).Next(0, files.Count);
using (Stream mystream = files[rnd].OpenRead())
{
this.CurrentTrack = files[rnd].Name;
mystream.Position = 0;
using (BinaryReader reader = new BinaryReader(mystream))
{
byte[] bytes = new byte[mystream.Length];
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.BufferOutput = true;
response.ContentType = "audio/mp3";
response.AddHeader("Accept-Ranges", "bytes");
response.AddHeader("Cache-Control", "no-cache");
response.AddHeader("Content-Length", mystream.Length.ToString());
int bytesRead;
while ((bytesRead = reader.Read(bytes, 0, bytes.Length)) > 0)
{
response.OutputStream.Write(bytes, 0, bytesRead);
}
}
}
}
在这里,我的JS:
audioApp.Initialize = function (type) {
audioApp.Render(type);
}
audioApp.Render = function (type) {
type = (type == undefined || type == null || type == "") ? 0 : type;
var token = audioApp.MakeId();
var html = "
+ "
+ ""
+ " "
+ " Sorry, your browser doesn't support HTML5 audio."
+ ""
$("#divAudioRender").append(html);
}
的 “渲染” 的方法将创建音频元素职位,以我的后端。
我在网上搜索了一个办法,迫使音频缓冲了很多,每次刷新页面被清洗,但我无法找到任何东西。
任何帮助表示赞赏,
谢谢!
+0
请从问题中删除所有不相关的代码,并保持** **仅需要什么刚刚 –
+0
去掉,只留下什么是相关的。 thx –
+0
你可以把它分解成一个能够再现问题所在的页面吗?你所描述的真的不应该发生。 –