Java实现视频网站的视频上传及视频播放功能
java视频播放器源代码

import java.awt.*;import java.io.*;import java.util.*;import javax.media.*;import javax.media.format.*;import javax.swing.*;public class VideoPlayer implements ControllerListener {Vector audioCapDevList = null;Vector videoCapDevList = null;CaptureDeviceInfo audioCapDevInfo = null;CaptureDeviceInfo videoCapDevInfo = null;MediaLocator audioCapDevLoc = null;MediaLocator videoCapDevLoc = null;Player audioPlayer;Player videoPlayer;public void initAudioCapDevLoc() {//这里可以填写其它的音频编码格式,具体请看AudioFormat类audioCapDevList = CaptureDeviceManager.getDeviceList(new AudioFormat(AudioFormat.LINEAR));if ((audioCapDevList.size() > 0)) {//或许有几个CaptureDevice,这里取第一个audioCapDevInfo = (CaptureDeviceInfo) audioCapDevList.elementAt(0);audioCapDevLoc = audioCapDevInfo.getLocator();} else {System.out.println("找不到音频采集设备");System.exit(0);}}public void initVideoCapDevLoc() {//这里可以填写其它的编码视频格式,具体请看VideoFormat类videoCapDevList = CaptureDeviceManager.getDeviceList(new VideoFormat(VideoFormat.YUV));if ((videoCapDevList.size() > 0)) {//或许有几个CaptureDevice,这里取第一个videoCapDevInfo = (CaptureDeviceInfo)videoCapDevList.elementAt(0);videoCapDevLoc = videoCapDevInfo.getLocator();} else {System.out.println("找不到视频采集设备");System.exit(0);}}public void initAudioPlayer() {try {audioPlayer = Manager.createPlayer(audioCapDevLoc);} catch (NoPlayerException ex) {} catch (IOException ex) {}//增加一个侦听器,侦听player状态的改变audioPlayer.addControllerListener(this);audioPlayer.realize();}public void initVideoPlayer() {try {videoPlayer = Manager.createPlayer(videoCapDevLoc);} catch (NoPlayerException ex) {} catch (IOException ex) {}//增加一个侦听器,侦听player状态的改变videoPlayer.addControllerListener(this);videoPlayer.realize();}public void stopAndClosePlayer(){audioPlayer.stop();audioPlayer.close();videoPlayer.stop();videoPlayer.close();}public synchronized void controllerUpdate(ControllerEvent ce) { Player p = (Player) ce.getSourceController();JFrame jFrame = new JFrame();Component com;if (p == null) {return;}//如果player的状态变为Realizedif (ce instanceof RealizeCompleteEvent) {if ((com = p.getControlPanelComponent()) != null) {jFrame.add(com, BorderLayout.SOUTH);}if ((com = p.getVisualComponent()) != null) {jFrame.add(com, BorderLayout.NORTH);}jFrame.setVisible(true);jFrame.pack();jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p.start();}}public static void main(String args[]) {V ideoPlayer cap = new VideoPlayer();cap.initAudioCapDevLoc();cap.initVideoCapDevLoc();cap.initAudioPlayer();cap.initVideoPlayer();try {Thread.currentThread().sleep(20000);//20秒后停止并关闭播放器 } catch (InterruptedException ex) {}cap.stopAndClosePlayer();}}。
Java实现视频网站的视频上传及视频播放功能

视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash 制作的播放器来播放该文件.项目中用制作的播放器.多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
??ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
1.能支持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能支持的格式对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg 能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg支持,所以我们实例中需要ffmpeg视频处理工具.数据库实例所需要的数据库脚本drop database if exists db_mediaplayer;create database db_mediaplayer;use db_mediaplayer; create table tb_media(id int not null primary key auto_increment comment '主键' ,title varchar(50) not null comment '视频名称' ,src varchar(200) not null comment '视频存放地址' ,picture varchar(200) not null comment '视频截图' ,descript varchar(400) comment '视频描述' ,uptime varchar(40) comment '上传时间');desc tb_media;项目结构图:上传视频界面设计在上传文件时,Form表单中?enctype属性值必须为"multipart/form-data".模块界面设计如下图:enctype属性值说明application/x-www-form-urlencoded表单数据被编码为名称/值对,这是标准的编码格式multipart/form-data表单数据被编码为一条消息,页面上每个控件对应消息中的一部分text/plain表单数据以纯文本形式进行编码,其中不含任何控件格式的字符业务接口定义面向接口编程,接口中定义系统功能模块.这样方便理清业务,同时接口的对象必须由实现了该接口的对象来创建.这样就避免编码中的某些业务遗漏等,同时扩展性也增强了.packageimportimport/****** @version:** @author** @since:创建时间: 2013-2-07 上午10:19:54** TODO : interface is used for ...**/public interface MediaDao {/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath,String upFilePath, String codcFilePath, String mediaPicPath)throws Exception;/*** 保存文件* @param media* @return* @throws Exception*/public boolean saveMedia(Media media)throws Exception;/*** 查询本地库中所有记录的数目* @return* @throws Exception*/public int getAllMediaCount()throws Exception;/*** 带分页的查询* @param firstResult* @param maxResult* @return*/public List<Media> queryALlMedia(int firstResult, int maxResult)throws Exception;/*** 根据Id查询视频* @param id* @return* @throws Exception*/public Media queryMediaById(int id)throws Exception;}接口的实现,这里列出ffmpeg视频转码与截图模块/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath, String upFilePath, String codcFilePath,String mediaPicPath) throws Exception {因为如果对象new太多,会不必要的浪费资源.所以工厂,采用单例模式,私有构造,提供对外可访问的方法即可.packageimport/****** @version:** @author** @since:创建时间: 2013-2-07 下午02:18:51** TODO : class is used for ...**/public class DaoFactory { ervlet控制器相关代码如下packageimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimport/****** @version:** @author** @since:创建时间: 2013-2-08 下午02:24:47** TODO : class is used for ...**/public class MediaService extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = ();MediaDao mediaDao = ();String message = "";String uri = ();String path = ("/"), ("."));if("/uploadFile".equals(path)){etBytes("ISO8859-1"),"UTF-8"));}if("descript")){(new String().getBytes("ISO8859-1"),"UTF-8"));}}else{); lv"; pg"; etRealPath("/tools/"); ("videos/" + serialName + ".flv");("videos/images/" +serialName + ".jpg");());orward(request,response);} catch (Exception e) {();throw new ServletException(e);}}if("/queryAll".equals(path)){List<Media> mediaList;try {mediaList = (0,5);("mediaList", mediaList);("").forward(request, response);} catch (Exception e) {();}}if("/play".equals(path)){String idstr = ("id");int mediaId = -1;Media media = null;if(null!=idstr){mediaId = (idstr);}try {media = (mediaId);} catch (Exception e) {();}("media", media);("").forward(request, response);}}}可以通过分页查找,显示最新top5,展示到首页.相应特效可以使用JS实现.相关代码如下:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import<%@ page import=".*"%><%String path = ();String basePath = ()+":idth(); ength; ppend(btn);$("#focus .btnBg").css("opacity",;tn span").css("opacity",.mouseenter(function() {index = $("#focus .btn span").index(this);showPics(index);}).eq(0).trigger("mouseenter");reNext").css("opacity",.hover(function() {$(this).stop(true,false).animate({"opacity":""},300); },function() {$(this).stop(true,false).animate({"opacity":""},300); });re").click(function() {index -= 1;if(index == -1) {index = len - 1;}showPics(index);});ext").click(function() {index += 1;if(index == len) {index = 0;}showPics(index);});ss("width",sWidth * (len));over(function() {clearInterval(picTimer);},function() {picTimer = setInterval(function() {showPics(index);index++;if(index == len) {index = 0;}},4000); rigger("mouseleave");top(true,false).animate({"left":nowLeft},300); tnspan").removeClass("on").eq(index).addClass("on"); tnspan").stop(true,false).animate({"opacity":""},300).eq(index).stop(true,false).animate( {"opacity":"1"},300); 片为视频转码过程中拉取到的图片.点击图片即可发送播放视频请求,视频播放页面效果如下图所示.视频播放页面需要在页面中嵌入Flash播放器代码如下:<!-- 嵌入Flash播放器 --><td align="center" width="455"><param name="movie"value="<%=basePath%>tools/=<%=basePath%><%=()%>" /><embedsrc="<%=basePath%>tools/=<%=basePath%><%=()%>"width="98%" height="90%"></embed></object></td>相关说明:<param>元素,value属性指定被加载的视频文件.实例中用的是flash制作的视频播放器.在value属性值中向播放器传递了一个file参数.该参数指定了要播放的视频的路径.<embed>元素,src属性也是用来加载影片,与<param>标记的value属性值具体相同的功能.转载请注明出处:[]。
Java与视频处理利用Java实现视频编辑和处理

