2011年11月3日 星期四

FMS Stream live media over HTTP

這兩天在研究 FMS 4.5,透過 HTTP 看 live stream 的作法。

最後終於 google 到官方文件,看得懂英文的人請直接看原出處:
Stream live media (HTTP)
http://help.adobe.com/en_US/flashmediaserver/devguide/WSd391de4d9c7bd609-52e437a812a3725dfa0-8000.html

===========================================================

作法一:

FMLE 將 camera 編碼成單一 bit rate,送給 FMS 的 rtmp://127.0.0.1/live 的 livestream:


client 端,可使用 FMS 提供的 sample player - StrobeMediaPlayback 來觀看,將
{FMS}\samples\videoPlayer
複製到
{FMS}\webroot\videoPlayer
就可以用了

瀏覽網址:
http://localhost/videoPlayer/videoplayer.html?source=rtmp://localhost/live/livestream&type=live

stream url = rtmp://localhost/live/livestream

這樣就可以看到 RTMP 的 stream

===========================================================

作法二:

FMLE 將 camera 編碼成多組 bit rate,送給 FMS 的 rtmp://127.0.0.1/live 的 livestream%i:


在 apache web server 上,準備 live.f4m 這個 manifest 檔案,放在網站根目錄下:

<manifest xmlns="http://ns.adobe.com/f4m/1.0">
<id>Dynamic Streaming</id>
<baseURL>rtmp:/live/</baseURL>
<streamType>live</streamType>
<media url="livestream1" bitrate="150"/>
<media url="livestream2" bitrate="300"/>
<media url="livestream3" bitrate="650"/>
</manifest>

瀏覽網址:
http://localhost/videoPlayer/videoplayer.html?source=http://localhost/live.f4m&type=live

stream url = http://localhost/live.f4m

這樣就可以看到依照不同頻寬而決定的 RTMP 的 stream

===========================================================

作法三:

請參考官方文件中 "Publish and play a single live stream over HTTP" 這段!

先修改 FMLE 設定檔:

{FMLE}\conf\config.xml

<flashmedialiveencoder_config> 
    <mbrconfig> 
        <streamsynchronization> 
            <!-- "true" to enable this feature, "false" to disable.                    --> 
            <enable>true</enable>

重新啟動 FMLE,使用 FMLE 將 camera 編碼成單一 bit rate,這次不是送給 FMS 的 live application,而是改送給 livepkgr 的 livestream?adbe-live-event=liveevent:


livepkgr 會將收到的 live stream 儲存成為 f4f 與其他相關檔案,放在以下目錄:

{FMS}\applications\livepkgr\streams\_definst_\livestream


瀏覽網址:
http://localhost/videoPlayer/videoplayer.html?source=http://localhost/hds-live/livepkgr/_definst_/liveevent/livestream.f4m&type=live

stream url = http://localhost/hds-live/livepkgr/_definst_/liveevent/livestream.f4m

這份 livestream.f4m 的 manifest 檔案不是由我們預先準備好的,而是由 apache 的 f4fhttp modules 所動態產生出來的,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="http://ns.adobe.com/f4m/1.0">
 <id>
  livepkgr/events/_definst_/liveevent
 </id>
 <streamType>
  live
 </streamType>
 <duration>
  0
 </duration>
 <bootstrapInfo
   profile="named"
   url="../../../streams/livepkgr/streams/_definst_/livestream/livestream.bootstrap"
   id="bootstrap6971"
 >
 </bootstrapInfo>
 <media
   streamId="livestream"
   url="../../../streams/livepkgr/streams/_definst_/livestream/livestream"
   bootstrapInfoId="bootstrap6971"
 >
  <metadata>
   AgAKb25NZXRhRGF0YQgAAAAAAAV3aWR0aABAdAAAAAAAAAAGaGVpZ2h0AEBuAAAAAAAAAAx2aWRlb2NvZGVjaWQCAARWUDZGAAl0cmFja2luZm8KAAAAAgMACXRpbWVzY2FsZQBAj0AAAAAAAAAIbGFuZ3VhZ2UCAANlbmcAAAkDAAl0aW1lc2NhbGUAQI9AAAAAAAAACGxhbmd1YWdlAgADZW5nAAAJAAAJ
  </metadata>
 </media>
</manifest>

可以看出,它會指向 {FMS}\applications\livepkgr\streams\_definst_\livestream 找尋對應的 stream 片段丟回給 client 端。client 端就會不斷的將收到的片段播放出來:


===========================================================

作法四:

請參考官方文件中 "Publish and play live multi-bitrate streams over HTTP" 這段!

設定 FMLE 的步驟與 作法三 相同。

移除 Manifest.xml,避免 apache 根據此文件來當作動態產生 *.f4m 的依據。

FMLE 將 camera 編碼成多組 bit rate,送給 FMS 的 livepkgr 的 livestream%i?adbe-live-event=liveevent:




接著,要來準備 liveevent.f4m 檔,使用 FMS 內建的工具:

{FMS}\tools\f4mconfig\configurator\f4mconfig.html 或 f4mconfig.swf


產生的 liveevent.f4m 如下:

<manifest xmlns="http://ns.adobe.com/f4m/2.0">
  <baseURL>http://localhost/hds-live/livepkgr/_definst_/liveevent/</baseURL>
  <media href="livestream1.f4m" bitrate="150"/>
  <media href="livestream2.f4m" bitrate="300"/>
  <media href="livestream3.f4m" bitrate="650"/>
</manifest>

此 f4m 檔可以放在 web server 的任一處,我放在根目錄下:

{FMS}\webroot\liveevent.f4m



瀏覽網址:
http://localhost/videoPlayer/videoplayer.html?source=http://localhost/liveevent.f4m&type=live

