【问题标题】:Audio.src and paths in Firefox OSFirefox OS 中的 Audio.src 和路径
【发布时间】:2014-01-21 17:26:28
【问题描述】:

我正在开发一款适用于 Firefox OS https://github.com/Mte90/RingTone-Picker-for-FirefoxOS 和有问题的文件是 script.js

https://github.com/Mte90/RingTone-Picker-for-FirefoxOS/blob/master/script.js#L73 行中,路径正确,如“/emmc/audio.ogg”,但音频播放器返回核心错误 4。 这个问题是路径错误但路径是正确的!

如果我在第 74 行添加 console.log(player.src),则返回类似“app://strangenumberhash/emmc/audio.ogg”的路径。 我完全不知道如何解决这个问题。

【问题讨论】:

    标签: javascript html firefox-os


    【解决方案1】:

    应用协议不允许用于引用打包应用中的音频/视频文件。我相信这是一个安全限制,是为了防止跨应用程序内容读取。您需要在 HTML 中使用音频标签或使用 XMLHttpRequest。类似于以下内容(视频示例):

    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'myvid.ogg');
    xhr.responseType = 'blob';
    xhr.send();
    xhr.onload = function() {
    videoblob = new Blob([xhr.response], { type: 'video/ogg' });
        var openingVideo = new MozActivity({
                name: "open",
                data: {
                    type: [
                      "video/webm",
                      "video/mp4",
                      "video/3gpp",
                      "video/mkv",
                      "video/ogg"
                    ],
                    blob: videoblob
                }
            });                
    
    };
    xhr.onerror = function() {
        console.log('Error loading test video', xhr.error.name);
    };
    

    如果文件在 SDCard 上,您有几个选择:

    您可以只使用选择活动并让用户找到它:

    var act = new MozActivity({
        name: 'pick',
        data: {
          type: 'audio/ogg'
        }
        }); 
    

    或者您可以在清单中设置 sdcard 的读写权限并手动读取它并使用音频标签或打开的 Activity 播放它(很少有错误检查)。

    var sdcard = navigator.getDeviceStorage('sdcard');
    //assumes sample.ogg is located at the top of the sdcard
    var request = sdcard.get("sample.ogg");
    
    request.onsuccess = function () {
      var file = this.result;
      console.log("Get the file: " + file.name);
      var mysrc = URL.createObjectURL(file);
      var audio1 = new Audio();
      audio1.onerror = function(e) {
        console.log(" error playing file ");
      }
      audio1.src =  mysrc;
      audio1.type = "video/ogg";
      console.log( "audio src " + audio1.src);
      audio1.play();
      URL.revokeObjectURL(url);
    }
    request.onerror = function () {
      console.warn("Unable to get the file: ");
    } 
    

    【讨论】:

    • 谢谢,但解决方案不起作用:-/我在 xhr.send() 的控制台中得到 NS_ERROR_FILE_NOT_FOUND:新代码 github.com/Mte90/RingTone-Picker-for-FirefoxOS/blob/master/… 。使用 DeviceStorage API 获取的路径:-//
    • 如果音频/视频文件在打包的应用程序中,您应该能够使用相对 url,而不是 DeviceStorage。在上面的例子中,如果 myvid.ogg 位于打包应用程序的 vid 目录中,我会使用 xhr.open('GET', 'vid/myvid.ogg');
    • 顺便说一句,如果您正在做音频,只需将类型更改为: type: [ "audio/mpeg", "audio/ogg", "audio/mp4" ]
    • 不在打包应用程序中的文件,在 sdcard 中:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多