用canvas實現視訊播放與彈幕功能
寫在最前
本次分享一下使用canvas來進行視訊播放並且新增彈幕功能。
歡迎關注我的部落格,不定期更新中——
效果圖
示例原始碼見:原始碼地址
可以看到上方為一段視訊,下面是用canvas來重新繪製的視訊,並且支援動態的新增彈幕。
canvas載入視訊
canvas中的drawImage
方法繪製圖片所需要的資料來源不單單是某張圖片,同樣可以是使用視訊的某一幀來進行繪製。就像這樣:
var video = document.getElementById('video')
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var ctx.drawImage(video, 0, 0, width, height);//當視訊開始播放後觸發這個方法可以開始繪製視訊
為什麼通過canvas繪製視訊?
因為canvas提供了getImageData
&& putImageData
方法使得操作者可以動態得來更改每一幀影像的顯示狀態,如果你知道它應該怎麼變:)
比如像MDN中提到的可以對上面這段視訊中的黃色背景進行色調的變化:mdn示例地址
this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);
let frame = this.ctx1.getImageData(0, 0, this.width, this.height);
let l = frame.data.length / 4;
for (let i = 0; i < l; i++) {
let r = frame.data[i * 4 + 0];
let g = frame.data[i * 4 + 1];
let b = frame.data[i * 4 + 2];
if (g > 100 && r > 100 && b < 43)
frame.data[i * 4 + 3] = 0; //將視訊黃色部分的透明度進行了變化
}
this.ctx2.putImageData(frame, 0, 0);
視訊中效果截圖如下:
更多關於canvas的影像操作可以參考下面這兩篇文章:
- 基於canvas實現波浪式繪製圖片
- 基於canvas實現的一個截圖小demo
基於canvas的影像處理可以實現很強大的功能,比如濾鏡啊之類的~
騰訊的Aolly Team團隊出品的AlloyImage - 基於HTML5技術的專業影像處理庫就是個很好的範例。作者就搞不明白那些高深的東西了,什麼拉普拉斯運算元,各種運算元:)
彈幕功能
彈幕功能分為兩部分:
- 監聽新彈幕的推送
- 渲染彈幕到頁面
監聽新彈幕的推送
通過維護一個彈幕陣列來實時去渲染每一個彈幕字條的應有位置。而何時更新這個陣列,為了解耦作者使用了釋出訂閱的方式來進行陣列的更新。當然這裡並不是一定要使用這種模式,只不過作者剛剛學習完所以拿來用一下而已。千萬別噴我:)
var Event = (function(){
var list = {},
listen,
trigger,
remove;
listen = function(key,fn){ /收集監聽事件
if(!list[key]) {
list[key] = [];
}
list[key].push(fn);
};
trigger = function(){/觸發後依次執行回撥
var key = Array.prototype.shift.call(arguments),
fns = list[key];
if(!fns || fns.length === 0) {
return false;
}
for(var i = 0, fn; fn = fns[i++];) {
fn.apply(this,arguments);
}
};
remove = function(key,fn){
var fns = list[key];
if(!fns) {
return false;
}
if(!fn) {
fns && (fns.length = 0);
}else {
for(var i = fns.length - 1; i >= 0; i--){
var _fn = fns[i];
if(_fn === fn) {
fns.splice(i,1);
}
}
}
};
return {
listen: listen,
trigger: trigger,
remove: remove
}
})();
//呼叫方式
Event.listen('data', addNewWord)
$('#submit').click(function() { //點選傳送後便觸發data事件
var data = $('input').val()
Event.trigger('data', {
value: data,
})
})
function addNewWord (data) {
var newWord = new Barrage(this.canvas, this.ctx, data) //構建新的彈幕例項
wordObj.push(newWord)
},
渲染彈幕到頁面
宣告瞭一個彈幕的建構函式,內部包含了其各種屬性並且在原型鏈中新增了draw方法來進行繪製:
function Barrage(canvas, ctx, data) {
this.width = canvas.width
this.height = canvas.height
this.ctx = ctx
this.color = data.color || '#'+Math.floor(Math.random()*16777215).toString(16) //隨機顏色
this.value = data.value
this.x = this.width //x座標
this.y = Math.random() * this.height
this.speed = Math.random() + 0.5
this.fontSize = Math.random() * 10 + 12
}
Barrage.prototype.draw = function() {
if(this.x < -200) {
return
} else {
this.ctx.font = this.fontSize + 'px "microsoft yahei", sans-serif';
this.ctx.fillStyle = this.color
this.x = this.x - this.speed
this.ctx.fillText(this.value, this.x, this.y)
}
}
最後
慣例po作者的部落格,不定時更新中——
有問題歡迎在issues下交流。
相關文章
- 實現播放視訊及彈幕
- html5 canvas實現高併發視訊彈幕功能HTMLCanvas
- Dplayer Html5 彈幕視訊播放器的實現HTML播放器
- 使用Dplayer實現Vue3中的視訊及彈幕播放Vue
- 用canvas實現一個vue彈幕元件CanvasVue元件
- HTML5本地視訊播放器設計(+彈幕功能)HTML播放器
- video自定義實現視訊播放功能IDE
- 使用 mask 實現視訊彈幕人物遮罩過濾遮罩
- web前端培訓分享:使用Dplayer實現Vue3中的視訊及彈幕播放Web前端Vue
- Go使用websocket實現彈幕功能GoWeb
- 螢石雲視訊EZOpenSDK整合(實現播放,視訊放大功能)
- 使用vue控制video視訊和彈幕功能VueIDE
- Android彈幕功能實現,模仿鬥魚直播的彈幕效果Android
- 視訊彈幕外掛
- 帶你用AVPlayer實現音訊和視訊播放音訊
- vue pc端實現 直播功能+彈幕Vue
- js實現視訊截圖,視訊批量截圖,canvas實現JSCanvas
- 基於swift4.0實現視訊播放、螢幕旋轉、倍速播放、手勢調節,鎖屏皮膚等功能Swift
- 使用danmuplayer.js外掛實現Java web網站視訊發彈幕JSJavaWeb網站
- 基於HTML5有彈幕功能的播放器HTML播放器
- ? 鬥魚彈幕php實現PHP
- 短視訊系統原始碼,直播間實現彈幕的自動傳送原始碼
- 如何實現視訊加密全平臺播放加密
- 「Premiere中文新手教程」視訊彈幕製作REM
- 前端實現彈幕效果的方法總結(包含css3和canvas的實現方式)前端CSSS3Canvas
- canvas畫素點操作 —— 視訊綠幕摳圖Canvas
- C# WPF 用MediaElement控制元件實現視訊迴圈播放C#控制元件
- UITableView 視訊自動播放功能總結UIView
- canvas拼圖功能實現Canvas
- canvas實現截圖功能Canvas
- Android中SurfaceView視訊播放實現程式碼AndroidView
- 35.FFmpeg+OpenGLES+OpenSLES播放器實現(九.OpenGLES播放視訊)播放器
- java 視訊播放 多人及時彈幕技術 程式碼生成器 websocket springmvc mybatis SSMJavaWebSpringMVCMyBatisSSM
- AudioContext+canvas實現音訊視覺化ContextCanvas音訊視覺化
- Flutter 實現虎牙/鬥魚 彈幕效果Flutter
- 自定義簡單彈幕實現
- Flutter 實現視訊全屏播放邏輯及解析Flutter
- ffmpeg播放器實現詳解 - 視訊顯示播放器