- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在通过 .aspx 页面为 HTML5 音频提供二进制数据。该文件可以播放,但在 Safari (iPad)、Chrome 和 Firefox 中 SeekBar 和重播有问题。
编辑 我已简化(希望不要太多)代码并提供完整列表(页面文件名显然是 play.aspx)。
<%@ Page Language="C#" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if ( Request["filename"] != null)
{
string FilePath = MapPath(Request["filename"]);
long fSize = (new System.IO.FileInfo(FilePath)).Length;
//Headers
Response.AddHeader("Content-Length",fSize.ToString());
Response.ContentType = "audio/mp3";
//Data
Response.WriteFile(FilePath);
Response.End();
};
}
</script>
<body>
<p>Direct</p>
<audio controls="controls" preload="none">
<source src="sound.mp3" type="audio/mp3" />
</audio>
<p>Provided</p>
<audio controls="controls" preload="none">
<source src="play.aspx?filename=sound.mp3" type="audio/mp3" />
</audio>
</body>
</html>
所以 Content-Length
和 Content-Type
提供 header 。两个 <audio>
当直接访问文件或通过 .aspx 页面访问文件时,标记启用比较行为。
问题是如何向<audio>
提供数据标记在所有必需的浏览器(ff、safari、chrome、IE9+)上都能正常运行。
问题
Safari (iPad):按下播放按钮时会播放声音,但出现的是“Streaming ...”而不是 Seek Bar,并且播放似乎永远持续,声音无法重播。
Firefox(windows): 显示搜索栏,但显示增加的时间直到结束,并且在重播时行为正确。
Chrome(windows): 搜索栏正确但无法重播。
IE10: 好的
我在上找到了类似的问题但没有答案。通过观察另一个带有 fiddler 的页面,标题似乎是 Accept-Ranges: bytes
和 Content-Range: bytes 0-8100780/8100781
可以帮忙。但是提供必要的功能似乎太难了,只是尝试所以我没有尝试。
注意我正在 How to play .m4a with HTML5 audio in IE(9+) and Safari (Pad)? 中寻找其他相关问题的解决方案
最佳答案
简单回答:需要处理浏览器range request
.
完整故事
比较Fiddler时捕获 Firefox 和 IIS 之间的通信 我注意到直接链接的响应状态是 206 Partial Content
而对于间接链接 200 OK
.
对请求的更仔分割析表明 Firefox 请求 Range: bytes=0-
和 iPad Range: bytes=0-1
之后 Range: bytes=0-fullsize
(Capture Traffic from iOS Device)。
设置Response.StatusCode = 206
足以骗过 Firefox 而不是 Safari。但我知道了关键信息,剩下的就很简单了。有必要兑现range
请求见:SO:HTML5 video will not loop .我在 Aha! #1 – ASP.NET ASHX Video Streaming for HTML5 Video 中找到了如何操作的说明.所以新的代码是(只呈现事件部分其余与答案中的相同):
protected void Page_Load(object sender, EventArgs e)
{
if ( Request["filename"] != null)
{
string FilePath = MapPath(Request["filename"]);
long fSize = (new System.IO.FileInfo(FilePath)).Length;
long startbyte = 0;
long endbyte=fSize-1;
int statusCode =200;
if ((Request.Headers["Range"] != null))
{
//Get the actual byte range from the range header string, and set the starting byte.
string[] range = Request.Headers["Range"].Split(new char[] { '=','-'});
startbyte = Convert.ToInt64(range[1]);
if (range.Length >2 && range[2]!="") endbyte = Convert.ToInt64(range[2]);
//If the start byte is not equal to zero, that means the user is requesting partial content.
if (startbyte != 0 || endbyte != fSize - 1 || range.Length > 2 && range[2] == "")
{statusCode = 206;}//Set the status code of the response to 206 (Partial Content) and add a content range header.
}
long desSize = endbyte - startbyte + 1;
//Headers
Response.StatusCode = statusCode;
Response.ContentType = "audio/mp3";
Response.AddHeader("Content-Length",desSize.ToString());
Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", startbyte, endbyte , fSize));
//Data
Response.WriteFile(FilePath,startbyte,desSize);
Response.End();
};
}
添加其他 header (Content-Disposition
、Accept-Ranges
、Access-Control-Allow-Origin
)可能很方便,但目的是尽可能简单地提供解决方案。
经验教训:如果我没有固定到 <audio>
并且还寻找了<video>
,我会更快地找到解决方案。
关于c# - 如何正确地为<audio>提供数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336174/
我有一个小型WordPress网站。我做了很多音频工作,并且试图在WordPress的博客条目中发布HTML5音频剪辑。由于某种原因,它不起作用。它可能与我在WordPress网站上使用的样式有关,但
我在让 html5 标签与 Web Audio API .createMediaElementSource() 方法配合使用时遇到问题。请参阅下面的 jsFiddle/代码。任何想法这里出了什么问题将
我尝试安装ffmpeg $ brew install ffmpeg 并运行 ffmpeg $ ffmpeg -i audio.m4a -ar 8000 -ab 12.2k audio.amr 我收到以
我已使用Web Audio API中的getByteFrequencyData方法使用了来自Analyzer节点的FFT数据来创建频谱可视化器,如下所示: 在这种情况下,我有256个数据箱。这个数字到
Google VR刚刚为wwise制作了一个VR插件: https://developers.google.com/vr/audio/wwise-getting-started https://git
如何将新记录追加到现有记录中的选定位置或特定位置? 例如,有一个5秒的录制,我想再次录制,但是将此录制追加到先前录制的特定位置,说出来:在3秒钟的录制长度之后追加此录制。 最佳答案 您可以使用getC
我们基于 Raspberry Pi 和 omxplayer 构建简单的网络控制视频播放器。我们遇到的问题是任何使用 ffmpeg 转码的文件都有音频不同步。在 iPad 上制作并直接上传到 Pi 的视
我正在尝试了解Web Audio API的引入对基于Web的游戏的开发意味着什么。 Flash游戏当然可以执行一些相当高级的音频处理,对于简单的游戏,音频元素也许就足够了。但是Web Audio AP
我已经在如何用简单的音频引擎循环播放声音效果方面进行了广泛的搜索,但是在cocos2d论坛上除了hello with looping sfx之外,它并没有取得太大进展,因为它存在多个问题。如何在Sim
我的任务是打开一个扩展名为 mka 的现有音频文件(Matroska 容器)并提取原始音频数据。 This示例仅显示了从 mp2 文件中提取原始数据的示例。我不知道如何使用 mka 容器执行此操作。我
我是Lync 2013 SDK的新手(现在已经使用了几周),并且能够弄清除此以外的大部分东西…… 当我加入 session 时(使用ConversationManager.JoinConference
我好奇。如何实现有史以来最简单的音频引擎?我有一些类似使用默认音频设备的音频数据流的想法。玩了很多 RtAudio,我认为如果可以放弃一些功能,这是可能的。有人知道从哪里开始吗? 最佳答案 我会这样做
我一直在玩网络音频API。 我正在使用getByteFrequencyData来显示频带的分贝数据,但是我想更改显示频带的整个范围,因为现在重要的音频都被压缩为一对频带。 有关如何执行此操作的任何想法
我想在音频 session 以NAudio开始和结束时接收回调。以下代码正在运行: private void SetupMediaSessionCallbacks() {
我可以用trackPosition,offset以某种方式记录并输出到WAV。当在浏览器中播放时,它工作正常,我只想输出到WAV文件。 for (var i = 0; i 0) {
在哪种情况下,我们可以不将Google Resonance Audio SDK与耳机配合使用,而应将其与真实的扬声器配合使用(例如,安装在360°的音圈设置中)? 还是所有算法都不适用于真实的扬声器输
AudioPannerNode是一个处理节点,用于在三维空间中定位/空间化传入的音频流。有没有一种方法可以将其用于常规LR平移,请记住它使用3D笛卡尔坐标系与侦听器结合使用,该侦听器的位置和方向与平移
我有一个带有两个源的音频对象,分别为M4A和OGG格式。 代码如下: 然后,我可以调用document.getElementById('audio1')。play()并开始播放。 它适用于所有
我正在尝试构建一个允许将时间/节奏(可能是音高)输入到 Web 音频振荡器节点的界面。实际上创建了一个“步进音序器”。 为 Web Audio API 振荡器节点触发预定 NoteOn 的最佳方式是什
是否可以使用 Core Audio 以亚毫秒级延迟播放声音? 我尝试过使用具有不同大小和缓冲区数量的 AudioQueues,也尝试过使用 AudioUnits,但我一直无法将延迟降低到 30 毫秒以
我是一名优秀的程序员,十分优秀!