이전에 Web Audio API에서 JavaScriptAudioNode을 성공적으로 사용하여 Chrome과 Safari 6.0에서 모두 오디오를 합성하고 혼합했습니다. 그러나 소스 버퍼를 채우기 위해 onaudioprocess을 호출하지 않기 때문에 Safari의 최신 버전이 더 이상 작동하지 않습니다.Safari 6.0.2 onaudioprocess를 호출하지 않음
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("a").click(function() {
var context = new webkitAudioContext();
var mixerNode=context.createJavaScriptNode(2048, 0, 2);
mixerNode.onaudioprocess=function(ape) {
var buffer=ape.outputBuffer;
for(var s=0;s<buffer.length;s++)
{
buffer.getChannelData(0)[s]=0;
buffer.getChannelData(1)[s]=0;
}
$("body").append("buffering<br/>");
};
$("body").html("");
mixerNode.connect(context.destination);
return false;
});
});
</script>
</head>
<body>
<a href="#">start</a>
</body>
</html>
위의 예는 데스크톱 사파리에서 예상대로 크롬에서 작동하지만,하지 :
이것은 단지 침묵을 재생하고 onaudioprocess 각 호출에 문서 본문에 텍스트를 추가 단순화 된 예입니다. Safari의 iOS 버전도 작동하지 않지만 처음에는 저에게 맞지 않았습니다.
유형 JavaScriptAudioNode의 적절한 객체를 반환 않습니다 context.createJavaScriptNode를 호출하고 예외를 throw하지 않습니다 목적지 노드에 연결. context.activeSourceCount은 0으로 유지되지만 Chrome에서는이 유형의 활성 노드 인 AudioBufferSourceNode 만 계산하므로이 경우에도 마찬가지입니다. context.currentTime도 예상대로 증가합니다.
내가 여기서 뭔가 잘못하고있는 것입니까, 아니면 실제 버그입니까, Safari에서 누락 된 기능입니까? Apple 설명서에는 JavaScriptAudioNode (새 이름, ScriptProcessorNode)에 대한 언급이 없지만 Safari 6의 첫 번째 릴리스에서는 작동하지 않았습니다. 사용자 입력에 대한 iOS Safari 요구 사항은 도움이되지 않습니다. 위의 내용은이를 처리해야합니다.
간단한 예제는 here이고 더 복잡한 것은 동일한 동작을 보이는 내 Protracker module player입니다.
우수 답변을 보내 주셔서 감사합니다. 제안 된 변경 사항을 구현하면 실제로 Safari의 문제가 해결되었습니다. – firehawk
와우,이 대답 없이는 절대로 알아 내지 못했을 것입니다. 건배! –
참고로, 저는 카나리아 30.0.1564.0에서 똑같은 문제를 겪고 있다고 확신합니다. onaudioprocess는 GC 패스 직후에 * 호출되는 것을 멈 춥니 다 (DevTools 타임 라인 탭을 사용하여 관찰 됨). 제안 된대로 전역 범위에 항목을 첨부하는 것이 효과적인 해결 방법입니다. 감사합니다. 옳은 길에 나를 두었습니다. – biril