2016-06-14 33 views
0

使用角度1.x實現基於webrtc的webapp。 webrtc相關功能在服務中抽象出來,控制器監視服務中的變量。在角度應用指令中觀看和使用webrtc流

在服務中,當我使用$ rootScope。$ apply()設置流(本地或遠程)時,控制器中的watch函數被執行。但是,在同一時間,我在控制檯上看到以下錯誤。

vendor.44edef6c.js:5 TypeError: Illegal invocation 
at P (vendor.44edef6c.js:3) 
at P (vendor.44edef6c.js:3) 
at P (vendor.44edef6c.js:3) 
at o.$digest (vendor.44edef6c.js:6) 
at o.$apply (vendor.44edef6c.js:6) 
at scripts.d348f551.js:6 
at Object.w [as emit] (scripts.d348f551.js:1) 
at scripts.d348f551.js:2 

這隻在看到如果我嘗試設置視頻元素源,而不是當我做一個audion webrtc調用。從服務中傳遞webrtc流對象並使用時是否有任何問題?下面是html

<video ng-src="{{localStream}}" autoplay muted></video> 

回答

1

似乎有一些問題,如果您嘗試觀看從控制器的WebRTC流,因爲流對象是相當複雜和龐大。因此,請使用URL.createObjectURL()將其轉換爲URL字符串,然後撥打$apply()。通過這樣做,我能夠解決這些錯誤。

另外,@ adrian-ber在服務或控制器中建議使用$sce.trustAsResourceUrl()

核心問題似乎是看流對象。躲開它。

+0

觀看流正在導致它以某種方式中斷。如果你手動調用$ apply和user src = {{url}}而不是ng-src,它似乎可以工作。 – Vlada

1

我認爲這是因爲該流URL不是一個可信任的。你必須做這樣的事情:

localStream = $sce.trustAsResourceUrl(window.URL.createObjectURL(localStream)); 
+0

我試過了,但沒有幫助。這個控制檯錯誤在執行$ rootScope $ apply()時被引發到服務中。 – sthustfo

+0

你試過$ safeApply()而不是$ apply()嗎? https://github.com/yearofmoo/AngularJS-Scope.SafeApply –