2011年8月4日 星期四

讀取串流影像

把 Red5 主機架起來,也安裝了測試用的範例,但是測試視訊直播的結果發現畫質不夠理想,翻出原始碼修改後仍然沒有顯著的改善,猜想改使用較新的 AVM2 (註)播放會有比較結果。但是當準備開始實作前,卻發現忘了程式要怎麼寫,回想不起一兩年前的回憶,被迫只好自己去上網研究。研究後發現還滿簡單,在這裡作下記錄…

無論是廣播端(發出訊號)或是接收端(收到訊號)都需要先和 Red5 建立連線,皆需要 NetConnection 類別,再來就是需要串流 NetStream 類別。因此第一步就是建立連線…

var connection:NetConnection;
connection = new NetConnection();
connection.addEventListener(NetStatusEvent.NET_STATUS, onConnected);
connection.connect("rtmp://red5srv/oflaDemo");
因為連線需要時間,因此需要偵聽 NetStatusEvent 事件等連線成功再進行下一步驟。
在這個例子中,我的主機名稱是「red5srv」,連到「oflaDemo」服務,這是 Red5 提供的範例服務。

再來就是定義處理事件用的函數…下面的例子是接收端的程式
private function onConnected(event:NetStatusEvent):void {
  if (event.info.code == "NetConnection.Connect.Success") {
    var stream:NetStream = new NetStream(connection);
    stream.bufferTime = 0; // 直播影像,bufferTime可以改成零
    stream.play("red5StreamDemo");

    var video:Video = new Video(640, 480);
    video.attachNetStream(stream);
    addChild(video);
  }
}
事件的傳回值可以由「info.code」取得,詳細的說明就要再查文件了,這裡只處理連線成功的狀況。
接著指定要播放的串流名稱叫「red5StreamDemo」,這是「oflaDemo」所用的名稱,可以讓我在還沒寫出訊號送出前,可以用範例程式輸出的影像作串接。
再來則是建立 Video 物件,只要指定好大小,將串流(NetStrem)放入,加到畫面上就可以看到了!

至於播放端的部分則有一點複雜一些些,就一些而已…把 if 裡的內容改成下面的樣子
var camera:Camera = Camera.getCamera();
camera.setQuality(0, 100);  // 儘可能使用頻寬, 不作影響壓縮
camera.setMode(camera.width, camera.width, 15); // 以鏡頭的影響為主,每秒 15 格

var microphone:Microphone = Microphone.getMicrophone();

var stream:NetStream = new NetStream(connection);
stream.attachCamera(camera);  // 加入影像
stream.attachAudio(microphone); // 加入聲音
stream.publish("red5StreamDemo", "live"); // 廣播!
首先重點當然是抓到「Camera」,這裡不單單指 WebCam,也可能是其它電腦抓得到訊號來源,以我測試的那台電腦,也可以抓到由 1394 線輸入的訊號。
抓到訊號來源,接著是設定抓取影像的大小和品質,因為 Camera 只有單純的影像資訊,所以要另外抓取麥克風(Microphone),才能同時輸出影響和訊號。
最後,把影像和聲音統統塞到串流類別中,利用 publish 方法送出到 Server,第一個是串流的名稱,第二個參數則還沒研究。只知道如果不加的話,訊號也能夠順利送出。之後如果搞清楚後再來補充。

如果想看廣播出來的影像,可以作一個 Video 物件,將 Camera 和 Microphone 加入(attachCamera, attachAudio),倒是不用花費頻寬再寫一下接收的程式。

註︰
範例的 flash 程式是用 ActionScript 2.0 以 Flash 7 發佈,所以是第一代虛擬機 AVM1,而改以 ActionScript 3.0 以 Flash CS4 發佈,會使用第二代虛擬機 AVM2 ,據說效能可以快上十倍,不過我的猜想錯誤,畫質並沒有明顯地提高。

沒有留言:

張貼留言