Wednesday, May 26, 2010

自從某公司引進iPhone以來, 我很常被問到一個問題, 那就是, 為甚麼iPhone可以看Youtube影片, 而其它同樣使用Flash Video Solution的網站(如土豆網) 卻不行?

這個問題, 也許我們該從Flash & FLV 的關係說起.
自Flash 6 起, Flash 新增了播放Video 的功能, Flash 的檔案裡面有甚麼東西, 我們可以藉由下圖來說明(取自Adobe 網頁, Flash Platform的圖)




可以看到, Flash 就像一個容器(或稱為Container) 裡面包含了許多Component, 其中有一部份是處理Video的.
在某些情況下, 使用者不想要其它的功能, 只想留Video 的部份時, FLV就成了當然的產物.
或者, 我們從另一個角度來看這樣的情況, 在一個擺有Flash 想讓人看影片的網頁. 他會是像以下的情況


套句Shrek 的話, 很像Orge吧, 不是, 是很像洋蔥吧, 一層一層的.

簡單說完了Flash 和 FLV 的關係. 那麼, 回到原本的命題, 為甚麼iPhone 可以看Youtbue影片而不能看其它Flash Video 網頁呢?(如大陸很火紅的'土豆網')

我作了以下的實驗
1. 找一台裝有FireFox 和 "Modify Headers" Plug-in的電腦. 將iPhone的 user-agent value 設進headers.
2. 打開wireshark, 抓packet.
3. 在firefox 裡輸入http://www.youtube.com 點選影片開始播放.
4. 停止Capture, 從抓到的packet裡進行分析和推論.

我們發現, 在播放影片時, 會去對youtube網頁下一個GET command. youtube 會回傳一個 x-flv 的content type, 和對應的資料回來. 我們將這個URL 直接copy出來, 丟到chrome browser裡, 發現會被存成一個videoplayback(無副檔名) 的檔案.

這時, 打開KMPlayer. 將這檔案丟進player, 看player中帶出的檔案內容為何.



噹噹, 原來是一個FLV File!

根據Wiki 上的說法, iPhone是直接連到Youtube上的FLV 檔進行播放.

所以原本的命題我有了以下的推論.

當年Apple Youtube(Google) 談合作時, 為了讓兩邊要作的事情不要多到爆炸. 兩者達成一些協議,
其中至少包含了:
1. Youtube 配合將Content codecVP6(1) 轉為H.264 以提高Video quality. 在這之前
2. Apple iPhoneimplement 可以解Flash Video Library built-in Media Player 使用
3. Youtube 更改網頁, iPhone手機點選Video , 可以直接存取FLV file, 再由iPhoneMedia Player 繼續後續操作. 要注意的是, 這邊兩方的溝通是否有暗藏一些外人不了解的部份,目前無法得知.


我們來回頭驗證一下前面的3點推論.
第1點, 這是100% 確定的. (見前圖)
第2點, 如果有玩JB的朋友, 也許有聽過 MPlayer 這個iPhone AP, 這是個可以播放FLV 的Media Player.
個人相信一般的App不會願意實作一個新的Media player 出來, 使用既有的Library/API 是最快的方式.
第3點, 我們也從WireShark抓到的Packet中得到了證實.

那麼, 為甚麼一般Flash Video 網頁不能讓iPhone 看呢? 很簡單, 因為他們沒有作 1& 3 這兩點.
如果你的網頁有Flash Video, 又是以H.264進行encode, 也許, 可以考慮Youtube的作法, 作出一個Work Around, 這樣就可以省去deploy HTTP Streaming 的不少時間和精力.



No comments:

Followers

About Me

My photo
有人叫我肯公, 有人叫我肯公公 或是 肯爺. 總之, 有肯, 又有老的感覺就是了