请原谅我,但在我写这个问题时,出现了一些想法,所以这个问题可能看起来像是事件日志,但您可以放心地跳到 TL;DR 部分。
我有一个 AAR 模块,我在其中使用 WebView 来显示页面并播放具有不同开始时间的音频文件 - 取决于上下文。
我有两个应用程序,我在其中测试 AAR 模块:一个是测试应用程序,它是运行该模块所需的基本框架,另一个是真正的应用程序,它需要一段时间才能完成应用程序的流程进入模块部分。
我被告知几个测试设备上的错误,其中音频播放总是从 0 开始,不要介意使用的音频元素 currentTime 设置。
这是我的代码,处理播放的地方:
var instance = this;
this.playbackCurrentAudioPath = newBufferPath;
this.playbackCurrentAudio = document.createElement('audio');
this.playbackCurrentAudio.src = this.playbackCurrentAudioPath;
this.playbackCurrentAudio.oncanplaythrough = function () {
console.log("file loaded, try to play " + instance.playbackCurrentAudio);
instance.loaded = true;
// checked here, instance.playbackCurrentAudio.duration is equal 0
instance.playbackCurrentAudio.currentTime = audioTrackBeginTime;
// instance.playbackCurrentAudio.currentTime is equal 0
instance.playbackCurrentAudio.play();
// playback starts from the beginning of the file
};
this.playbackCurrentAudio.onerror = function () {
instance.playbackLoadError()
};
this.playbackCurrentAudio.onended = function () {
instance.playbackAudioEnded(true)
};
this.playbackCurrentAudio.load();
如评论中所述,我添加了几个断点来检查发生了什么,这里是一些结论:
oncanplaythrough事件调用后,时长设置为0,currentTime 设置为 0 以外的某个值时,它保持在 0,currentTime 值中。根据 W3Schools站点,canplaythrough 是加载音频文件时调用的最后一个可能的事件。
提到的场景可以在我们 10% 的测试设备上重现。这些设备来自不同的制造商(联想、三星)并且具有不同的 Android 版本(5.0.1、6.0.1)。我也有来自这些制造商的不同设备,它们工作正常。
我决定使用我的基本应用程序进行测试,因为它更快,并且发生了一些奇怪的事情 - 它在上述 10% 的测试设备上运行良好:
oncanplaythrough 事件后正确报告持续时间,currentTime 的设置反射(reflect)在音频元素中,我很震惊,所以我检查了应用程序之间所有可能的差异:
AAR文件我发现了一个区别,这两个应用程序会将它们的数据存储在不同的地方。主应用程序将数据存储在文档目录中,我的基本应用程序将其数据存储在外部存储中[因此更容易调试]。
在我将主应用程序的存储路径更改为外部后,应用程序开始正常运行并正确播放音频。
我知道我无法轻松访问存储在 APK 中的数据,但这些数据是从网络下载并存储在文档目录中的,因此我希望没有任何限制。
长话短说
当从应用程序的文档目录加载 HTML 音频元素中的音频文件时,在 canplaythrough 事件中,我无法访问音频元素的 duration(为 0)也无法设置 currentTime(在播放之前保持为 0)。当从外部存储(内置内存)加载同一文件时,它工作正常,我可以获得音频文件 duration 并设置 currentTime 属性。
当音频位于应用程序的文档目录中时,我该怎么做才能使其正常工作?
最佳答案
我不确定为什么它会影响某些设备,而不会影响其他设备,但我浏览了 Chromium 项目的源代码并偶然发现了这一点:
更准确地说:
private List<String> getRawAcceptableDirectories() {
List<String> result = new ArrayList<String>();
result.add("/mnt/sdcard/");
result.add("/sdcard/");
if (PACKAGE_NAME != null)
result.add("/data/data/" + PACKAGE_NAME + "/cache/");
return result;
}
我已将文档目录更改为缓存目录,一切正常。
关于android - 为什么我不能在 Android WebView 的 HTML AudioElement 中设置 currentTime 和 duration 等于 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45505808/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or