fhvideo.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. var locat = (window.location+'').split('/');
  2. $(function(){if('tool'== locat[3]){locat = locat[0]+'//'+locat[2];}else{locat = locat[0]+'//'+locat[2]+'/'+locat[3];};});
  3. var videoObject = {
  4. container : '#video', //容器的ID或className
  5. variable : 'player', //播放函数名称
  6. loaded : 'loadedHandler', //当播放器加载后执行的函数
  7. loop : true, //播放结束是否循环播放
  8. autoplay : false, //是否自动播放
  9. //duration: 500, //设置视频总时间
  10. //cktrack: 'material/srt.srt', //字幕文件
  11. poster : 'plugins/fhplayer/material/poster.jpg', //封面图片
  12. preview : { //预览图片
  13. file : [ 'plugins/fhplayer/material/mydream_en1800_1010_01.png',
  14. 'plugins/fhplayer/material/mydream_en1800_1010_02.png' ],
  15. scale : 2
  16. },
  17. config : '', //指定配置函数
  18. debug : true, //是否开启调试模式
  19. //flashplayer: true, //强制使用flashplayer
  20. drag : 'start', //拖动的属性
  21. live : false, //是否是直播
  22. seek : 0, //默认跳转的时间
  23. playbackrate : 1, //默认速度的编号,只对html5有效,设置成-1则不显示倍速
  24. //front:'frontFun', //上一集的操作函数
  25. //next:'nextFun', //下一集的操作函数
  26. //广告部分开始
  27. adfront : 'http://www.ckplayer.com/yytf/swf/front001.swf,http://www.ckplayer.com/yytf/swf/front002.swf', //前置广告
  28. adfronttime : '15,15',
  29. adfrontlink : '',
  30. adpause : 'http://www.ckplayer.com/yytf/swf/pause001.swf,http://www.ckplayer.com/yytf/swf/pause002.swf',
  31. adpausetime : '5,5',
  32. adpauselink : '',
  33. adinsert : 'http://www.ckplayer.com/yytf/swf/insert001.swf,http://www.ckplayer.com/yytf/swf/insert002.swf',
  34. adinserttime : '10,10',
  35. adinsertlink : '',
  36. inserttime : '10,80',
  37. adend : 'http://www.ckplayer.com/yytf/swf/end001.swf,http://www.ckplayer.com/yytf/swf/end002.swf',
  38. adendtime : '15,15',
  39. adendlink : '',
  40. //广告部分结束
  41. promptSpot : [ //提示点
  42. {
  43. words : '提示点文字01',
  44. time : 30
  45. }, {
  46. words : '提示点文字02',
  47. time : 150
  48. } ],
  49. //mobileCkControls:true,//是否在移动端(包括ios)环境中显示控制栏
  50. video : [
  51. [
  52. 'http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4',
  53. 'video/mp4', '中文标清', 0 ],
  54. [
  55. 'http://img.ksbbs.com/asset/Mon_1703/d0897b4e9ddd9a5.mp4',
  56. 'video/mp4', '中文高清', 0 ],
  57. [
  58. ''+mp4video,
  59. 'video/mp4', '英文高清', 10 ],
  60. [
  61. 'http://img.ksbbs.com/asset/Mon_1703/d30e02a5626c066.mp4',
  62. 'video/mp4', '英文超清', 0 ] ]
  63. //视频地址
  64. };
  65. var player = new ckplayer(videoObject);
  66. //console.log(encodeURIComponent('http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4'));
  67. //console.log(decodeURIComponent(encodeURIComponent('http://img.ksbbs.com/asset/Mon_1703/05cacb4e02f9d9e.mp4')));
  68. function loadedHandler() {
  69. player.addListener('error', errorHandler); //监听视频加载出错
  70. player.addListener('loadedmetadata', loadedMetaDataHandler); //监听元数据
  71. player.addListener('duration', durationHandler); //监听播放时间
  72. player.addListener('time', timeHandler); //监听播放时间
  73. player.removeListener('error', errorHandler); //监听视频加载出错
  74. player.addListener('play', playHandler); //监听暂停播放
  75. player.addListener('pause', pauseHandler); //监听暂停播放
  76. player.addListener('buffer', bufferHandler); //监听缓冲状态
  77. player.addListener('seek', seekHandler); //监听跳转播放完成
  78. player.addListener('seekTime', seekTimeHandler); //监听跳转播放完成
  79. player.addListener('volume', volumeChangeHandler); //监听音量改变
  80. player.addListener('full', fullHandler); //监听全屏/非全屏切换
  81. player.addListener('ended', endedHandler); //监听播放结束
  82. player.addListener('screenshot', screenshotHandler); //监听截图功能
  83. player.addListener('mouse', mouseHandler); //监听鼠标坐标
  84. player.addListener('frontAd', frontAdHandler); //监听前置广告的动作
  85. player.addListener('wheel', wheelHandler); //监听视频放大缩小
  86. }
  87. function errorHandler() {
  88. changeText('.playerstate', '状态:视频加载错误,停止执行其它动作,等待其它操作');
  89. }
  90. function loadedMetaDataHandler() {
  91. var metaData = player.getMetaDate();
  92. //console.log(metaData)
  93. var html = ''
  94. //console.log(metaData);
  95. if (parseInt(metaData['videoWidth']) > 0) {
  96. changeText('.playerstate', '状态:获取到元数据信息,如果数据错误,可以使用延迟获取');
  97. html += '总时间:' + metaData['duration'] + '秒,';
  98. html += '音量:' + metaData['volume'] + '(范围0-1),';
  99. html += '播放器的宽度:' + metaData['width'] + 'px,';
  100. html += '播放器的高度:' + metaData['height'] + 'px,';
  101. html += '视频宽度:' + metaData['videoWidth'] + 'px,';
  102. html += '视频高度:' + metaData['videoHeight'] + 'px,';
  103. html += '视频原始宽度:' + metaData['streamWidth'] + 'px,';
  104. html += '视频原始高度:' + metaData['streamHeight'] + 'px,';
  105. html += '是否暂停状态:' + metaData['paused'];
  106. } else {
  107. changeText('.playerstate', '状态:未正确获取到元数据信息');
  108. html = '没有获取到元数据';
  109. }
  110. changeText('.metadata', html);
  111. }
  112. function playHandler() {
  113. //player.animateResume();//继续播放所有弹幕
  114. changeText('.playstate', '播放状态:' + ' 播放');
  115. window.setTimeout(function() {
  116. loadedMetaDataHandler();
  117. }, 1000);
  118. loadedMetaDataHandler();
  119. }
  120. function pauseHandler() {
  121. //player.animatePause();//暂停所有弹幕
  122. //alert(getHtml('.playstate'));
  123. changeText('.playstate', '播放状态:' + ' 暂停');
  124. loadedMetaDataHandler();
  125. }
  126. function timeHandler(time) {
  127. changeText('.currenttimestate', '当前播放时间(秒):' + time);
  128. }
  129. function durationHandler(duration) {
  130. changeText('.duration', '总时间(秒):' + duration);
  131. }
  132. function seekHandler(state) {
  133. changeText('.seekstate', getHtml('.seekstate') + ' ' + state);
  134. //changeText('.seekstate', '跳转状态:' + ' ' + state);
  135. }
  136. function seekTimeHandler(time) {
  137. //changeText('.seekstate', getHtml('.seekstate') + ' seekTime:'+ time);
  138. changeText('.seekstate', '跳转状态: seekTime:'+ time);
  139. }
  140. function bufferHandler(buffer) {
  141. //console.log(buffer);
  142. changeText('.bufferstate', '缓冲:' + buffer);
  143. }
  144. function volumeChangeHandler(vol) {
  145. if(typeof(vol)=="undefined"){
  146. vol = "0";
  147. }
  148. changeText('.volumechangestate', '当前音量:' + vol);
  149. }
  150. function screenshotHandler(obj) {
  151. changeText('.screenshot', '图片名称:' + obj['name'] + ',截图对象:'
  152. + obj['object'] + ',是否用户保存:' + obj['save']+',位置:图片存储在 tomcat,项目 uploadFiles/uploadImgs 目录下'
  153. + ',图片:<img width="600" src="' + obj['base64'] + '">');
  154. creatImage(obj['base64']);//把base64编码传入后台并生成图片
  155. }
  156. function fullHandler(b) {
  157. if (b) {
  158. html = ' 全屏';
  159. } else {
  160. html = ' 否';
  161. }
  162. changeText('.fullstate', getHtml('.fullstate') + html);
  163. }
  164. function endedHandler() {
  165. changeText('.endedstate', '播放结束');
  166. }
  167. function mouseHandler(obj) {
  168. changeText('.mouse', '鼠标位置,x:' + obj['x'] + ',y:' + obj['y']);
  169. }
  170. function frontAdHandler(status) {
  171. changeText('.frontad', getHtml('.frontad') + ' ' + status);
  172. }
  173. var zoomNow = 1;
  174. function wheelHandler(n) {
  175. if (n > 0) {
  176. if (zoomNow < 5) {
  177. zoomNow += 0.1;
  178. }
  179. } else {
  180. if (zoomNow > 0) {
  181. zoomNow -= 0.1;
  182. }
  183. }
  184. player.videoZoom(zoomNow);
  185. }
  186. var videoChangeNum = 0;
  187. function seekTime() {
  188. var time = parseInt(player.getByElement('.seektime').value);
  189. var metaData = player.getMetaDate();
  190. var duration = metaData['duration'];
  191. if (time < 0) {
  192. alert('请填写大于0的数字');
  193. return;
  194. }
  195. if (time > duration) {
  196. alert('请填写小于' + duration + '的数字');
  197. return;
  198. }
  199. player.videoSeek(time);
  200. }
  201. function changeVolume() {
  202. var volume = player.getByElement('.changevolume').value;
  203. volume = Math.floor(volume * 100) / 100;
  204. if (volume < 0) {
  205. alert('请填写大于0的数字');
  206. return;
  207. }
  208. if (volume > 1) {
  209. alert('请填写小于1的数字');
  210. return;
  211. }
  212. player.changeVolume(volume);
  213. }
  214. function changeSize() {
  215. player.changeSize(w, h);
  216. }
  217. function frontFun() {
  218. alert('点击了前一集');
  219. }
  220. function nextFun() {
  221. alert('点击了下一集');
  222. }
  223. function adjump() {
  224. alert('点击了跳过广告按钮');
  225. }
  226. function newVideo(value) {
  227. //var videoUrl = player.getByElement('.videour2').value;
  228. changeVideo(value);
  229. }
  230. function changeVideo(videoUrl) {
  231. if (player == null) {
  232. return;
  233. }
  234. var newVideoObject = {
  235. container : '#video', //容器的ID
  236. variable : 'player',
  237. autoplay : true, //是否自动播放
  238. loaded : 'loadedHandler', //当播放器加载后执行的函数
  239. video : videoUrl
  240. }
  241. //判断是需要重新加载播放器还是直接换新地址
  242. if (player.playerType == 'html5video') {
  243. if (player.getFileExt(videoUrl) == '.flv'
  244. || player.getFileExt(videoUrl) == '.m3u8'
  245. || player.getFileExt(videoUrl) == '.f4v'
  246. || videoUrl.substr(0, 4) == 'rtmp') {
  247. player.removeChild();
  248. player = null;
  249. player = new ckplayer();
  250. player.embed(newVideoObject);
  251. } else {
  252. player.newVideo(newVideoObject);
  253. }
  254. } else {
  255. if (player.getFileExt(videoUrl) == '.mp4'
  256. || player.getFileExt(videoUrl) == '.webm'
  257. || player.getFileExt(videoUrl) == '.ogg') {
  258. player = null;
  259. player = new ckplayer();
  260. player.embed(newVideoObject);
  261. } else {
  262. player.newVideo(newVideoObject);
  263. }
  264. }
  265. }
  266. var elementTemp = null; //保存元件
  267. function newElement() {
  268. if (elementTemp != null) {
  269. alert('为了演示的简单性,本实例只能建立一个元件');
  270. return;
  271. }
  272. var attribute = {
  273. list : [ //list=定义元素列表
  274. {
  275. type : 'png', //定义元素类型:只有二种类型,image=使用图片,text=文本
  276. file : 'plugins/fhplayer/material/logo.png', //图片地址
  277. radius : 30, //图片圆角弧度
  278. width : 30, //定义图片宽,必需要定义
  279. height : 30, //定义图片高,必需要定义
  280. alpha : 0.9, //图片透明度(0-1)
  281. marginLeft : 10, //图片离左边的距离
  282. marginRight : 10, //图片离右边的距离
  283. marginTop : 10, //图片离上边的距离
  284. marginBottom : 10, //图片离下边的距离
  285. clickEvent : "link->"+locat
  286. },
  287. {
  288. type : 'text', //说明是文本
  289. text : '演示弹幕内容,弹幕只支持普通文本,不支持HTML', //文本内容
  290. color : '0xFFDD00', //文本颜色
  291. size : 14, //文本字体大小,单位:px
  292. font : '"Microsoft YaHei", YaHei, "微软雅黑", SimHei,"\5FAE\8F6F\96C5\9ED1", "黑体",Arial', //文本字体
  293. leading : 30, //文字行距
  294. alpha : 1, //文本透明度(0-1)
  295. paddingLeft : 10, //文本内左边距离
  296. paddingRight : 10, //文本内右边距离
  297. paddingTop : 0, //文本内上边的距离
  298. paddingBottom : 0, //文本内下边的距离
  299. marginLeft : 0, //文本离左边的距离
  300. marginRight : 10, //文本离右边的距离
  301. marginTop : 10, //文本离上边的距离
  302. marginBottom : 0, //文本离下边的距离
  303. backgroundColor : '0xFF0000', //文本的背景颜色
  304. backAlpha : 0.5, //文本的背景透明度(0-1)
  305. backRadius : 30, //文本的背景圆角弧度
  306. clickEvent : "actionScript->videoPlay"
  307. } ],
  308. x : 10, //元件x轴坐标,注意,如果定义了position就没有必要定义x,y的值了,x,y支持数字和百分比,使用百分比时请使用单引号,比如'50%'
  309. y : 50, //元件y轴坐标
  310. //position:[1,1],//位置[x轴对齐方式(0=左,1=中,2=右),y轴对齐方式(0=上,1=中,2=下),x轴偏移量(不填写或null则自动判断,第一个值为0=紧贴左边,1=中间对齐,2=贴合右边),y轴偏移量(不填写或null则自动判断,0=紧贴上方,1=中间对齐,2=紧贴下方)]
  311. alpha : 1, //元件的透明度
  312. backgroundColor : '0xFFDD00', //元件的背景色
  313. backAlpha : 0.5, //元件的背景透明度(0-1)
  314. backRadius : 60, //元件的背景圆角弧度
  315. clickEvent : "actionScript->videoPlay"
  316. }
  317. elementTemp = player.addElement(attribute);
  318. }
  319. function deleteElement() {
  320. if (elementTemp != null) {
  321. player.deleteElement(elementTemp);
  322. elementTemp = null;
  323. } else {
  324. alert('演示删除元件需要先添加');
  325. }
  326. }
  327. //区间随机数
  328. function rnd(n, m){
  329. var random = Math.floor(Math.random()*(m-n+1)+n);
  330. return random;
  331. }
  332. function newDanmu(userPhoto,message) {
  333. var color = new Array(["AFD8F8"],["F6BD0F"],["8BBA00"],["FF8E46"],["008E8E"],["D64646"],["8E468E"],["588526"],["B3AA00"],["008ED6"],["9D080D"],["A186BE"]);
  334. //弹幕说明
  335. var danmuObj = {
  336. list : [
  337. {
  338. type : 'image', //定义元素类型:只有二种类型,image=使用图片,text=文本
  339. file : 'plugins/fhplayer/material/pao'+rnd(1, 3)+'.gif',//图片地址
  340. radius : 30, //图片圆角弧度
  341. width : 50, //定义图片宽,必需要定义
  342. height : 30, //定义图片高,必需要定义
  343. alpha : 0.9, //图片透明度(0-1)
  344. marginLeft : 10, //图片离左边的距离
  345. marginRight : 1, //图片离右边的距离
  346. marginTop : 10, //图片离上边的距离
  347. marginBottom : 10, //图片离下边的距离
  348. clickEvent : "link->"
  349. //clickEvent : "link->"+locat+"/main/index" //可以加链接
  350. },
  351. {
  352. type : 'image', //定义元素类型:只有二种类型,image=使用图片,text=文本
  353. file : ''+userPhoto,//图片地址
  354. radius : 30, //图片圆角弧度
  355. width : 30, //定义图片宽,必需要定义
  356. height : 30, //定义图片高,必需要定义
  357. alpha : 0.9, //图片透明度(0-1)
  358. marginLeft : 1, //图片离左边的距离
  359. marginRight : 10, //图片离右边的距离
  360. marginTop : 10, //图片离上边的距离
  361. marginBottom : 10, //图片离下边的距离
  362. clickEvent : "link->"
  363. //clickEvent : "link->"+locat+"/main/index" //可以加链接
  364. },
  365. {
  366. type : 'text', //说明是文本
  367. text : ''+message, //文本内容
  368. color : '0xFFDD00', //文本颜色
  369. size : 14, //文本字体大小,单位:px
  370. font : '"Microsoft YaHei", YaHei, "微软雅黑", SimHei,"\5FAE\8F6F\96C5\9ED1", "黑体",Arial', //文本字体
  371. leading : 30, //文字行距
  372. alpha : 1, //文本透明度(0-1)
  373. paddingLeft : 10, //文本内左边距离
  374. paddingRight : 10, //文本内右边距离
  375. paddingTop : 0, //文本内上边的距离
  376. paddingBottom : 0, //文本内下边的距离
  377. marginLeft : 0, //文本离左边的距离
  378. marginRight : 10, //文本离右边的距离
  379. marginTop : 10, //文本离上边的距离
  380. marginBottom : 0, //文本离下边的距离
  381. //backgroundColor : '0xFF0000', //文本的背景颜色
  382. backgroundColor : '0x'+color[rnd(0, 11)], //文本的背景颜色
  383. backAlpha : 0.5, //文本的背景透明度(0-1)
  384. backRadius : 30, //文本的背景圆角弧度
  385. clickEvent : "actionScript->videoPlay"
  386. } ],
  387. x : '100%', //x轴坐标
  388. y : rnd(1, 82)+"%", //y轴坐标
  389. //position:[2,1,0],//位置[x轴对齐方式(0=左,1=中,2=右),y轴对齐方式(0=上,1=中,2=下),x轴偏移量(不填写或null则自动判断,第一个值为0=紧贴左边,1=中间对齐,2=贴合右边),y轴偏移量(不填写或null则自动判断,0=紧贴上方,1=中间对齐,2=紧贴下方)]
  390. alpha : 1,
  391. //backgroundColor:'#FFFFFF',
  392. backAlpha : 0.8,
  393. backRadius : 30
  394. //背景圆角弧度
  395. }
  396. var danmu = player.addElement(danmuObj);
  397. var danmuS = player.getElement(danmu);
  398. var obj = {
  399. element : danmu,
  400. parameter : 'x',
  401. static : true, //是否禁止其它属性,true=是,即当x(y)(alpha)变化时,y(x)(x,y)在播放器尺寸变化时不允许变化
  402. effect : 'None.easeOut',
  403. start : null,
  404. end : -danmuS['width'],
  405. speed : 10,
  406. overStop : true,
  407. pauseStop : true,
  408. callBack : 'deleteChild'
  409. };
  410. var danmuAnimate = player.animate(obj);
  411. }
  412. function deleteChild(ele) {
  413. if (player) {
  414. player.deleteElement(ele);
  415. }
  416. }
  417. function changeText(div, text) {
  418. player.getByElement(div).innerHTML = text;
  419. }
  420. function getHtml(div) {
  421. return player.getByElement(div).innerHTML;
  422. }
  423. var zoom = 1;
  424. //把视频截图生成的Base64编码传到后台并生成图片
  425. function creatImage(base64){
  426. $.ajax({
  427. type: "POST",
  428. url: locat+'/tool/creatImage.do',
  429. data: {base64:base64,tm:new Date().getTime()},
  430. dataType:'json',
  431. cache: false,
  432. success: function(data){
  433. }
  434. });
  435. }
  436. /*=================================弹幕即时通讯===========================*/
  437. var isopen="yes";
  438. var websocket;
  439. function online(){
  440. if (window.WebSocket) {
  441. websocket = new WebSocket(encodeURI('ws://'+videoAdress));
  442. websocket.onopen = function() {
  443. websocket.send('[video ]'+USERNAME);//连接成功,加入
  444. };
  445. //消息接收
  446. websocket.onmessage = function(message) {
  447. if("yes" == isopen){
  448. var getMessage = message.data.split(',fh,');
  449. newDanmu(getMessage[0],getMessage[1]);
  450. }
  451. };
  452. }
  453. }
  454. //发送弹幕
  455. function sendDanmu(){
  456. if($("#danmu").val()==""){
  457. $("#danmu").tips({
  458. side:1,
  459. msg:'还没有输入内容',
  460. bg:'#AE81FF',
  461. time:2
  462. });
  463. $("#danmu").focus();
  464. return false;
  465. }
  466. websocket.send(userPhoto+",fh,"+$("#danmu").val());
  467. $("#danmu").val("");
  468. $("#danmu").focus();
  469. }
  470. //弹幕开关
  471. function ocDanmu(){
  472. if("yes" == isopen){
  473. isopen="no";
  474. }else{
  475. isopen="yes";
  476. }
  477. }