流媒體服務有一項功能是抓圖,也就是從正在播放的視頻流中獲取圖片。這個功能可以在服務
端實現,具體的思路也比較簡單從視頻流中獲取一幀關鍵幀,解碼后保存成一張圖片並推送給請求
客戶端就可以了。服務端實現簡單但存在一個缺點-:實時性不高。經常抓到的圖是數秒以后的圖片。
其原因是客戶端有播放延時,一般情況下公網下Web客戶端播放rtmp及rtsp流延時在1-2S之間,播放
hls流延時在3-5S,這就意味着從正在播放的rtmp及rtsp流中抓圖,基本上是1-2S以后的圖片,從正
在播放的hls流抓圖 基本上是3-5秒以后圖片。為此,再提供一種抓圖模式:Web前端抓圖。
H5 可以直接利用“video標簽” 截圖,基本代碼如下:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>視頻截圖</title>
<script>
window.onload = function () {
var button = document.querySelectorAll('.screen')[0];
var video = document.querySelectorAll('video')[0];
var canvas = document.querySelectorAll('canvas')[0];
var ctx = canvas.getContext('2d');
var width = 640;
var height = 480;
canvas.width = width;
canvas.height = height;
video.src = ”http://192.168.1.102:12345/cgmedia/hls/getstream/addr=live/34020000001320000001@192.168.1.64_5060/34020000001320000001@192.168.1.64_5060.m3u8“;
video.width = width;
video.height = height;
video.controls = true;
video.autoplay = true;
button.onclick = function () {
ctx.drawImage(video, 0, 0, width, height);
};
};
</script>
</head>
</html>
如果視頻使用video.js播放請注意drawImage方法第一個參數不能直接傳video,需要傳video.childNodes[0]
否則會獲取圖片失敗,報“Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value
is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVide oElement or
HTMLCanvasElement or ImageBitmap or OffscreenCanvas)'錯誤。
如需交流可加QQ群766718184,1038388075 或者QQ3501870,
視頻下載地址:http://www.chungen90.com/?news_33/
Demo下載地址: http://www.chungen90.com/?news_34
