利用ontimeupdate记录video播放进度

软件版本:
php 7.1
mysql 8.0.2
Chrome

实现思路:
分两个触发点记录播放进度,一是利用video的 ontimeupdate属性每隔一分钟记录一次,而是关闭页面记录一次。当然如果视频播放只有一个端,完全可以做页面的localstorage缓存,没必要上送到服务端。如果有网页和、微信或者app几个播放端,想要不同端公用统一个播放进度,就有必要与服务端交互了。下面的代码是上送服务端的。

html代码

<html> 
<head> 
<meta charset="utf-8"> 
<meta http-equiv="x-ua-compatible" content="IE=edge" > 
<title>remark video process</title> 
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> 
<style> 
#player{height:400px;width:800px;} 
</style> 
</head>

<video src="" controls="controls" id="player" οntimeupdate="logtime(this)"> 
您的浏览器不支持 video 标签。 
</video>

<div id="logtime">播放时间:</div>

<script> 
var playtime = 0; 
var TimeSet = 0; 
setInterval(function(){ 
    /* console.log('crontab'); */ 
    playtime ++; 
}, 1000);

/* 
* 初次加载获取播放进度 
*/ 
$.post("http://localhost/aliyunlive/web/GetVideoProcess.php?video_id=2",{},function(result){ 
         var data = JSON.parse(result); 
         document.getElementById('player').src=data.video_link; 
         document.getElementById('player').currentTime=data.process; 
        console.log(result); 
      });

/* 
* 10秒记录一次进度 
*/ 
function logtime(obj){ 
    if(playtime > TimeSet+10){ 
        TimeSet = playtime; 
        var log_time = obj.currentTime; 
        console.log(log_time); 
        document.getElementById('logtime').innerHTML='播放时间:'+log_time; 
         
          $.post("http://localhost/aliyunlive/web/RemarkVideoProcess.php?process="+log_time+"&video_id=2",{},function(result){ 
            console.log(result); 
          }); 
    } 
}

/* 
* 关闭页面记录一次进度 
*/ 
window.οnbefοreunlοad=function(e){    
    var log_time = document.getElementById('player').currentTime; 
    $.post("http://localhost/aliyunlive/web/RemarkVideoProcess.php?process="+log_time+"&video_id=2",{},function(result){ 
              console.log(result); 
          }); 
} 
</script> 
</html>

 

GetVideoProcess.php:

<?php 
$mysqli = mysqli_init(); 
if (!$mysqli) { 
    die('mysqli_init failed'); 
}

if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) { 
    die('Setting MYSQLI_INIT_COMMAND failed'); 
}

if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) { 
    die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed'); 
}

if (!$mysqli->real_connect('127.0.0.1', 'root', '123456', 'VideoRemark', 3306, 'utf8mb4')) { 
    die('Connect Error (' . mysqli_connect_errno() . ') ' 
        . mysqli_connect_error()); 
}

$video_id = $_GET['video_id'];

$sql = 'select vi.*,(select pl.process from process_log as pl where pl.video_id=vi.id order by pl.id desc limit 1) as process from video_info as vi where vi.id='.$video_id; 
$info = $mysqli->query($sql)->fetch_array();

$mysqli->close();

echo json_encode($info);

 

RemarkVideoProcess.php

<?php 
$mysqli = mysqli_init(); 
if (!$mysqli) { 
    die('mysqli_init failed'); 
}

if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) { 
    die('Setting MYSQLI_INIT_COMMAND failed'); 
}

if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) { 
    die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed'); 
}

if (!$mysqli->real_connect('127.0.0.1', 'root', '123456', 'VideoRemark', 3306, 'utf8mb4')) { 
    die('Connect Error (' . mysqli_connect_errno() . ') ' 
        . mysqli_connect_error()); 
}

$process = $_GET['process']; 
$video_id = $_GET['video_id'];

$sql = 'select * from video_info where id='.$video_id; 
$info = $mysqli->query($sql)->fetch_row(); 
// var_dump($info);

$create = date('Y-m-d H:i:s');

$sql = "insert into process_log(`video_id`,`process`,`create_date`) value ('{$video_id}','{$process}','{$create}')"; 
echo $sql;

$result = $mysqli->query($sql); 
mysqli_commit($mysqli);

$mysqli->close();

 

mysql数据准备

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for process_log
-- ----------------------------
DROP TABLE IF EXISTS `process_log`;
CREATE TABLE `process_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `video_id` int(11) DEFAULT NULL COMMENT '视频id',
  `process` float(10,4) NOT NULL COMMENT '观看进度',
  `create_date` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ----------------------------
-- Table structure for video_info
-- ----------------------------
DROP TABLE IF EXISTS `video_info`;
CREATE TABLE `video_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `video_name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '视频名称',
  `video_link` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '视频连接',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

SET FOREIGN_KEY_CHECKS = 1;

INSERT INTO `VideoRemark`.`video_info`(`id`, `video_name`, `video_link`) VALUES (2, '介绍视频', 'http://localhost/aliyunlive/web/1581410556698554.mp4');

 

可以使用react-jinke-music-player提供的onTimeUpdate回调函数来获取播放进度。具体做法如下: 首先,在组件中定义一个state来存储当前播放时间,如下所示: ```javascript import React, { useState } from 'react'; import ReactJkMusicPlayer from 'react-jinke-music-player'; import 'react-jinke-music-player/assets/index.css'; function MusicPlayer() { const [currentTime, setCurrentTime] = useState(0); const handleTimeUpdate = (currentTime, duration) => { setCurrentTime(currentTime); }; return ( <ReactJkMusicPlayer audioLists={[ { name: 'Song Name', singer: 'Singer Name', musicSrc: 'http://music.163.com/song/media/outer/url?id=xxx.mp3', }, ]} onTimeUpdate={handleTimeUpdate} /> ); } export default MusicPlayer; ``` 在上面的代码中,我们定义了一个叫做currentTime的state来存储当前播放时间,然后在handleTimeUpdate回调函数中更新它。 接下来,在ReactJkMusicPlayer组件中添加onTimeUpdate回调函数,并将它绑定到handleTimeUpdate函数上。在handleTimeUpdate函数中,我们可以获取到当前播放时间,并更新state。 最后,在组件中使用currentTime state来显示当前播放时间,如下所示: ```javascript function MusicPlayer() { const [currentTime, setCurrentTime] = useState(0); const handleTimeUpdate = (currentTime, duration) => { setCurrentTime(currentTime); }; return ( <div> <ReactJkMusicPlayer audioLists={[ { name: 'Song Name', singer: 'Singer Name', musicSrc: 'http://music.163.com/song/media/outer/url?id=xxx.mp3', }, ]} onTimeUpdate={handleTimeUpdate} /> <p>Current Time: {currentTime}</p> </div> ); } ``` 在上面的代码中,我们在组件中添加了一个p标签,用来显示当前播放时间。注意,currentTime的单位是秒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值