我们在使用相当大的音频m4a文件的音频阅读器混合应用程序时遇到问题.简而言之,开始播放(使用在线音频资源时)需要太长时间.
为了说明这个问题,我们创建了一个具有以下结构的较小原型:
身体:
脚本:
var audioTags = document.querySelectorAll('audio'); [].forEach.call(audioTags, function (item) { item.addEventListener('play', onPlayStateChange); item.addEventListener('timeupdate', onPlayStateChange); item.addEventListener('error', onPlayStateChange); item.addEventListener('pause', onPauseReset); }); function onPlayStateChange(e) { var id = e.target.parentNode.id; if (count[id]) { return; } if (e.type === 'play') { count[id + 'start'] = +new Date(); } else if (e.target.parentNode.querySelector('audio').currentTime > currentTimeOffset) { var span = e.target.parentNode.querySelector('span'); count[id] = 1; if (span) { span.innerText = e.type === 'error' ? 'Audio type or codec does not supported' : new Date() - count[id + 'start']; } } }
有完整的例子.
当我们使用WebView使用Cordova 6.4.0构建应用程序时,它会在~3.5秒内开始播放.网络活动如下所示:
GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=webview HTTP/1.1 206 29522945 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=webview HTTP/1.1 206 326657 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=webview HTTP/1.1 206 29163520
当我们使用带有Crosswalk-webview插件2.2.0的Cordova 6.4.0构建应用程序时,它最多可以在18秒内开始播放,但有时延迟甚至更长 - 最多45秒.似乎主要原因是网络活动的差异:
GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 2 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 200 29522945 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 577690 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 200 29522945 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 577690 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 200 29522945 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 577690 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 200 29522945 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 577690 GET /tmp/1916firstchapterscollection_09_various_64kb.m4a?app=crosswalk HTTP/1.1 206 7384995
...当只有第一个请求与"普通"用户代理一起提供时,所有后续请求都将被提供stagefright/1.2 (Linux;Android 5.0.1)
.
为什么差异,我们怎样才能避免这种情况?
PS这是包含所有apks和相关数据的文件夹.