1. 程式人生 > >web無外掛解碼播放H264/H265(js解碼HTML5播放)

web無外掛解碼播放H264/H265(js解碼HTML5播放)

專案意義:

長久以來,安防領域的網路攝像機(IPC)的WEB視訊直播都依賴於瀏覽器外掛,IE瀏覽器使用ActiveX外掛,Chrome和Firefox瀏覽器使用NPAPI外掛。
之所以開發瀏覽器外掛來收流、解碼、播放IPC的實時視訊,是因為早期HTML的發展過於緩慢,在純web程式碼無法實現的情況下開發者只能使用外掛來輔助。
此方法的弊端顯而易見,比如使用者使用不方便,開啟web之後需要點選下載並安裝外掛才可以播放IPC的實時視訊,而且很多使用者會擔心第三方外掛的安全性。
原本出於安全考慮,瀏覽器把web程式碼的執行限制於沙箱之中,並限制web程式碼很多本地介面的許可權,營造出比較安全的網路環境。
瀏覽器外掛的設計違背了這個初衷,因為外掛可以獲得和桌面應用程式幾乎一樣的許可權,安裝完外掛之後開啟web時,web程式碼可以呼叫外掛肆意的讀寫電腦本地資料。
這幾年微軟、谷歌、蘋果、Mozilla等各大瀏覽器廠商也意識到了瀏覽器外掛的安全問題,開始在新發布的瀏覽器中限制第三方外掛的使用。
現在Edge、Chrome、Safari、Firefox等瀏覽器已經不支援NPAPI外掛,只剩下IE瀏覽器還在支援ActiveX外掛,導致IPC的web頁面只能在IE核心的瀏覽器播放實時視訊。
所以實現web無外掛實時播放IPC的H264/H265視訊十分重要。

專案描述:

視訊傳輸使用websocket協議,ipc後端推流使用C語言程式設計,web前端收流使用js語言。
web的視訊解碼庫使用js語言,通過emscripten工具把C語言解碼庫程式碼編譯成js。
解碼後的YUV資料轉換為RGB後推到HTML5的canvas播放。

解碼器選擇:

由於找不到合適的開源js解碼器程式碼,所以選用C語言的解碼器,通過emscripten工具把C語言解碼庫編譯成js庫。
先後嘗試過libde265、openhevc、ffmpeg,最後選擇了ffmpeg。ffmpeg原始碼的下載與api使用參考之前釋出的文章。

emscripten安裝:

這個工具的安裝非常麻煩,過程會報很多錯誤,需要預先安裝很多軟體,需要一定耐心。沒關係,根據報錯提示一個個排除,最後就可以成功的。

//下載
wget https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz 
tar -xvf emsdk-portable.tar.gz 
cd emsdk-portable 

//安裝
./emsdk update
./emsdk install latest
./emsdk activate latest

//更新環境變數
source ./emsdk_env.sh

//測試,檢視版本
emcc -v 

libffmpeg.js的編譯
emconfigure ./configure --cc="emcc" --cxx="em++" --ar="emar" --prefix=$(pwd)/../dist --enable-cross-compile --target-os=none --arch=x86_32 --cpu=generic \
 --enable-gpl --enable-version3 --disable-avdevice --disable-avformat --disable-swresample --disable-postproc --disable-avfilter \
 --disable-programs --disable-logging --disable-everything --enable-decoder=hevc --enable-decoder=h264 \
 --disable-ffplay --disable-ffprobe --disable-ffserver --disable-asm --disable-doc --disable-devices --disable-network \
 --disable-hwaccels --disable-parsers --disable-bsfs --disable-debug --disable-protocols --disable-indevs --disable-outdevs 
make
make install

export TOTAL_MEMORY=268435456
export EXPORTED_FUNCTIONS="[ \
    '_avcodec_register_all', \
    '_avcodec_find_decoder', \
    '_avcodec_alloc_context3', \
    '_avcodec_open2', \
    '_av_free', \
    '_av_frame_alloc', \
    '_avcodec_close', \
    '_avcodec_decode_video2_js', \
    '_avcodec_get_image_width_js', \
    '_avcodec_get_image_height_js', \
    '_avcodec_get_chroma_format_js', \
    '_avcodec_get_image_plane_js', \
    '_avcodec_get_image_pitch_js', \
    '_avcodec_get_image_bit_depth_js', \
    '_avcodec_close_AVCodecContext_js', \
    '_avcodec_flush_buffers' 
]"
emcc dist/lib/libavcodec.a dist/lib/libavutil.a \
 -s OUTLINING_LIMIT=100000 \
 -s TOTAL_MEMORY=${TOTAL_MEMORY} \
 -s EXPORTED_FUNCTIONS="${EXPORTED_FUNCTIONS}" \
 -O2 \
 --pre-js libffmpeg_pre.js \
 --post-js libffmpeg_post.js \
 -o libffmpeg.js 

