使用ffmpeg轉碼m3u8並播放

簡介
隨着客戶的增長,mp4文件播放的弊端也日益凸顯,主要集中在兩個方面html

當視頻時長比較長的時候,mp4的關鍵幀元素每每很大,須要加載很長時間才能開始播放,網速很差的狀況緩衝加載就要20多秒的時間,客戶早已急不可耐。
當用戶打開一個視頻播放的時候,瀏覽器會持續請求下載mp4文件直到下載完成,就算是用戶暫停視頻播放瀏覽器也會持續這種下載狀態,若是這個視頻文件是500M則會請求服務器下載500M文件,是1G則會不停下載1G,給服務器硬盤和寬帶形成很大浪費和壓力。
爲了解決上述問題,公司打算使用m3u8格式來替代mp4格式。html5

m3u8是蘋果公司開發的一項新型播放格式,這種播放格式支持目前市面的windows、androis、ios設備主流的瀏覽器,一樣的視頻文件既能夠在flash環境播放,又能在無flash的html5環境播放,它的優點還不止於此,它能夠實現多種碼率在不一樣網速下的自動切換,網速好自動切換高清晰度視頻,網速慢自動播放低清晰度文件,還能夠實現流加密(視頻文件自己加密)、分段下載播放、任意時間點拖拽播放、隨機視頻文件廣告插入等等優點,因此公司打算是用m3u8格式做爲視頻格式。ios

mp4轉碼m3u8
若是視頻不爲mp4格式,需先將視頻轉碼爲mp4,可以使用以下命令進行轉換windows

ffmpeg -i 本地視頻地址 -y -c:v libx264 -strict -2 轉換視頻.mp4

將mp4格式轉換爲ts格式跨域

ffmpeg -y -i 本地視頻.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 轉換視頻.ts

將ts文件進行切片瀏覽器

ffmpeg -i 本地視頻.ts -c copy -map 0 -f segment -segment_list 視頻索引.m3u8 -segment_time 5 前綴-%03d.ts

其中segment 就是切片,-segment_time表示隔幾秒進行切一個文件,上面命令是隔5s,你也能夠調整成更大的參數。bash

轉換好的文件服務器

这里写图片描述

跨域問題

在跨域的網站根目錄放crossdomain.xml文件,下面是容許全部的網站(通常不採起這樣的方式,只是方便調試)都可以跨越訪問資源配置以下:dom

<?xml version="1.0" encoding="utf-8"?>
<cross-domain-policy> 
    <allow-access-from domain="*"/>  
</cross-domain-policy>

限制指定網站訪問,能夠參考百度https://www.baidu.com/crossdomain.xml配置網站

<cross-domain-policy>
    <allow-access-from domain="*.baidu.com"/>
    <allow-access-from domain="*.bdstatic.com"/>
    <allow-http-request-headers-from domain="*.baidu.com" headers="*"/>
    <allow-http-request-headers-from domain="*.bdstatic.com" headers="*"/>
</cross-domain-policy>

若是文件存儲在第三方平臺上,好比阿里雲OSS,就把crossdomain.xml放在bucket根目錄下

播放

這裏推薦使用第三方h5播放器ckplayer,集成完成後看下視頻請求

这里写图片描述

能夠看到視頻先加載的m3u8格式的索引文件,而後開始加載視頻,跟據因此文件依次加載abc000.tsabc001.tsabc002.ts,這時候拖動視頻,視頻開始加載abc011.tsabc012.tsabc013.ts跳過了4~10的文件,這就是m3u8的好處,按需加載

相關文章
相關標籤/搜索