2017-09-10 2 views

Répondre

1

This Cette page montre comment extraire cette information d'un fichier mp3 en regardant les valeurs d'octets. J'ai donc écrit un petit exemple et l'ai testé. Il semble fonctionner correctement avec tous les fichiers mp3 que j'ai essayés jusqu'ici mais il n'y a aucune garantie que cela marchera toujours. La fonction getPlayTime renvoie la durée de lecture en secondes.

function getPlayTime(file) { 
    var bitratesV1 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320], 
     bitratesV2 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]; 
    var bytes = file.getBlob().getBytes(); 
    for(var pos = 0;pos < bytes.length; pos++) { 
    if(bytes[pos] === -1 && pos < bytes.length - 3 && (bytes[pos+1]&0xF0) === 0xF0) { 
     var isMpegVersion2 = (bytes[pos+1]&8) !== 8, 
      isLayer3 = (bytes[pos+1]&6) === 2, 
      bitRate = ((bytes[pos+2]&0xF0) >>> 4)&0xF; 
     if(!isLayer3) continue; 
     if(isMpegVersion2) bitRate = bitratesV2[bitRate]; 
     else bitRate = bitratesV1[bitRate]; 
     var playTime = bytes.length*8/(1000 * bitRate); 
     return playTime; 
    } 
    } 
} 

function test() { 
    var file = DriveApp.getFilesByName("music.mp3").next(); 
    var playTime = getPlayTime(file); 
    Logger.log(playTime); 
} 

modifier: Voici un je l'espère plus précise, mais aussi beaucoup plus lent la version

function getRunTime(file) { 
    var playTime = 0, numFrames = 0; 
    var bitratesV1 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320], 
     bitratesV2 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]; 
    var bytes = file.getBlob().getBytes(); 
    for(var pos = 0;pos < bytes.length; pos++) { 
    if(bytes[pos] === -1 && pos < bytes.length - 3 && (bytes[pos+1]&0xF0) === 0xF0) { 
     var isMpegVersion2 = (bytes[pos+1]&8) !== 8, 
      isLayer3 = (bytes[pos+1]&6) === 2, 
      bitRate = ((bytes[pos+2]&0xF0) >>> 4)&0xF; 
     if(!isLayer3) continue; 
     if(isMpegVersion2) bitRate = bitratesV2[bitRate]; 
     else bitRate = bitratesV1[bitRate]; 
     var pt = bytes.length*8/(1000 * bitRate); 
     if(!isNaN(pt) && isFinite(pt)) { 
     playTime += pt; 
     numFrames++; 
     } 
    } 
    } 
    return playTime/numFrames; 
} 
+0

Merci beaucoup pour cela. Je vois les efforts qui ont été déployés. Malheureusement, la durée n'est pas exacte, elle est très approximative. J'ai téléchargé l'audio de 24 secondes et il dit 17 secondes. Un avec 24 minutes et il dit 19 minutes. Une idée pourquoi? Est-ce à cause du format? –

+0

Si le fichier mp3 utilise vbr au lieu de l'encodage cbr ou si de grandes images sont incorporées dans le fichier, vous obtiendrez des résultats inexacts. Améliorer cela nécessiterait beaucoup plus d'efforts. Êtes-vous sûr de vouloir une durée précise? Et avez-vous vraiment besoin de déterminer cette durée avec le script des applications? – SpiderPig

+0

J'ai essayé de le rendre un peu plus précis mais ma nouvelle version est aussi beaucoup plus lente. – SpiderPig