2007
12.26

用 ActionScript 2.0 和 ActionScript 3.0 播放 H264 Mp4 影片

本來H264 ( mp4 ) 在Flash ( ActionScript 2.0 和 ActionScript 3.0 )的中播放的實驗並沒有排在優先的實驗計畫中,每天要做的事情實在太多了,一個一個來啊,但是昨天晚上網友Kelvin分享了他在Adobe所讀到的一篇關於 ActionScript 3.0 播放 H264 Mp4 的文章,似乎可以直接播放 mp4 的影片,恩,這倒影起我的好奇心,反正不用花太多的時間,優先讓這項測試插隊進來,若對 ActionScript 播放 H264影片有興趣的人,就可以參考這篇文章。

h264_2.jpg

等一下我會示範如何用 ActionScript 2.0 和 ActionScript 3.0 叫入 H264編碼的的影片,不過這是有前提的,你必須至少要滿足兩個前提: 

  1. 至少要有新版的Flash Player (這個測試是用9,0,115,0的版本),否則會無法玩成解碼的動作,要下載新版的Flash Player,可以到Adobe網站下載
  2. 至少要有一段以H264編碼的Mp4影片,沒有的話要怎麼試啊 XD,若是手邊真的沒有這種影片,那可以問google大神這個關鍵字"H264 mp4 轉檔",至少還可以找到轉檔的程式可以將手邊的影片轉成mp4的測試檔。

好啦,如果已經準備好了,就可以開始製作啦,沒錯,你猜的沒錯,我也沒有這種影片,所以我是用轉碼的,要試就來試點刺激的,下圖是轉檔程式中的設定,直接給他衝1280×720的解析度了,不過編碼要選H264 就是了,要不然到時候編碼格式不對,Flash Player也不會對你客氣……………………………..直接罷工 XD

h264_1.jpg

來來來,看清楚了,真的是mp4 (MPEG-4)的影片格式,好啦,原料都有了,來開始寫ActionScript吧。

h264_3.jpg

這邊的ActionScript示範就不多花口水,也不寫太多的功能,反正只要叫出來能撥就好,細節我就不太多說了,可以參考Adobe原廠的說明或是[Flash CS3 professional 打造互動設計力與美]一書中第10章中的介紹,上面有將NetConnection和NetStream原理和使用解釋的非常清楚了。 

首先先示範ActionScript 2.0的寫法:

var video:Video;
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.onStatus=function(info:Object){
 for(i in info){
  trace(i+": "+info[i]);
 } 
}
video.attachVideo(ns);
video._width=Stage.width;
video._height=Stage.width*(720/1280);
ns.play("movie_1280x720.mp4");

這樣就搞定啦,簡單吧,寫完播放就可以看到影片開始播放了,不過要注意的是,若你寫的是ActionScript 2.0,請記得一定要在場景上放置一個 Video (視訊元件),否則是無法正確執行的,但是ActionScript 3.0就沒這個問題。

再來示範ActionScript 3.0的寫法:

import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.NetStatusEvent;
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS,statusHandler);
var video:Video = new Video();
video.attachNetStream(ns);
this.addChild(video);
ns.play("movie_1280x720.mp4");

video.width=stage.stageWidth;
video.height=stage.stageWidth*(720/1280);

function statusHandler(event:NetStatusEvent):void{
 for(var i:String in event.info){
  trace(i+": "+event.info[i]);
 }
}

執行結果如下圖,如果你的螢幕解析度夠大,可以將場景直接開到1280x720,就可以看到1:1的影片了,為了展示方便(其實是我的螢幕只到1024x768)我是用500x320來做測試。

h264_2.jpg

接下來我想這是大家關心的問題,H264影音播放會耗掉多少資源,我測試的電腦是使用Intel CPU T2300和1.5G的DDR RAM,播放時CPU使用率都在12%到48%之間跳動,看起來似乎沒有什麼太大的問題,不會消耗太多的資源。

h264_4.jpg

