2013-02-03 67 views
1

我一直在使用從PhoneGap的文檔(http://docs.phonegap.com/en/2.3.0/cordova_media_media.md.html#media.play)此代碼來播放音頻文件:的PhoneGap(JS) - 多音頻流

// Audio player 
    // 
    var my_media = null; 
    var mediaTimer = null; 

    // Play audio 
    // 
    function playAudio(src) { 
     if (my_media == null) { 
      // Create Media object from src 
      my_media = new Media(src, onSuccess, onError); 
     } // else play current audio 
     // Play audio 
     my_media.play(); 

    // Stop audio 
    // 
    function stopAudio() { 
     if (my_media) { 
      my_media.stop(); 
     } 
     clearInterval(mediaTimer); 
     mediaTimer = null; 
    } 

所以我可以播放帶有onclick事件音頻:

playAudio('http://example.com/file.mp3');

並停止它:

stopAudio();

這工作正常,但我想播放多個流並通過參數「name」來控制它們。

所以我改變了我的代碼:

// Audio player 
    // 
    var my_media = null; 
    var mediaTimer = null; 

    // Play audio 
    // 
    function playAudio(name,src) { 
     if (my_media == null) { 
      // Create Media object from src 
      my_media = new Media(name, src, onSuccess, onError); 
     } // else play current audio 
     // Play audio 
     my_media.play(name); 

    // Stop audio 
    // 
    function stopAudio(name) { 
     if (my_media) { 
      my_media.stop(name); 
     } 
     clearInterval(mediaTimer); 
     mediaTimer = null; 
    } 

//播放和停止文件1: playAudio( '文件1', 'http://example.com/file.mp3');

stopAudio('file1');

//播放和停止文件2:

playAudio( '文件2', 'http://example.com/file2.mp3');

stopAudio('file2');


我收到的唯一的事情是應用程序的崩潰,沒有任何人有玩的PhoneGap多個媒體文件的經驗?

謝謝!

回答

2

基於科爾多瓦2.3文檔:

媒體對象的構造函數期待的第一個參數是「SRC」,但你用它來設置媒體名稱的玩家比對待您的姓名作爲媒體源並嘗試使用'file1'作爲媒體文件的路徑

其他: phonegap Media play()和stop()方法不期望參數,因此您在這些方法調用中提供的名稱將被忽略

你可以嘗試創建一個媒體播放器的二維數組,其中第一個e每行中的lement是名稱,第二個是Media對象。比在你的playAudio和stopAudio功能按名稱掃描陣列和調用正確的對象上的play()和stop()方法

在複製和粘貼下面的代碼之前,請記住我一點也不確定播放多個音頻文件是可能的phonegap。我知道這是不是在移動Safari瀏覽器的音頻元素的支持:http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Using_HTML5_Audio_Video.pdf#page21

var my_medias = new Array(); 
... 
playAudio(name,arc){ 
    var createnew = true; 
    for(var i=0;i<my_medias.length;I++){ 
     if(my_medias[0]==name){ 
      my_medias[1].play(); 
      createnew=false; 
     } 
    } 
    if(createnew){ 
     my_medias.push([name,new Media(src,onError,onSuccess)]); 
    } 
} 

stopAudio(name){ 
    for(var i=0;i<my_medias.length;I++){ 
     if(my_medias[0]==name){ 
      my_medias[1].stop(); 
     } 
    } 
... 

} 
0

我在PhoneGap的新手,我也想打多個媒體文件,如你。 這是我的解決方案,它爲我工作。

var mediaObjects; 
var currentSound; 

// where list is an array of sound name like this ['foo.mp3', 'bar.mp3'] 
function playSound(list){ 
    mediaObjects = []; 
    currentSound = 0; 
    for(var i = 0; i< list.length; i++){ 
     var mediaObject = new Media('/android_asset/www/sounds/' + list[i], onSuccess, onError); 
     mediaObjects.push(mediaObject); 
    } 
    mediaObjects[0].play(); 
} 

在第一個媒體對象播放後。回調函數「的onSuccess」將被調用,這是函數的代碼

function onSuccess() { 
    currentSound++; 
    if(mediaObjects.length <= currentSound){ 
     return; 
    } 
    mediaObjects[currentSound].play(); 
} 

此代碼是不是最好的,但它(對我來說) 和對不起我的英語 希望這有助於工作! :)

0

您可以添加

window.location.reload(); 
stopAudio()

,這是工作中發揮multiple audio

function stopAudio() { 
    if (my_media) { 
     my_media.stop(); 
     window.location.reload(); 
    } 
    clearInterval(mediaTimer); 
    mediaTimer = null; 
}