SoundManager2 onid3() 未触发

Posted

技术标签:

【中文标题】SoundManager2 onid3() 未触发【英文标题】:SoundManager2 onid3() not firing 【发布时间】:2011-01-16 14:32:14 【问题描述】:

我正在使用最新的 SoundManager2 构建一个简单的 javascript 点唱机,用于音频播放,本地 MP3 文件是源。我已经对文件加载和播放进行了排序,目前我正在尝试访问这些 MP3 文件的 ID3 信息,但是 onid3() 回调没有触发。我正在使用 Flash 并已验证文件中存在 ID3 信息。下面是我对 onid3() 的实现:

function playNextSongInQueue()

    // Get the first element of the songQueue array
    var nextSongInQueue = songQueue.shift();

    // Start playback from the queue
    var jukeboxTune = soundManager.createSound(
        id: 'currentTune',
        url: 'audio/' + nextSongInQueue.name,
        onload: function() 
            this.play();
        ,
        onid3: function() 
            alert('ID3 present!');
        ,
        onfinish: function() 
            this.destruct();    // Destroy this sound on finish
            songFinish();       // Run the songFinish() function, so decide what to do next
        
    );

    jukeboxTune.load();
    //jukeboxTune.play();           // The jukebox running!

    songPlaying = true;             // Set songPlaying flag
    updateSongQueueDisplay();       // Refresh the song queue display (for debug)

    return nextSongInQueue.name;

其他回调工作正常,但 onid3() 警报永远不会出现。我什至将音频播放的加载和播放部分分开,看看是否有帮助。 SoundManager 发现 onid3() 存在是因为它将 usePolicyFile 切换为 true - 鉴于 MP3 是本地的,我假设我不需要担心跨域 XML 文件。

谁能解释为什么这不起作用?我在谷歌上搜索了一些可行的实现,但没有找到任何有用的东西。我看过 Jacob Seidelin 的纯 Javascript 解决方法,但如果可能的话,我宁愿坚持使用 SoundManager,也不愿使用 php 解决方案。

谢谢,

亚当

【问题讨论】:

我没有答案,但是 +1 似乎是一个很棒的音频框架——我没有听说过 SoundManager,这正是我正在工作的项目所需要的开。 【参考方案1】:

对于任何可靠的答案来说,这个问题可能太深奥了,所以我决定在 SM2 库之外调查可能的 Javascript 解决方案。

我从 Nihilogic 的用于读取 ID3v1 标签的库(http://blog.nihilogic.dk/2008/08/reading-id3-tags-with-javascript.html)开始,但由于它可以读取 ID3v2 标签,所以移至 antimatter15 的 js-id3v2 库(https://github.com/antimatter15/js-id3v2)。从提供的示例中调整代码,我成功地解析了通过<input> 控件加载 MP3 时所需的主要标签。

【讨论】:

【参考方案2】:

对于本地文件,我说的是“用户本地文件”(不是“服务器”本地文件),我使用 id3v2.js 取得了一些成功

要获得 ID3,SM2 需要 mp3 主机上的跨域,如果它是另一个域。 另外,我在使用 Soundcloud 时遇到了困难,因为它们将 MP3 重定向到动态 Amazon S3 存储...所以我必须对访客最终 URL 执行 PHP 脚本,然后 SM2 才能获得正确的 crossdomain.xml(检查 https://getsatisfaction.com/schillmania/topics/displaying_waveformdata_of_soundcloud_hosted_track_prompts_securityerror_error_2122)

问题在于 S3 链接和本地用户文件 (blob) 确实有短暂的过期延迟。

祝你好运!

【讨论】:

以上是关于SoundManager2 onid3() 未触发的主要内容,如果未能解决你的问题,请参考以下文章

SoundManager2 - 停止声音时的失真

带SoundManager2的简单JavaScript音频播放器

自动播放音频播放列表 SoundManager2 bar-ui

带有 SoundManager2 的 Amazon Cloudfront RTMP 字符串

如何在 Web Audio API 中将 SoundManager2 定义为媒体元素源

Soundmanager 2:播放另一个声音时停止播放声音