2016-11-17 108 views
3

我試圖從http請求中得到一個數組緩衝區,這個請求明確地說是一個數組緩衝區。然而,我沒有設法做到這一點,關於這個問題的文件是相當稀缺的。Http,你如何處理角度2中的非文本響應?

let headers = new Headers({'Content-Type': "audio/mpeg"}); 
let options = new RequestOptions({responseType: ResponseContentType.ArrayBuffer, headers: headers }); 
this.http.get("http://localhost:4200/piano/A4.mp3") 
     .subscribe((response)=> this.play(response)); 

但我無法設法從響應中獲取數組緩衝區。控制檯中的響應主體無法識別,因此我認爲它必須是正確的格式。此外,響應的內容類型確實是「音頻/ mpeg」。

編輯:這裏是未來的讀者

play(arrBf) { 
    this.audioContext.decodeAudioData(arrBf, (buffer) => { 
     let source = this.audioContext.createBufferSource(); 
     source.buffer = buffer;     
     source.connect(this.audioContext.destination);  
     source.start(0);       
    }); 
    } 

    loadSounds(){ 
    let options = new RequestOptions({responseType: ResponseContentType.ArrayBuffer}); 
    this.http.get("http://localhost:4200/assets/piano/A4.mp3", options) 
     .map(r => r.arrayBuffer()) 
     .subscribe((d)=> { this.play(d)}); 
    } 

,並定義構造函數或smtg音頻方面的一些工作代碼:

constructor(private http:Http) { 
    let AudioContext_ = AudioContext || webkitAudioContext; 
    this.audioContext = new AudioContext_(); 
    } 
+1

你嘗試沒有括號'新的Blob(response.blob(),{type:'audio/mpeg'})'? – PierreDuc

+0

但是如果你做了response.blob(),你爲什麼要把它放在一個新的Blob調用中?也許你可以使用'response.arrayBuffer()'來啓動blob – PierreDuc

+0

讓我把它製作成答案:) – PierreDuc

回答

0

這裏是未來的讀者

play(arrBf) { 
    this.audioContext.decodeAudioData(arrBf, (buffer) => { 
     let source = this.audioContext.createBufferSource(); 
     source.buffer = buffer;     
     source.connect(this.audioContext.destination);  
     source.start(0);       
    }); 
    } 

    loadSounds(){ 
    let options = new RequestOptions({responseType: ResponseContentType.ArrayBuffer}); 
    this.http.get("http://localhost:4200/assets/piano/A4.mp3", options) 
     .map(r => r.arrayBuffer()) 
     .subscribe((d)=> { this.play(d)}); 
    } 

,並定義構造函數或smtg音頻方面的一些工作代碼:

constructor(private http:Http) { 
    let AudioContext_ = AudioContext || webkitAudioContext; 
    this.audioContext = new AudioContext_(); 
    } 
1

要從Response對象獲得Blob Angular2你可以使用arrayBuffer()方法:

let blob: Blob = new Blob([response.arrayBuffer()], {type: 'audio/mpeg'}); 
從角

文件還沒有更新,雖然

+0

正如我在上面回答你'response.arrayBuffer();'訣竅將響應轉換到數組緩衝區是啊。在我的具體情況下,實際上並不需要轉換爲blob。不幸的是,由於某些原因無法解碼數據,我仍然無法播放聲音。但這是我想要的另一個問題:) – Ced