2013年1月30日 星期三

系統Memo - Silverlight Player影片起始載入問題

為了這個DRM專案被Silverlight搞了好久,菊花都痛了。

自行開發的Silverlight player一直有個問題,就是載入影片"有時候"會卡住,player狀態就停在manifest_ready和media_open中間不上不下。其實困擾有一大半都來自這個"有時候"出現的錯誤,說一是一說二是二程式有錯就不給跑簡單多了,所以我們花了滿多時間在釐清這個問題的原因。

最後從wireshark抓封包以及IIS server log發現,卡住的時候,player不會再送出任何request去抓video / audio fragment,大約是在第六秒和第八秒,切換抓取不同bitrate的時候就出了問題。

What the....!!!!!! How the hell would this happen

所以在載入影片的時候不能切換bitrate? Fuck!!!  這沒有道理啊!!! (後來發現切換bitrate真的跟卡住無關,因為測試用的silverlight player載入影片的時候切bitrate一點他媽的問題也沒有!!)

呼,真是太氣憤了。

我花了一下午新轉了一部低bitrate的影片,讓它容易切換,然後在測試player上卻捅出另一個樓子= = 太過頻繁的切換似乎會讓認證的cookie塞不進去(這只是猜測,實際讓認證抓不到cookie的原因不明),然後我又針對認證裡cookie null的處理作修改之後回來正式環境測試,一試就中,卡住的瞬間有夠想屎!!
所以下午他媽的白忙,player卡住不送request跟cookie null而被認證踢掉根本是兩個問題。

而且照這個情況看來,不送request對silverlight player或是IIS認證來說都不算是個錯誤,單純只是類似thread卡住而便秘又不敢講而已。

既然測試player沒問題,那就把正式player的流程改成跟它一樣吧!

所以我們把正式player的AutoPlay改成true,然後就跟喝了通樂一樣一路順暢............

What the F!!!!!!!!!!

至於為什麼會這樣到現在還沒搞懂。

另外,在載入影片的時候,如果預先載入的30秒都是同一個bitrate(ex. 1200k),什麼問題都沒有,所有的request也都會順利出現在wireshark以及server log裡;但只要載入的時候去抓另一個bitrate的fragment(ex. 2000k),就只會出現抓那個bitrate的request,也就是說,如果第六秒去抓,那就只看到第六秒的request(有時候會有第八秒的)。
為什麼其他的request都消失了,原因一樣不曉得,說不定跟cache有關係?

Update:
(冷靜)

1. 消失的request的確跟cache有關。
2. AutoPlay改成true之後,在第八秒卡住的問題依然存在,雖然無法確定跟AutoPlay無關,但至少不是唯一的原因。又做了一些測試後,我們猜測或許跟解析度有關,因為嵌在網頁上的player大小是400x300(4:3),所以在載入同樣是4:3的1200K影片(640x480)時一切正常,直到bitrate切換16:9的2000K影片(960x540),就立刻爆炸。這也是為什麼一開始在測試player沒有出現過這問題的原因,測試player一直是全螢幕打滿的,不會有比例不符合的錯誤。
但是網頁上的player牽涉到版面設計,沒辦法為了技術問題改變大小,所以我們改成在一開始載入的階段(manifest_ready -> media_opened)限制player抓取影片的bitrate,載入完成後才恢復成原先的multi-bitrate。
問題總算是解決了。




沒有留言: