javascript - Django 播放音频文件的问题
问题描述
我在 Django 项目中使用 Javascript 来制作音频播放器/可视化器,但是在单击链接时播放音频时遇到问题。在 app.js 中测试了一些小功能后,我可以看到它在 HTML 文件中运行,但由于某种原因,当我尝试播放音频时,它说找不到支持的源并且找不到我的音频文件。Javascript 在另一个项目中工作正常,但我无法让它在 Django 中工作。我是 Django 的新手,所以任何帮助都会很棒,谢谢。
export default class AudioPlayer {
constructor(selector = '.audioPlayer', audio = []) {
this.playerElement = document.querySelector(selector);
this.audio = audio;
this.currentAudio = null;
this.createPlayerElements();
this.audioContext = null;
}
createVisualiser() {
this.audioContext = new AudioContext();
const src = this.audioContext.createMediaElementSource(this.audioElement);
const analyser = this.audioContext.createAnalyser();
const canvas = this.visualiserElement;
const ctx = canvas.getContext('2d');
src.connect(analyser);
analyser.connect(this.audioContext.destination);
analyser.fftSize = 128;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
const barWidth = (canvas.width / bufferLength) * 2.5;
let barHeight;
let bar;
function renderFrame() {
requestAnimationFrame(renderFrame);
bar = 0;
analyser.getByteFrequencyData(dataArray);
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < bufferLength; i++) {
barHeight = dataArray[i] - 100;
const r = barHeight + (50 * (i / bufferLength));
ctx.fillStyle = `rgb(${r}, 100, 50)`;
ctx.fillRect(bar, canvas.height - barHeight, barWidth, barHeight);
bar += barWidth + 2;
}
}
renderFrame();
}
createPlayerElements() {
this.audioElement = document.createElement('audio');
this.audioElement.crossOrigin = "anonymous";
const playlistElement = document.createElement('div');
playlistElement.classList.add('playlist');
this.visualiserElement = document.createElement('canvas');
this.playerElement.appendChild(this.audioElement);
this.playerElement.appendChild(playlistElement);
this.playerElement.appendChild(this.visualiserElement);
this.createPlaylistElement(playlistElement);
}
createPlaylistElement(playlistElement) {
this.audio.forEach(audio => {
const audioItem = document.createElement('a');
audioItem.classList.add('musicA');
audioItem.href = audio.url;
audioItem.innerHTML = `<i class="fa fa-play"></i>${audio.name}`;
this.setupEventListener(audioItem);
playlistElement.appendChild(audioItem);
});
}
setupEventListener(audioItem) {
audioItem.addEventListener('click', (e) => {
e.preventDefault();
if (!this.audioContext) {
this.createVisualiser();
}
const isCurrentAudio = audioItem.getAttribute('href') == (this.currentAudio && this.currentAudio.getAttribute('href'));
if (isCurrentAudio && !this.audioElement.paused) {
this.setPlayIcon(this.currentAudio);
this.audioElement.pause();
console.log('paused');
}
else if (isCurrentAudio && this.audioElement.paused) {
this.setPuaseIcon(this.currentAudio);
this.audioElement.play();
}
else {
if (this.currentAudio) {
this.setPlayIcon(this.currentAudio);
}
this.currentAudio = audioItem;
this.setPuaseIcon(this.currentAudio);
this.audioElement.src = this.currentAudio.getAttribute('href');
this.audioElement.play();
}
});
}
setPlayIcon(element) {
const icon = element.querySelector('i');
icon.classList.remove('fa-pause');
icon.classList.add('fa-play');
}
setPuaseIcon(element) {
const icon = element.querySelector('i');
icon.classList.remove('fa-play');
icon.classList.add('fa-pause');
}
}
然后我在我的 app.js 中创建了一个新的 AudioPlayer:
import AudioPlayer from './AudioPlayer.js';
const audioPlayer = new AudioPlayer('.audioPlayer', [
{ url: "musicPlayer/static/songs/song1.mp3", name: "abc" },
]);
musicPlayer.urls:
urlpatterns = [
path('', views.home, name="home")
]
和项目.urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('musicPlayer.urls')),
]
音乐播放器文件:
musicPlayer
|
|-__pycache__
|-migrations
|-static
| |
| |-css
| |
| |-javascript
| | |
| | |-app.js
| | |-AudioPlayer.js
| |-songs
|-templates
|-urls.py
|-views.py
| ...
解决方案
我不完全确定,因为我看不到您的项目结构,但音乐播放器应用程序中的音频播放器网址是吗?或者没有?
看起来您没有在任何地方包含 audioPlayer url...它们不在 musicPlayers.urls 或项目 url 中,因此有效地,您正试图转到他们项目找不到的 url,因为您没有正确导入。
如果 audioPlayer 在该应用程序中,您需要将 audioPlayer.urls 导入到 musicPlayer url,或者,如果它是自己的应用程序,则需要将其导入到项目 url 中。
希望这可以解决 404,您可能还必须创建一个视图,然后将视图连接到 url。我不完全确定纯 js 函数如何与 url 一起使用。
推荐阅读
- xml - DTD 定义中的注释
- mysql - mysql中的多字段分组,结果为0
- hibernate - 如果我们有 session.evict(),为什么我们需要 javax.persistence.EntityManager.detach()?
- c# - 以 C# windows 形式阅读未送达的电子邮件正文
- powershell - PowerShell - CSV 文件中的标题并修改特定列中的值
- bigdata - 如何在 Corda 中处理大的 Vault Size?
- c++ - 性能比较:f(std::string&&) vs f(T&&)
- kong - 如何配置 Kong 强制 HTTP 重定向到 HTTPS
- swift - 矩阵中不同列中的快速更改值会更改不同的值
- python - Django Queryset 过滤器将在 7 天内成为 3 个月