2017-09-10 3 views

답변

1

This 페이지는 바이트 값을보고 mp3 파일에서 해당 정보를 추출하는 방법을 보여줍니다. 그래서 간단한 예제를 작성하고 테스트했습니다. 지금까지 시도한 모든 mp3 파일에서 제대로 작동하는 것 같지만 항상 작동한다는 보장은 없습니다. getPlayTime 함수는 재생 시간을 초 단위로 반환합니다.

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); 
} 

편집 : 여기

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

이에 대한 정말 감사 희망보다 정확한뿐만 아니라 훨씬 느린 버전입니다. 나는 들어가는 노력을 봅니다. 그러나 불행히도 기간은 정확하지 않습니다, 그것은 매우 근사합니다. 24 초의 오디오를 업로드했으며 17 초가 걸렸습니다. 하나는 24 분이고 19 분이라고합니다. 왜 그런가? 포맷 때문인가요? –

+0

mp3 파일에서 cbr 인코딩 대신 vbr을 사용하거나 파일에 포함 된 이미지가 크면 부정확 한 결과가 발생합니다. 이를 개선하려면 훨씬 더 많은 노력이 필요합니다. 정확한 기간이 필요하십니까? 그리고 앱 스크립트로 그 기간을 결정해야합니까? – SpiderPig

+0

좀 더 정확하게하려고했지만 새 버전은 훨씬 느립니다. – SpiderPig