測試效果:

使用最新的Firefox瀏覽器
解碼H264的1080P解析度時,延時可以控制在幾百毫秒以內,測試的最大解析度是2592X1944,也比較實時。
解碼H265的1080P解析度時,比較負荷比較大,會有卡頓現象。

還有更高效能的解決方案,使用WebAssembly解碼H264/H265,可參考我的另一篇文章:

http://blog.csdn.net/Jacob_job/article/details/79436639

http://blog.csdn.net/Jacob_job/article/details/79434207

相關推薦

web外掛解碼播放H264/H265(js解碼HTML5播放)

專案意義:長久以來,安防領域的網路攝像機(IPC)的WEB視訊直播都依賴於瀏覽器外掛,IE瀏覽器使用ActiveX外掛,Chrome和Firefox瀏覽器使用NPAPI外掛。之所以開發瀏覽器外掛來收流、解碼、播放IPC的實時視訊,是因為早期HTML的發展過於緩慢,在純web程

web外掛解碼播放H264/H265(WebAssembly解碼HTML5播放)

我之前寫過一篇《web無外掛解碼播放H264/H265(js解碼HTML5播放)》,與本文的專案意義基本一致,不同的是實現方案有一定差異。之前介紹的是純JS解碼,本文介紹WebAssembly解碼。

安防視訊之web外掛播放視訊

本博文是個宣傳帖子,主要介紹如何把安防攝像機的視訊轉成無外掛Web播放。 安防攝像機主要通過rtsp協議獲取視訊碼流。 Web預覽通過Hls協議進行預覽。 結構圖如下:  這裡我們提供一個轉碼服務,實現把安防的rtsp碼流轉成Hls碼流。 具體轉換過程,可以參考我

EasyNVR、EasyDSS二次開發---RTMP、HLS流在web頁面進行外掛播放(demo)

不管是基於EasyNVR還是EasyDSS,都是支援無外掛直播,這也是未來視訊直播的一個趨勢。對於傳統的瀏覽器外掛播放誰用誰知道; 以上是軟體自帶播放展示 背景需求 對於EasyNVR和EasyDSS的使用方式大概分為兩大類,一

EasyNVR外掛直播伺服器軟體覽器低延時播放監控攝像頭視訊(EasyNVR播放FLV視訊流)

背景描述 EasyNVR的使用者應該都是清楚的瞭解到,EasyNVR一個強大的功能就是可以進行全平臺的無外掛直播。主要原因在於rtsp協議的視訊流(預設是需要外掛才可以播放的)經由EasyNVR處理可以滿足無外掛的全平臺直播。 經由EasyNVR處理會獲取到RTMP、H

EasyNVR外掛直播伺服器軟體如何自己更改web介面(網頁的自定修改)

背景需求 很多使用者都在使用了EasyNVR,看到EasyNVR自身帶有的介面後有這樣的需求,就是需要更改一下web前端的一些樣式,當前EasyhNVR為3.0版本,web前端為了增加前端的執行效率和減小專案體積,使用的vue+webpack進行打包。這樣給那些自身需要更改樣式的

EasyNVR外掛直播伺服器播放頁面的整合----單獨的播放器樣式

背景需求: EasyNVR自身擁有獨立的客戶端體系,安卓和IOS擁有各自獨立的APP, 安卓下載地址:https://fir.im/EasyNVR; IOS下載可直接在APPstore搜尋EasyNVR即可; 對於應用最為廣泛的web端,直接包含在EasyNVR軟體包的www目錄

Android使用MediaCodec硬解碼播放H264格式視訊檔案

前些時間,通過各種搜尋加請教了好幾個同行的朋友,在他們的指點下實現: RTSP+H264實時視訊播放播放及把實時視訊流儲存到手機SD卡中,再對儲存的H264格式檔案進行播放等基本功能。 非常感謝這些朋友的無私幫忙,在實現功能的同時,我也把他們提供的一

