1. 程式人生 > >HTML5Audio/Video全解(疑難雜症)

HTML5Audio/Video全解(疑難雜症)

1、mp4格式視訊無法在chrome中播放

  Chrome瀏覽器支援HTML5,它支援原生播放部分的MP4格式(不用通過Flash等外掛)。
為 什麼是部分MP4呢?MP4有非常複雜的含義(見http://en.wikipedia.org/wiki/Mp4),普通人對MP4的理解是字尾 為.mp4的檔案。但MP4本身不是一種簡單的視訊格式,它是一個包裝了視訊和音訊格式的殼。至於裡面的視訊和音訊使用什麼編碼格式是可變的。MP4的視訊格式可以使用DivX也可使用H264,Chrome只支援H264。
  然後,我猜測問題的原因是這樣的:Chrome瀏覽器見到MP4字尾的檔案,使用了原生HTML5視訊播放起播放,但卻發現視訊格式無法解碼。對於Firefox,它不支援原生播放MP4,於是使用了Flash,絕大部分的視訊格式基本都可通過Flash播放。
  這 篇2011年1月的訊息提到Google將放棄對H264的支援:http://www.infoq.com/cn/news/2011/01 /chrome-h264。這篇是Google方面的描述:http://blog.chromium.org/2011/01/html-video- codec-support-in-chrome.html。如果Google不再支援在Chrome上原生播放MP4,那麼會呼叫Flash播放器播 放,這樣反而不會出現有些MP4檔案播放不了的問題。
  為什麼Chrome不支援所有的視訊編碼格式?絕大部份的視訊編碼格式都是要付版權費的,Google已經為H264買了單,Firefox沒有Google那麼有錢不願意買。
  最後,我錄製了一段教學視訊,指導大家怎樣把各種視訊轉換成相容性比較好的MP4檔案。視訊中使用的軟體是“格式工廠”

(http://www.formatoz.com/CN/index.html),這個軟體基本上只是做了一個介面,其核心呼叫了開源軟體FFMPEG。由於它違反了FFMPEG的LGPL許可協議,備受指責。使用Linux的朋友可以直接使用FFMPEG命令進行視訊格式轉換,命令如下:
  ffmpeg -i infile.flv -vcodec libx264 o5.mp4
  如果轉換出的視訊在某些裝置還是無法播放,可以試試利用MediaCoder轉換相容性更好的MP4

  2、讓伺服器能正確識別多媒體的MIME型別

  即使對瀏覽器來說,已經設定了正確的媒體,但有可能是您的伺服器並不能正確識別多媒體的MIME型別。MIME型別告訴伺服器如何處理不同的檔案型別。如果你使用Apache,則可以在.htaccess檔案中新增下面的音訊支援:
  AddType audio/ogg ogg AddType audio/ogg oga AddType audio/wav wav AddType audio/mpeg mp3 AddType audio/mp4 mp4 AddType audio/mp4 mpa
  類似地新增如下程式碼,以支援視訊:
  AddType video/webm webm AddType video/mp4 mp4 AddType video/ogg ogg AddType video/ogg ogv
  如果不能訪問伺服器的.htaccess檔案,則有可能在伺服器的控制面板地方有一個選項,允許檢視和新增MIME型別。
  如果是Windows伺服器,那麼可能需要在IIS或者web.config中進行設定在web.config檔案中 。

  3、檔案格式轉換的問題

  一種很常見的情況是,使用者從客戶端提交給服務端一個型別的媒體檔案,並且儘管你已經從它的副檔名中確認了其MIME型別。但是,該檔案沒有 被正確解碼。例如,它可以是一個完全有效的MP4檔案,但由於某種原因,在一些瀏覽器中無法播放。如果發生這種情況,最好把使用者上傳的檔案進行編碼,比如 使用如Miro Video Coverter和Media Converter等編碼器,可以確保正確的編碼。 
  此外,一些檔案,尤其是MP4檔案,在測試時,不要總是在一個支援其格式的瀏覽器中進行測試,這是因為事實上,MP4存在不同的編碼格式,可以根據不 同格式對MP4(又稱如H.264)進行編碼(參考:http://en.wikipedia.org/wiki/H.264#Profiles)如果有 的瀏覽器不支援其中的編碼格式,那麼它自然不會工作。如果遇到這種情況,嘗試確保該檔案是以最基本的MP4編碼方式進行編碼。最好建議使用工具,比如 Miro轉換工具,它能確保MP4檔案能在最多的瀏覽器中得到支援。 
  如果需要支援Firefox 3.6和更低的版本,還需要轉換對應的音訊檔案為Ogg格式},並將它們新增到中的元素中。

  4、能否在MP4完整下載前進行播放?

  一般情況下,HTML5的的音訊和視訊播放器將允許使用者在完整下載檔案前,就可以開始進行播放了,有時候,對於MP4檔案來說卻不能這樣,要必須等待所有的視訊下載完畢再播放,這主要是編碼問題造成的 
  有時,MP4檔案使用索引進行了編碼(其中包含了比如檔案長度等資訊),往往這些資訊是放在檔案的尾部而不是頭部。索引資訊中,包含了檔案的元資訊, 瀏覽器根據這些元資訊去進行下載。如果索引放在後面的話,則必須等待到獲得整個檔案的索引後,才能知道檔案的元資訊,所以就必須等到整個檔案下載完畢才能 開始播放了。 
  如果您遇到這種情況,還有一個簡單的修補程式,是由埃裡克森Renaun提供的,下載地址為:http://renaun.com/blog/code/qtindexswapper/,下載到計算機上執行,則可以把檔案的索引資訊移動到檔案頭並儲存。

  5、避免用JS訪問廢除的屬性

  這個問題看上去好像有點多餘,但每次在Stack Overflow中,都會看到很多開發者發問,比如為什麼某個方法不能執行,原因在於他們使用了不存在的屬性。比如,在 
<audio>和<video>標籤中都有的舊的屬性autobuffer,在2010年10月已經被preload取代了。 
  人們似乎忘記了,HTML5是尚未敲定的標準(雖然它的大部分內容現在已經都相當穩定),所以作為開發者,必須多到W3C的官方網站去進行查閱相關資料。

  6、Firefox 11 以上版本的音量控制的問題

  最近相信不少開發者會發現音量控制的操作在Firefox 11及以上的版本中被取消了。是的,靜音和音量控制仍然是可以使用的,但要通過鍵盤上的上和向下鍵進行控制,其原因主要是發現了兩個bug(請參 考:http://www.iandevlin.com/blog/2012/04/html5/html5-media-controls-and- firefox),這一點請開發者注意,估計firefox會很快修復這個問題。

  7、音視訊播放是否完全脫離外掛?

  HTML5的音訊和視訊點的最大賣點之一就是不需要安裝第三方外掛-例如Flash 
  不幸的是,這不完全正確,ie 9及以上版本的瀏覽器和Safari是需要使用Microsoft Media Player和Apple的QuickTime,才能播放HTML5音訊和視訊。

  8、如何全屏視訊?支援情況如何?

  HTML5 視訊的其中一大威力在於其全屏播放的特性但HTML5 規範中,對這個居然沒有任何提及,相反,在另外一個關於全螢幕播放的API中有定義,但還是在草稿階段,在一些瀏覽器中開始有試驗性的支援。 
  以下瀏覽器去一些支援全屏API,但具體使用的api方法各自有不同: 
  Chrome 19 版本以上 
  Firefox的12 + 
  Safari瀏覽器5.1 + 
  注:iPhone上,video自動全屏播放! 
  也有一些其他方法,能在其他瀏覽器中支援使用全屏API,比如https://github.com/sindresorhus/screenfull.js 
  Internet Explorer9 以上版本忽略了video poster屬性 
  如果在HTML 5的video標籤中使用poster屬性,其含義為在視訊播放前提供一張靜態的圖片給使用者,但ie 9以上的版本,除非設定了preload屬性為none,否則將會忽略掉設定的poster屬性。 
  這是由於Internet Explorer是最遲支援HTML 5的瀏覽器,我們都習慣了其他瀏覽器中,如果設定了poster屬性,則會在播放視訊前,先顯示設定的這張圖片。但IE 9並不這樣做,如果要播放的視訊的第一幀已經載入了,則不會顯示有poster屬性指定的圖片了,而且在IE 10中,目前依然存在這個問題。  

  9、通過HTML5技術能否訪問攝像頭和麥克風?

  HTML 5的起草者們,一直都希望HTML 5能訪問攝像頭和麥克風,因此早期是使用標籤的,但現在是被getUserMedia API所取代了(詳見: http://dev.w3.org/2011/webrtc/editor/getusermedia.html)。 

  API本身是容易使用的 ,但目前瀏覽器支援相當有限。Opera是目前唯一個實現這些功能的瀏覽器,但只支援視訊Internet Explorer 10也將對其進行部分支援,Firefox也會跟隨。

  10、autoplay在iphone/ipad中不能實現的問題

  • 通過iframe 

    1 2 3 4 5 6 7 8 var  ifr=document.createElement( "iframe" );   ifr.setAttribute( 'src' "song.mp3" );   ifr.setAttribute( 'width' '1px' );   ifr.setAttribute( 'height' '1px' );       ifr.setAttribute( 'scrolling' 'no' );   ifr.style.border= "0px" ;   document.body.appendChild(ifr);
  • 通過頁面上的其他觸控或者點選事件來呼叫對應的play()方法

 

  11、解決iPhone中,視訊自動在新視窗開啟問題

      HTML

<video id="player" width="480" height="320" webkit-playsinline>

      Obj-C

webview.allowsInlineMediaPlayback = YES;