小编use*_*108的帖子

与getUserMedia/Web Audio API同步播放和录制音频

我目前正在为音乐家开发基于网络的协作录制平台,类似于移植到网络上的基本DAW(具有额外的社交/共享功能).无论如何,我的目标是让它100%无闪存,所以我一直在阅读很多关于HTML5的内容,特别是Web Audio API(本书有很多帮助,顺便说一下).

要使用getUserMedia()录制用户麦克风的音频,我制作了RecorderJS的自定义版本.简而言之,我将getUserMedia()的输出路由到ScriptProcessorNode,每4096个样本将inputBuffer的内容写入一个稍后导出到PCM WAV文件的数组.到目前为止,它工作正常.

问题是录制过程的开始涉及两件事:播放所有先前录制的曲目,因此音乐家有一个参考播放,并开始实际录制(将缓冲区写入阵列,即).

虽然当用户正在录制时,麦克风的声音没有听得见的延迟或延迟,但是当录制结束并且播放了所有的轨道时,新录制的轨道稍有延迟.

是什么导致这个?有哪些可能的解决方案?

我以为我可以通过将回放发送到同一处理器节点然后找出它们实际开始的时间来找到两个事件之间的时间差,以补偿任何延迟.为此,我需要让ScriptProcessorNode接收通道1和2上的getUserMedia内容,并在通道3和4上播放,但我无法完成这项工作.我尝试将两个源路由到处理器节点,我也尝试使用Merger/Splitter,但似乎没有任何工作.它们都到达通道1和2上的处理器节点,而3和4则为空.

对不起,如果这是偏离主题或不包含实际代码(我很乐意在必要时提供),但是在这个领域没有太多的东西,所以任何想法都会非常受欢迎.

提前致谢!

html5 html5-audio getusermedia web-audio-api

7
推荐指数
1
解决办法
2736
查看次数

寻找 HTML5 音频元素会导致延迟(中断同步)

我正在为音乐家开发一个协作录音平台(类似于与 GitHub 结合的云 DAW)。简而言之,会话(歌曲)由一系列音轨组成,以 AAC 编码并通过 HTML5<audio>元素播放。每个音轨通过 MediaElementAudioSourceNode 连接到 Web Audio API,并通过一系列节点(目前是增益和平移)路由到目的地。到现在为止还挺好。

我能够毫无问题地同步、暂停、停止和搜索它们,并成功实现了普通 DAW 的常用静音、独奏功能以及波形可视化和导航。这是播放部分。

至于录音部分,我将 getUserMedia() 的输出连接到 MediaStreamAudioSourceNode,然后将其路由到 ScriptProcessorNode,后者使用 Web Worker 将录制的缓冲区写入数组。当录制过程结束时,录制的缓冲区被写入一个 PCM 波形文件并上传到服务器,但同时,连接到一个<audio>元素以立即播放(否则我将不得不等待 wav 文件被上传到服务器可用)。

问题是:如果我从头开始播放,我可以与以前的曲目完美同步播放录制的曲目,但我无法正确搜索。如果我更改新录制轨道的 currentTime 属性,它会变得混乱且非常不同步——我重复一遍,这只会在添加“本地”轨道时发生,因为其他轨道在我改变它们的位置时表现得很好。

有没有人知道可能导致这种情况的原因?我可以提供其他有用的信息吗?

先感谢您。

html javascript html5-audio web-audio-api

5
推荐指数
1
解决办法
702
查看次数

UITableView reloadData占用了太多时间

我正在使用TBXML + HTTP从网站获取XML数据.我想要做的是用处理过的数据填充UITableView.我已经创建了一个包含所有条目的NSMutableArray,并且就此而言,一切正常.问题是,在成功从服务器获取数据并将其存储在数组中之后,我尝试使用更新表来显示数据reloadData.

用20行填充表大约需要5秒钟.奇怪的是,提取发生得非常快,因此数据可以立即获得.我不明白花了这么长时间.以下是日志中的一些信息:

2012-03-17 18:46:01.045 MakeMyApp[4571:207] numberOfSectionsInTableView: 1
2012-03-17 18:46:01.047 MakeMyApp[4571:207] numberOfRowsInSection: 0
2012-03-17 18:46:01.244 MakeMyApp[4571:1f03] numberOfSectionsInTableView: 1
2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] numberOfRowsInSection: 20
2012-03-17 18:46:01.245 MakeMyApp[4571:1f03] Ok, I'm done. 20 objects in the array.
2012-03-17 18:46:01.246 MakeMyApp[4571:1f03] Finished XML processing.
2012-03-17 18:46:06.197 MakeMyApp[4571:1f03] cellForRowAtIndexPath:
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,它会触发两次numberOfSectionsInTableView:/ numberOfRowsInSection:两次:第一次是视图加载时,第二种是当我加载时[self.tableView reloadData];

您可以看到,在不到一秒的时间内,数组将填充20个对象,并完成处理XML的所有工作.怎么在cellForRowAtIndexPath:5秒后被解雇?

以下是可能有助于发现问题的代码的一些部分:

- (void)createRequestFromXMLElement:(TBXMLElement *)element {
    // Let's extract all the information of the request
    int requestId = [[TBXML valueOfAttributeNamed:@"i" forElement:element] intValue];

    TBXMLElement *descriptionElement …
Run Code Online (Sandbox Code Playgroud)

sdk uitableview reloaddata ios tbxml

2
推荐指数
2
解决办法
4152
查看次数