stream url = http://localhost/liveevent.f4m

這醬就可以看到 liveevent.f4m,然後根據不同頻寬決定要再讀取哪一個 livestream{i}.f4m,這個 livestream{i}.f4m 會動態產生,會指到對應的 stream 資料夾與相關檔案片段。


測試時,會根據 client 端頻寬的變化而動態決定載入不同 bit rate 的影片片段 (livestream{i}Seg{nnnnn}-Frag{nnnnn}):


===========================================================

補充:

官方文件中,這篇有說明背後的原理與流程:
Configure HTTP Dynamic Streaming and HTTP Live Streaming
http://help.adobe.com/en_US/flashmediaserver/devguide/WSeb6b7485f9649bf23d103e5512e08f3a338-8000.html

13 則留言:

落九天 提到...

請教這位大哥
小弟有一專案需要將網路攝影機的即時影像交由FMS進行廣播發送
研究許久都沒看到相關做法 能否請指導一下
PS網路攝影機可已下達Http方式進行影像串流輸出

Ben Chang 提到...

官網有提供完整說明

http://help.adobe.com/en_US/flashmediaserver/devguide/WS5b3ccc516d4fbf351e63e3d11a0773cfae-8000Dev.html

看你想用哪種作法都可以

落九天 提到...

這位大哥再次打擾
官網上的文件看來都比需配合Flash Media Live Encoder 而在該系統中的頁面上有一Device的選項 看來都屬於WebCAM裝置
而我所使用的均是獨立的網路攝影機除非有安裝相關的Capture Driver才能使用 我這樣的說法是否正確
另外如果我有兩支以上的攝影機 那可以開啟兩個Flash Media Live Encoder同時運作嗎
如造成不便 請你見諒
謝謝

Ben Chang 提到...

不用擷取卡,一般網路攝影機皆可,FLME 可以抓得到我 NB 內建 30萬畫素的 webcam。

FLME 可以開啟多個。

若你要自己用 Flash 寫,請參考 NetStream 與 Camera 類別的用法:
http://help.adobe.com/zh_TW/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#attachCamera%28%29

匿名 提到...

請教一下,在4.5版下,如果我想讓它用live的方式循環播放目錄裡的檔案,應該要如何實現? 以確保不論先後順序,使用者看到的畫面都是同步的.

謝謝!

Ben Chang 提到...

@ 落九天

這幾天我正好接觸到類似情況,我們使用了 Sony 業務級攝影機,搭配 BlackMagic Design 的影像擷取卡,這樣是 OK 的。

另一個情況我暫無此需求、測試,針對開啟兩個 FMLE 分別操控不同 camera 的部分,我測 FMLE 是可以開兩個 process 起來,我認為只要電腦中能抓到兩個 camera 應該就沒有問題。因我手邊沒這樣的測試環境,所以就不幫你測了。

Ben Chang 提到...

@ 匿名

聽起來有點像是 電視節目轉播,都要依照節目表來播放。

若是我要作的話,我會嘗試看看,每個連入的 client,都會判斷決定現在應該播放哪個節目?從第幾分幾秒開始播。譬如 8:17 連進來的玩家,就要播放排定 8:00 的節目,從第 00:17:00 的地方開始播放。

另外,因為網路頻寬問題,所以有可能從 8:59 -> 9:00 的時間,有人可能上一段節目還沒有看完,你們要決定是要讓他看完,或是直接切斷 的機制。這部分就要寫 server script 來強制切換播放下一個節目。

Oscar 提到...

謝謝大哥的分享,我照著方法一成功了
但是想做更進階的東西,像下面網址提到的多台FMS共享方式不知道能不能搭配您這個方法呢?
http://blog.5d.cn/user6/xbzg/200710/443692.html

想做的是:Webcam->FMS(A)->FMS(B)->Client端
避免A被攻擊

Ben Chang 提到...

@ Oscar

依照不同的需求,請參考以下文章:

Multi-point publishing between servers
http://help.adobe.com/en_US/flashmediaserver/devguide/WS5b3ccc516d4fbf351e63e3d11a0773d56e-7ffbDev.html

或以下:

Load balancing
http://help.adobe.com/en_US/flashmediaserver/configadmin/WS5b3ccc516d4fbf351e63e3d119f2925d1a-7ffc.html

Deploying edge servers
http://help.adobe.com/en_US/flashmediaserver/configadmin/WS5b3ccc516d4fbf351e63e3d119f2925d1a-7ffd.html

Oscar 提到...

@Ben Chang

謝謝您的幫助,我要做的是Multi-point publishing between servers沒有錯

但是在設定的時候遇到一點問題,在說明文件裡提到Server1 & Server2 都要在main.asc裡面添加程式碼,不過在FMS 4.5的資料夾內搜尋main.asc 會搜尋到10筆左右的資料, webroot\applications\live\main.asc 看起來好像是這個檔案,但是測試的結果是網頁一直在loading,過了10分鐘左右出現無法顯示網頁的訊息

想請您指點一下,是否是我用的main.asc錯誤?

Ben Chang 提到...

@ Oscar

你需要先對 FMS 中的 Application 有基本認識,如何在一個 Application 中撰寫 server site script 等概念有了解,再來看這些文章就很容易懂了。

Oscar 提到...

@ Ben Chang

感謝您的提點,我會去研究Application的語法,另外想請問您,想深入了解FMS的話,市面上是否有適合的書籍?國內的FMS中文書似乎都是同一個作者…

Ben Chang 提到...

@ Oscar

好像很久沒看到相關中文書了吧~我是在 Macromedia Flash Communication Server 的年代看過趙英傑的書,現在若有需要大多 google 找