Audio.src и пути в Firefox OS

Я работаю над приложением для Firefox OS ‹ 1.3, чтобы установить ваши песни в качестве мелодий звонка. Репозиторий 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». Я понятия не имею, как решить эту проблему.


person Mte90    schedule 21.01.2014    source источник


Ответы (1)


Протокол приложения нельзя использовать для ссылки на аудио- и видеофайлы в упакованном приложении. Я считаю, что это ограничение безопасности, чтобы предотвратить чтение контента между приложениями. Вам нужно либо использовать тег audio в своем 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'
    }
    }); 

или вы можете установить разрешение на чтение и запись на SD-карте в манифесте, прочитать его вручную и воспроизвести с аудиотегом или с открытой активностью (очень небольшая проверка ошибок).

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: ");
} 
person Jason Weathersby    schedule 21.01.2014
comment
Спасибо, но решение не работает :-/ я получаю NS_ERROR_FILE_NOT_FOUND: в консоли на xhr.send(); новый код github.com/Mte90/RingTone -Picker-for-FirefoxOS/blob/master/ . Путь, полученный с помощью API DeviceStorage :-// - person Mte90; 22.01.2014
comment
если аудио/видеофайл находится в упакованном приложении, вы сможете использовать относительный URL-адрес, а не DeviceStorage. В приведенном выше примере, если бы myvid.ogg находился в каталоге vid упакованного приложения, я бы использовал xhr.open('GET', 'vid/myvid.ogg'); - person Jason Weathersby; 23.01.2014
comment
Кстати, если вы делаете аудио, измените тип только на что-то вроде: type: [ audio/mpeg, audio/ogg, audio/mp4 ] - person Jason Weathersby; 23.01.2014
comment
файл, которого нет в упакованных приложениях, находится на SD-карте :-/ - person Mte90; 23.01.2014