Java与视频处理利用Java实现视频编辑和处理Java与视频处理——利用Java实现视频编辑和处理在当今数字化时代,视频成为了人们主要的媒介之一。
然而,为了获得更好的观看体验,常常需要对视频进行编辑和处理。
而Java作为一种高性能且通用的编程语言,为我们提供了实现视频编辑和处理的强大工具和框架。
本文将介绍如何利用Java来实现视频编辑和处理。
一、视频处理的基础知识在开始利用Java进行视频处理之前,我们需要了解一些视频处理的基础知识。
视频文件通常由一系列图像帧组成,通过以固定的时间间隔播放这些图像帧来实现动画效果。
视频处理包括但不限于视频剪辑、视频合并、视频转码、视频特效等。
二、Java处理视频的工具和框架1. JavaCVJavaCV是一个基于OpenCV和FFmpeg的Java开源项目,提供了一系列Java接口和类,用于在Java中处理视频和图像。
它可以实现视频剪辑、视频合并、视频转码等多种视频处理功能。
通过JavaCV,我们可以方便地调用底层的OpenCV和FFmpeg功能,实现对视频的各种操作。
2. XugglerXuggler是一个Java开源项目,用于在Java中处理音频和视频。
它提供了一套强大而易于使用的API,可以实现对视频的解码、编码、剪辑、合并等操作。
Xuggler使用了FFmpeg和X264等开源库,并通过Java接口封装了这些库的功能,使得我们可以直接在Java中调用它们。
3. JCodecJCodec是一个纯Java的视频编解码库,提供了一套功能强大且易于使用的API,用于在Java中进行视频编解码、剪辑、转码等操作。
JCodec支持各种常见的视频编解码格式,如H.264、MPEG-4等,并提供了高效的编解码算法和丰富的视频处理功能。
三、利用Java进行视频编辑和处理的实例下面将以视频剪辑和视频转码为例,介绍如何利用Java实现视频编辑和处理。
1. 视频剪辑视频剪辑是将一个视频文件按照指定的时间段进行截取,生成一个新的视频文件。
基于Java的在线影音播放器开发及优化