FFMPEG實現RTSP中H264資料流解碼 並且實時播放

主要改動原始檔案的讀取 播放器是播放本地檔案 而我們這裡需要讀取的是RTSP中H264資料流 char filepath[1024] = "rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.

適用於各瀏覽器支援圖片預覽,重新整理非同步批量上傳js外掛(2)

之前寫的這個上傳外掛,同事們都覺得還不錯,不過都覺得還不夠完美,於是決定使用業餘時間對此外掛持續優化,可能你過段時間會發現,外掛又增加了新功能什麼的,請注意文章後面評論裡的更新說明。 以前在上傳的時候雖然可以多檔案上傳,但其實是將所有檔案都放到一個form裡面同時提交的,這

Android 解碼MediaCodec 播放H264 265

package io.vec.demo.mediacodec; import java.io.IOException; import java.nio.ByteBuffer; import android.app.Activity; import and

適用於各瀏覽器支援圖片預覽,重新整理非同步批量上傳js外掛

注:在下一篇文章中,已經對這個外掛做了更好的優化,如有需要的童鞋可以看下一篇 檔案上傳無疑是web應用中一個非常常用的功能,不管是PHP、jsp還是aspx、mvc等都會需要檔案上傳,但是眾所周知當使用自帶的檔案上傳功能時總會出現頁面重新整理的情況。當然現在有了html5這

使用C#+FFmpeg+DirectX+dxva2硬體解碼播放h264

本文門檻較高,因此行文看起來會亂一些,如果你看到某處能會心一笑請馬上聯絡我開始擺龍門陣 如果你跟隨這篇文章實現了播放器,那你會得到一個高效率,低cpu佔用(單路720p視訊解碼播放佔用1%左右cpu),且程式碼和引用精簡(無其他託管和非託管的dll依賴,更無需安裝任何外掛,你的程式完全綠色執行);並且如果硬解

使用Gin+WebSocket在HTML中外掛播放RTSP

專案地址:gin-rtsp 在後臺的開發中遇到了對接顯示攝像頭視訊流的需求。目前獲取海康及大華等主流的攝像頭的視訊流使用的基本都是RTSP協議。不過HTML頁面並不能直接播放RTSP協議的視訊流,查詢了一番各種網頁播放RTSP的資料,有如下的一些方案: 外掛開發播放:使用ActiveX等瀏覽器外掛的方式來播

JS 取消iOS播放自動全屏:

edi 參數 取消 lin 瀏覽器 ack sin media 模式 iOS下瀏覽器模式下h5播放器強制是全屏的,除非在app下才可以非全屏播放,需要兩個配置: (1)播放器添加參數: playsinline:true(我使用的是阿裏雲的播放器,其他的需要自己找找是那個參

Web報表工具FineReport二次開發JS之字符串

報表 獲取字符串 網頁 簡介 popu 能夠 int() 例如 位置 在報表開發過程中,有些需求可能無法通過現有的功能來實現。須要開發者二次開發,以FineReport為例。能夠使用網頁腳本、API接口等進行深入的開發與控制。考慮到JS腳本開發的使用較多。這裏先先簡介怎

H264/H265 Nal Unit Header

pan rbsp _id 一個 組成 網絡 標準 指向 ref NAL全稱Network Abstract Layer,即網絡抽象層。在H.264/H.265視頻編碼標準中,整個系統框架被分為了兩個層面:視頻編碼層面(VCL)和網絡抽象層面(NAL)。其中,前者負責有效表示

web.xml中的dispatchservlet後,js,css,甚至gif都不能正常顯示

startup view details article 的人 核心 默認 href com 這個可以說是很多初學Springmvc的人都會碰到一個令人頭痛的問題 那就是為什麽我配置好web.xml中的dispatchservlet後,js,css,甚至gif都不能正常顯示

JS實現音樂播放

我們 title 函數類 offsetx brush inner text 根據 顯示 JS實現音樂播放器 前 言 最近在復習JS,覺得音樂播放器是個挺有意思的東西,今天就來用我們最原生的JS寫一個小小的音樂播放器~ 主要功能: 1

web前端【第七篇】JS的DOM對象一

查找 all 第七篇 children 離開 驗證 eat scrip image 一、什麽是HTML DOM HTML Document Object Model(文檔對象模型) HTML DOM 定義了訪問和操作HTML文檔的標準方法 HTML