AngularJS 애플리케이션에서 D3.js와 Web Audio API를 사용하여 음악 주파수 비주얼 라이저를 사용했습니다.
지시문과 templateUrl html 파일이있는 내부에 사용자 정의 bower 구성 요소를 만들었습니다.
Directive.js
(function (angular) {
var ap=angular.module('audio-player-mod',[]);
ap.directive('audioPlayer', function () {
return {
restrict: 'EA',
scope: {
audioFile : "="
},
link: function (scope,element,attrs) {
$(document).ready(function () {
// scope.audios=scope.audioFile;
console.log(scope.audioFile);
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audioElement = document.getElementById('audioElement');
var audioSrc = audioCtx.createMediaElementSource(audioElement);
var analyser = audioCtx.createAnalyser();
// Bind our analyser to the media element source.
audioSrc.connect(analyser);
audioSrc.connect(audioCtx.destination);
//var frequencyData = new Uint8Array(analyser.frequencyBinCount);
var frequencyData = new Uint8Array(200);
var svgHeight = '500';
var svgWidth = '2000';
var barPadding = '1';
function createSvg(parent, height, width) {
return d3.select(parent).append('svg').attr('height', height).attr('width', width);
}
var svg = createSvg('body', svgHeight, svgWidth);
// Create our initial D3 chart.
svg.selectAll('rect')
.data(frequencyData)
.enter()
.append('rect')
.attr('x', function (d, i) {
return i * (svgWidth / frequencyData.length);
})
.attr('width', svgWidth / frequencyData.length - barPadding);
// Continuously loop and update chart with frequency data.
function renderChart() {
requestAnimationFrame(renderChart);
// Copy frequency data to frequencyData array.
analyser.getByteFrequencyData(frequencyData);
// Update d3 chart with new data.
svg.selectAll('rect')
.data(frequencyData)
.attr('y', function(d) {
return svgHeight - d;
})
.attr('height', function(d) {
return d;
})
.attr('fill', function(d) {
return 'rgb(0, 0, ' + d + ')';
});
}
// Run the loop
renderChart();
});
},
templateUrl: 'bower_components/audio-player/view/audio-player.html'
};
});
})(angular);
templateUrl.html (여기는 audio-player.html)
<div>
<audio id="audioElement" crossorigin="anonymous" src="audioFile"></audio>
<div>
<button onclick="document.getElementById('audioElement').play()">Play</button>
<button onclick="document.getElementById('audioElement').pause()">Pause</button>
<button onclick="document.getElementById('audioElement').volume+=0.1">Increase Volume</button>
<button onclick="document.getElementById('audioElement').volume-=0.1">Decrease Volume</button>
</div>
</div>
이 audioPlayer 지시문은 뷰의 다른 html 파일에서 사용되며 아래에 표시된 코드
<div class="player-region" ng-if="recordingsCtrl.audioList[0].src">
<div>
<div class="player-control">
<div class="player-control-bottom">
<audio-player crossorigin="anonymous" audio-file="recordingsCtrl.audioList[0].src"></audio-player>
</div>
</div>
</div>
</div>
여기서 audio-player 태그의 src 값은 directive.js (지시문의 이름은 audioPlayer 임) 파일에서 액세스 할 수 있습니다.
보기에서 {{audioFile}} 인쇄를 시도했는데 각 오디오 색인에 대한 URL이 표시됩니다.
문제는 지시어 범위 변수에서 src 값을 어떻게 얻을 수 있습니까? 첫 번째 클릭으로 얻었지만 다른 인덱스를 클릭하면 범위가 해당 src 값으로 업데이트되지 않습니다!
지시문을 다시로드하고 html 파일에 플래그를 설정했습니다.
<div ng-if="recordingsCtrl.songChanged">
<audio-player crossorigin="anonymous" audio-file="recordingsCtrl.audioList[0].src"></audio-player>
</div>
모든 오디오 파일을 클릭 할 때 타임 아웃 기능을 설정합니다.
function playAudio{
self.songChanged = false;
setTimeout(function() {
self.songChanged = true;
$scope.$apply();
}, 10);
}
처음로드 된 윈도우의 경우 지시문이 html에 바인드되고 지시문 범위 변수를 변경하려면 위와 같이 지시문을 다시로드하여 수행 할 수 있습니다.
이것이 우리가 문제를 해결할 수있는 방법 중 하나입니다. 더 나은 해결책이있는 사람이 있으면 아래에 답해주세요.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다