基于Java的在线影音播放器开发及优化一、引言随着互联网的普及和网络带宽的提升,在线影音播放器已经成为人们日常娱乐生活中不可或缺的一部分。
基于Java语言的在线影音播放器具有跨平台性、易维护性和良好的扩展性等优点,因此备受开发者青睐。
本文将探讨基于Java的在线影音播放器的开发过程以及优化方法,帮助开发者更好地实现高性能、稳定可靠的在线影音播放器。
二、开发环境搭建在进行基于Java的在线影音播放器开发之前,首先需要搭建相应的开发环境。
通常情况下,我们可以选择使用JavaFX作为界面开发框架,结合FFmpeg等多媒体处理库来实现音视频播放功能。
同时,还需要考虑到网络通信模块的集成,以实现在线流媒体播放功能。
三、功能设计与实现1. 音视频格式支持在开发在线影音播放器时,需要考虑支持常见的音视频格式,如MP4、AVI、MKV等。
通过集成FFmpeg等多媒体处理库,可以实现对不同格式的音视频文件进行解码和播放。
2. 播放控制功能在线影音播放器通常具备播放、暂停、快进、快退、音量调节等基本控制功能。
通过JavaFX提供的界面组件和事件处理机制,可以轻松实现这些功能,并提供良好的用户体验。
3. 网络流媒体支持为了实现在线直播和点播功能,需要集成网络通信模块,支持HTTP、RTMP等流媒体协议。
通过网络请求和数据解析,可以实现从网络获取音视频数据并进行实时播放。
四、性能优化策略1. 资源管理优化在播放大规模音视频文件时,需要合理管理内存和线程资源,避免内存泄漏和资源浪费。
可以通过使用线程池管理线程、定时清理无用资源等方式来优化资源管理。
2. 缓冲策略优化为了提高在线影音播放器的流畅度和加载速度,可以采用预加载、分段缓冲等策略来优化缓冲机制。
通过合理设置缓冲区大小和加载策略,可以有效减少卡顿和加载时间。
3. 码率自适应优化针对不同网络环境和设备性能,可以实现码率自适应功能,根据当前网络带宽和设备性能动态调整音视频码率。
用Java及开源技术构建视频在线分享平台