好啦,試驗到這邊來下個結論吧,在我用同一台機器分別測試 ActionScript 2.0 和ActionScript 3.0 得到以下的結論:

  1. 不管是 ActionScript 2.0 也好, ActionScript 3.0 也好都可以直接播放mp4格式的影音,不需要再轉成FLV的格式。
  2. 不論是 ActionSctipt 2.0 和 ActionScript 3.0 都可以透過 Flash Player 9 以上的版本支援 H264影音播放,皆可正常執行。
  3. 不論是用 ActionScript 2.0 和 ActionScript 3.0 程式的寫法都跟之前一模一樣,不須要再學新的語法或觀念才能操作H264的影片。
  4. 在影音播放上 ActionScript 3.0 的效率跟 ActionScript 2.0 相比,並沒有顯著性的差異,但是若是多家一些操控或是畫面控制,我想差異就會出來了,不過單以影音播放效率來說差異不明顯。
  5. H264 影片在 Flash 上播放是可行的方案,不過我比較擔心頻寬的問題,網路不夠寬的時候應該會先掛在頻寬上,在硬體上可以使用硬體加速,這倒是問題不大,而且H264已經有很多顯示卡要納入硬體解碼的標準了。

若是想看關於H264的一些知識,其實Adobe的這篇文章[Exploring Flash Player support for high-definition H.264 video and AAC audio]說的蠻清楚了,也包含了ActionScript 3.0和Flex的示範,我就不浪費資源自己寫,也不做英翻中了,可以自己參考,若是想看 ActionScript 2.0 的寫法,這篇文章中有同時示範了 ActionScript 2.0 和 ActionScript 3.0 的作法了 ,中文詳細的說明可參考[Flash CS3 professional 打造互動設計力與美]一書中第10章中的介紹


相關文章:
  • Facebook 的ActionScript API 更新到 3.3版
  • Flash on iPhone,代誌就這麼發生了
  • 用ActionScript讀取相片中的exif資訊
  • 現場直擊Flash/Flex特效瘋-8/26活動內容預告
  • Bitmap與BitmapData
  • 本文引用:
    文章內容由宋志峰[ANISTAR]撰寫,引用分享請以鏈結形式註明出處與原始作者。

    7 comments so far

    Add Your Comment
    1. 您好可否請問一下讀取flv檔的AS2寫法,這是3.0的請問改成2.0該怎麼寫呢?如果有空時可否為我解答一下呢?感激不盡
      var my_nc:NetConnection = new NetConnection();
      my_nc.connect(null);
      var my_ns = new NetStream(my_nc);
      my_ns.client=this;
      var myPlayer:Video=new Video(478,330);
      videohere_mc.addChild(myPlayer);

      play_btn.addEventListener(”click”,playVideo);
      function playVideo(Event:MouseEvent):void{
      my_ns.play(”film/mov1.flv”);
      myPlayer.attachNetStream(my_ns);
      }

      pause_btn.addEventListener(”click”,pauseVideo);
      function pauseVideo(Event:MouseEvent):void{
      my_ns.togglePause();
      }

      stop_btn.addEventListener(”click”,stopVideo);
      function stopVideo(Event:MouseEvent):void{
      myPlayer.attachNetStream(null);
      myPlayer.clear();
      my_ns.close();
      }

      • 你把addEventListener(”click”,playVideo) 的寫法改成onPress=function(){}的做法就差不多了, 加油囉.

    2. 小弟公司 http://verywed.com/video 已經用h264編碼上線囉
      效果還可己接受 如果給更大的頻寬畫質真的是會很不錯的

    3. 各位觀眾,留言板已經設好了,聊天說地以後就可以在留言板聊了。
      接下來該不會要討論區吧? XD

    4. 留言板! 推x1000!!!
      雖然最近很操,有空還是回來阿尼這逛逛~

    5. Dear Uni:
      找工作眼睛要睜大小心喔,還好你有先到網路上搜尋一下,年前年後職缺會比較多,可以把握機會朝自己的優勢邁進。
      回答你的ps,因為我偷懶 Orz,趁這次週末來弄個留言板或是自己寫一個好了。

    6. (web2.0班)最近還在找工作中…結果今天就有公司打電話來叫我明天去面試…
      是一家叫做"瑋智"的公司(不知道老師友沒有聽過?),
      結果我就去網路上查這家家公司…
      結果發現這家公司的性質原來是跟"恆逸"一樣是補教業…
      然後我又去奇摩知識查…
      http://tw.knowledge.yahoo.com/question/article?qid=1707083105600
      原來這家公司風評很差,還有騙錢的嫌疑…
      所以我決定不去面試了…(害我還高興一下Orz)
      大家要小心這家公司…
      ps.老師為甚麼不弄個留言板…這樣比較方便說(題外話)!