参考 文献 :
【】Coi o k E st lAcin cit2OM】 e a tp l R i 1 l Mo c sei t S r .【 .S b so o:O’el n a o p l y
M e i, .00 daI 2 4. nc
驱动机 制的动画机 理不难理 解 ,但要 掌握好其 技术 的三 个环 节 。除了测试好定 时循环 的时间间隔 , 考虑适 当方式 清除定时 循环事件 , 处理 好动 画的平滑 问题 外 , 设计好 回调函数或 回调
一
传者和视频观看者之 间能进行 方便地沟通与交流 , 包括 对视频 的评论 留言 、 观众 评分 、 视频 收藏夹 、 播放列 表功能 、 友系统 好 等; 对每个视频提供 自动的浏览 数 、 播放数 、 评分数 、 受欢迎度 、 链 接数 的统 计和跟踪 , 并按 照热度 等指标进行 排名 ; 提供针 对 “ 标签 ( a )的视频分类和搜索功能 (标签 ” We 2 Tg ” “ 是 b. 0时代 网
h 6 、ixx i )为 用户提供可嵌入到网页支持 流式视频播 24 dv 、vd等 。 放的用 Fah编 写的播放器 , 用户只需要一个带 Fah插必须提供视 频转换 功能 ; 另外 , 务器 需要具 备多 服
语 言功能 、为平衡负载提高系统吞吐能力 的视频镜像 功能 , 还
程序是技术 的关键 。 文归纳 了设计回调 函数或 回调程序所关 本
【 】S nig s ea z .eltra[/ 】 t :/ w. ce u 2 a t o E p rna S t ev l OL . t / ww u a n J hp mb . / d
视频在线分享平 台的特征和功能 , 决定 了其 系统 结构的复
Java实现视频网站的视频上传及视频播放功能

Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash 制作的播放器来播放该文件.项目中用制作的player.swf播放器.多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
1.能支持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能支持的格式对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg 能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg支持,所以我们实例中需要ffmpeg视频处理工具.数据库MySQL5.5实例所需要的数据库脚本drop database if exists db_mediaplayer;create database db_mediaplayer;use db_mediaplayer; create table tb_media(id int not null primary key auto_increment comment '主键' ,title varchar(50) not null comment '视频名称' ,src varchar(200) not null comment '视频存放地址' ,picture varchar(200) not null comment '视频截图' ,descript varchar(400) comment '视频描述' ,uptime varchar(40) comment '上传时间');desc tb_media;项目结构图:上传视频界面设计在上传文件时,Form表单中enctype属性值必须为"multipart/form-data".模块界面设计如下图:enctype属性值说明application/x-www-form-urlencoded表单数据被编码为名称/值对,这是标准的编码格式multipart/form-data表单数据被编码为一条消息,页面上每个控件对应消息中的一部分text/plain表单数据以纯文本形式进行编码,其中不含任何控件格式的字符业务接口定义面向接口编程,接口中定义系统功能模块.这样方便理清业务,同时接口的对象必须由实现了该接口的对象来创建.这样就避免编码中的某些业务遗漏等,同时扩展性也增强了.package com.webapp.dao;import java.util.List;import com.webapp.entity.Media;/**** MediaDao.java** @version: 1.1** @author:苏若年<ahref="mailto:****************">发送邮件</a>** @since: 1.0 创建时间: 2013-2-07 上午10:19:54** TODO : interface MediaDao.java is used for ...**/public interface MediaDao {/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath,String upFilePath, String codcFilePath, String mediaPicPath)throws Exception;/*** 保存文件* @param media* @return* @throws Exception*/public boolean saveMedia(Media media)throws Exception;/*** 查询本地库中所有记录的数目* @return* @throws Exception*/public int getAllMediaCount()throws Exception;/*** 带分页的查询* @param firstResult* @param maxResult* @return*/public List<Media> queryALlMedia(int firstResult, int maxResult)throws Exception;/*** 根据Id查询视频* @param id* @return* @throws Exception*/public Media queryMediaById(int id)throws Exception;}接口的实现,这里列出ffmpeg视频转码与截图模块/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath, String upFilePath, String codcFilePath,String mediaPicPath) throws Exception {// 创建一个List集合来保存转换视频文件为flv格式的命令List<String> convert = new ArrayList<String>();convert.add(ffmpegPath); // 添加转换工具路径convert.add("-i"); // 添加参数"-i",该参数指定要转换的文件convert.add(upFilePath); // 添加要转换格式的视频文件的路径convert.add("-qscale"); //指定转换的质量convert.add("6");convert.add("-ab"); //设置音频码率convert.add("64");convert.add("-ac"); //设置声道数convert.add("2");convert.add("-ar"); //设置声音的采样频率convert.add("22050");convert.add("-r"); //设置帧频convert.add("24");convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的文件convert.add(codcFilePath);// 创建一个List集合来保存从视频中截取图片的命令List<String> cutpic = new ArrayList<String>();cutpic.add(ffmpegPath);cutpic.add("-i");cutpic.add(upFilePath); // 同上(指定的文件即可以是转换为flv格式之前的文件,也可以是转换的flv文件)cutpic.add("-y");cutpic.add("-f");cutpic.add("image2");cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间cutpic.add("17"); // 添加起始时间为第17秒cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间cutpic.add("0.001"); // 添加持续时间为1毫秒cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小cutpic.add("800*280"); // 添加截取的图片大小为350*240cutpic.add(mediaPicPath); // 添加截取的图片的保存路径boolean mark = true;ProcessBuilder builder = new ProcessBuilder();try {mand(convert);builder.redirectErrorStream(true);builder.start();mand(cutpic);builder.redirectErrorStream(true);// 如果此属性为 true,则任何由通过此对象的 start() 方法启动的后续子进程生成的错误输出都将与标准输出合并,//因此两者均可使用 Process.getInputStream() 方法读取。
基于java的影视网站设计与实现

基于Java的影视网站设计与实现引言随着数字技术的飞速发展,互联网已经成为了人们获取信息和娱乐的主要途径之一。
影视行业也随之发展壮大,许多人喜欢在网上观看电影、电视剧和综艺节目。
因此,设计和实现一个高效、稳定的影视网站是非常重要的。
本文将介绍基于Java语言的影视网站的设计与实现。
1. 系统概述基于Java的影视网站是一个在线观看影视内容的平台。
用户可以在该网站上浏览和搜索电影、电视剧和综艺节目,并进行在线观看。
该系统包含了用户管理、影视内容管理、搜索功能、播放功能等多个模块。
2. 技术选型2.1 服务端技术•Java Servlet:作为Web应用程序的后端处理技术,用于接收和响应客户端请求。
•Spring框架:提供依赖注入和面向切面编程等功能,简化开发流程。
•MyBatis:用于数据库访问和操作,提供了ORM(对象关系映射)的支持。
2.2 前端技术•HTML/CSS:用于构建网页结构和样式。
•JavaScript:用于实现网页的动态效果和交互功能。
•jQuery:简化JavaScript代码的书写,提供了丰富的插件和工具函数。
2.3 数据库•MySQL:作为关系型数据库,用于存储用户信息、影视内容及其相关数据。
3. 系统功能设计与实现3.1 用户管理模块用户管理模块用于实现用户的注册、登录和个人信息管理功能。
•注册:用户输入用户名、密码等信息后,系统将其保存到数据库中,并生成唯一的用户ID。
•登录:用户输入用户名和密码,系统验证后,允许用户登录系统。
•个人信息管理:用户可以修改自己的个人信息,包括用户名、密码、头像等。
3.2 影视内容管理模块影视内容管理模块用于管理影视内容的分类、标签、演员等信息。
•分类管理:管理员可以添加、编辑和删除不同的影视分类,如电影、电视剧、综艺节目等。
•标签管理:管理员可以添加、编辑和删除影视的标签,用于标识影视内容的特点。
•演员管理:管理员可以添加、编辑和删除演员信息,包括姓名、个人简介、照片等。
Java使用OpenCV3.2实现视频读取与播放

Java使⽤OpenCV3.2实现视频读取与播放Java使⽤OpenCV3.2实现视频读取与播放,供⼤家参考,具体内容如下OpenCV从3.x版本开始其JAVA语⾔的SDK⽀持视频⽂件读写,这样就极⼤的⽅便了⼴⼤Java语⾔开发者学习与使⽤OpenCV,通过摄像头或者视频⽂件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应⽤开发任务。
可以说OpenCV C++ SDK可以做到绝⼤多数事情,在OpenCV3.x版本上⽤Java都可以完成,这样就为很多Java开发者学习OpenCV 打开了⽅便之门。
实现思路⾸先⽤OpenCV相关API读取视频流或者视频⽂件的每⼀帧,然后通过Swing JComponent组件实现视频每⼀帧的更新显⽰,我模仿了C++的HIGHGUI⾥⾯创建窗⼝与显⽰图像接⼝,基于Swing实现了⼀个视频播放窗⼝类,把读取到的每⼀帧都传给它就可以实现连续显⽰即播放。
每帧之间相隔100毫秒,我是通过Java线程Sleep⽅法实现。
运⾏效果 - USB摄像头读取每帧运⾏效果 - 视频⽂件读取每帧代码实现视频⽂件读取package com.gloomyfish.video.demo;import java.awt.Dimension;import java.awt.image.BufferedImage;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.videoio.VideoCapture;public class VideoDemo {public static void main(String[] args) {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);// 打开摄像头或者视频⽂件VideoCapture capture = new VideoCapture();//capture.open(0);capture.open("D:/vcprojects/images/768x576.avi");if(!capture.isOpened()) {System.out.println("could not load video data...");return;}int frame_width = (int)capture.get(3);int frame_height = (int)capture.get(4);ImageGUI gui = new ImageGUI();gui.createWin("OpenCV + Java视频读与播放演⽰", new Dimension(frame_width, frame_height));Mat frame = new Mat();while(true) {boolean have = capture.read(frame);Core.flip(frame, frame, 1);// Win上摄像头if(!have) break;if(!frame.empty()) {gui.imshow(conver2Image(frame));gui.repaint();}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}public static BufferedImage conver2Image(Mat mat) {int width = mat.cols();int height = mat.rows();int dims = mat.channels();int[] pixels = new int[width*height];byte[] rgbdata = new byte[width*height*dims];mat.get(0, 0, rgbdata);BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);int index = 0;int r=0, g=0, b=0;for(int row=0; row<height; row++) {for(int col=0; col<width; col++) {if(dims == 3) {index = row*width*dims + col*dims;b = rgbdata[index]&0xff;g = rgbdata[index+1]&0xff;r = rgbdata[index+2]&0xff;pixels[row*width+col] = ((255&0xff)<<24) | ((r&0xff)<<16) | ((g&0xff)<<8) | b&0xff;}if(dims == 1) {index = row*width + col;b = rgbdata[index]&0xff;pixels[row*width+col] = ((255&0xff)<<24) | ((b&0xff)<<16) | ((b&0xff)<<8) | b&0xff;}}}setRGB( image, 0, 0, width, height, pixels);return image;}/*** A convenience method for setting ARGB pixels in an image. This tries to avoid the performance * penalty of BufferedImage.setRGB unmanaging the image.*/public static void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {int type = image.getType();if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )image.getRaster().setDataElements( x, y, width, height, pixels );elseimage.setRGB( x, y, width, height, pixels, 0, width );}}视频与图像显⽰窗⼝类package com.gloomyfish.video.demo;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import javax.swing.JComponent;import javax.swing.JDialog;public class ImageGUI extends JComponent {/****/private static final long serialVersionUID = 1L;private BufferedImage image;public ImageGUI() {}@Overrideprotected void paintComponent(Graphics g) {Graphics2D g2d = (Graphics2D)g;if(image == null) {g2d.setPaint(Color.BLACK);g2d.fillRect(0, 0, this.getWidth(), this.getHeight());} else {g2d.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);System.out.println("show frame...");}}public void createWin(String title) {JDialog ui = new JDialog();ui.setTitle(title);ui.getContentPane().setLayout(new BorderLayout());ui.getContentPane().add(this, BorderLayout.CENTER);ui.setSize(new Dimension(330, 240));ui.setVisible(true);}public void createWin(String title, Dimension size) {JDialog ui = new JDialog();ui.setTitle(title);ui.getContentPane().setLayout(new BorderLayout());ui.getContentPane().add(this, BorderLayout.CENTER);ui.setSize(size);ui.setVisible(true);}public void imshow(BufferedImage image) {this.image = image;this.repaint();}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的播放器.多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。
??ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。
1.能支持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能支持的格式对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg支持,所以我们实例中需要ffmpeg视频处理工具.数据库实例所需要的数据库脚本drop database if exists db_mediaplayer;create database db_mediaplayer;use db_mediaplayer;create table tb_media(id int not null primary key auto_increment comment '主键' ,title varchar(50) not null comment '视频名称' ,src varchar(200) not null comment '视频存放地址' ,picture varchar(200) not null comment '视频截图' ,descript varchar(400) comment '视频描述' ,uptime varchar(40) comment '上传时间');desc tb_media;项目结构图:上传视频界面设计在上传文件时,Form表单中?enctype属性值必须为"multipart/form-data".模块界面设计如下图:enctype属性值说明application/x-www-form-urlencoded表单数据被编码为名称/值对,这是标准的编码格式multipart/form-data表单数据被编码为一条消息,页面上每个控件对应消息中的一部分text/plain表单数据以纯文本形式进行编码,其中不含任何控件格式的字符业务接口定义面向接口编程,接口中定义系统功能模块.这样方便理清业务,同时接口的对象必须由实现了该接口的对象来创建.这样就避免编码中的某些业务遗漏等,同时扩展性也增强了.packageimportimport/****** @version:** @author** @since:创建时间: 2013-2-07 上午10:19:54** TODO : interface is used for ...**/public interface MediaDao {/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath,String upFilePath, String codcFilePath, String mediaPicPath)throws Exception;/*** 保存文件* @param media* @return* @throws Exception*/public boolean saveMedia(Media media)throws Exception;/*** 查询本地库中所有记录的数目* @return* @throws Exception*/public int getAllMediaCount()throws Exception;/*** 带分页的查询* @param firstResult* @param maxResult* @return*/public List<Media> queryALlMedia(int firstResult, int maxResult)throws Exception;/*** 根据Id查询视频* @param id* @return* @throws Exception*/public Media queryMediaById(int id)throws Exception;}接口的实现,这里列出ffmpeg视频转码与截图模块/*** 视频转码* @param ffmpegPath 转码工具的存放路径* @param upFilePath 用于指定要转换格式的文件,要截图的视频源文件* @param codcFilePath 格式转换后的的文件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath, String upFilePath, String codcFilePath,String mediaPicPath) throws Exception {因为如果对象new太多,会不必要的浪费资源.所以工厂,采用单例模式,私有构造,提供对外可访问的方法即可.packageimport/****** @version:** @author** @since:创建时间: 2013-2-07 下午02:18:51** TODO : class is used for ...**/public class DaoFactory { ervlet控制器相关代码如下packageimportimportimportimportimportimportimportimportimportimportimportimportimportimportimportimport/****** @version:** @author** @since:创建时间: 2013-2-08 下午02:24:47** TODO : class is used for ...**/public class MediaService extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PrintWriter out = ();MediaDao mediaDao = ();String message = "";String uri = ();String path = ("/"), ("."));if("/uploadFile".equals(path)){etBytes("ISO8859-1"),"UTF-8"));}if("descript")){(new String().getBytes("ISO8859-1"),"UTF-8"));}}else{); lv"; pg"; etRealPath("/tools/"); ("videos/" + serialName + ".flv");("videos/images/" +serialName + ".jpg");());orward(request,response);} catch (Exception e) {();throw new ServletException(e);}}if("/queryAll".equals(path)){List<Media> mediaList;try {mediaList = (0,5);("mediaList", mediaList);("").forward(request, response);} catch (Exception e) {();}}if("/play".equals(path)){String idstr = ("id");int mediaId = -1;Media media = null;if(null!=idstr){mediaId = (idstr);}try {media = (mediaId);} catch (Exception e) {();}("media", media);("").forward(request, response);}}}可以通过分页查找,显示最新top5,展示到首页.相应特效可以使用JS实现.相关代码如下:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import<%@ page import=".*"%><%String path = ();String basePath = ()+":idth(); ength; ppend(btn);$("#focus .btnBg").css("opacity",;tn span").css("opacity",.mouseenter(function() {index = $("#focus .btn span").index(this);showPics(index);}).eq(0).trigger("mouseenter");reNext").css("opacity",.hover(function() {$(this).stop(true,false).animate({"opacity":""},300); },function() {$(this).stop(true,false).animate({"opacity":""},300); });re").click(function() {index -= 1;if(index == -1) {index = len - 1;}showPics(index);});ext").click(function() {index += 1;if(index == len) {index = 0;}showPics(index);});ss("width",sWidth * (len));over(function() {clearInterval(picTimer);},function() {picTimer = setInterval(function() {showPics(index);index++;if(index == len) {index = 0;}},4000); rigger("mouseleave");top(true,false).animate({"left":nowLeft},300); tnspan").removeClass("on").eq(index).addClass("on"); tnspan").stop(true,false).animate({"opacity":""},300).eq(index).stop(true,false).animate({"opacity ":"1"},300); 片为视频转码过程中拉取到的图片.点击图片即可发送播放视频请求,视频播放页面效果如下图所示.视频播放页面需要在页面中嵌入Flash播放器代码如下:<!-- 嵌入Flash播放器 --><td align="center" width="455"><param name="movie"value="<%=basePath%>tools/?fileName=<%=basePath%><%=()%>" /><embedsrc="<%=basePath%>tools/?fileName=<%=basePath%><%=()%>"width="98%" height="90%"></embed></object></td>相关说明:<param>元素,value属性指定被加载的视频文件.实例中用的是flash制作的视频播放器.在value属性值中向播放器传递了一个file参数.该参数指定了要播放的视频的路径.<embed>元素,src属性也是用来加载影片,与<param>标记的value属性值具体相同的功能.转载请注明出处:[]。