
前段时间经常在做一个生物资源共享系统,采用SSM框架技术,其中涵盖一个模块,是关于视频资源的播放。
本来不是很大的弊端,但是无奈用户要求较好,需要支持N种格式的视频播放,没有办法,转码是必不可少的了。
对于一个从来没接触过很多哪些音频视频编码格式的我,浪费了很长时间,其中好多博客的教学都不太完善。
反正就是有一堆麻烦事情,坑也多,所以我而是记录一下,以后还要的过后就不要那么麻烦了。
采用工具:
ffmpeg 软件
Mencoder 软件
Video.js 文件
废话不说了,直接上干货。
关于上传下载就是不做重点讲了,反正代码贴上去了,直接用就行。
jsp上传页面:
add_video.jsp
实际上就是一个form表单提交请求到
action=“back/addVideo” encType=“multipart/form-data” method=“post”
源码如下:

<div id="tab1" class="tabson">
<div class="formtext">Hi,<b>${user.username}</b>,欢迎您使用教学资源共享平台!</div>
<form id="frm2" name="frm2" action="back/addVideo" encType="multipart/form-data" method="post">
<ul class="forminfo">
<li>
<label>资源名称<b>*</b></label><input id="title" name="title" type="text" class="dfinput" value="" style="width:518px;"/>
<input id="uid" name="uid" type="text" hidden="hidden" value="${uid}"/>
</li>
<li><label>审核状态<b>*</b></label>
<div class="vocation">
<select class="select1" id="state" name="state">
<option value="0">未审核</option>
<option value="1">通过</option>
<option value="2">不通过</option>
<option value="3">下架</option>
</select>
</div>
</li>
<li><label>上传者<b>*</b></label><input id="writer" name="writer" type="text" class="dfinput" value="${user.username}" style="width:518px;"/></li>
<li><label>上传时间<b>*</b></label><input id="time" name="time" type="date" class="dfinput" value="" style="width:518px;" /></li>
<li><label>所属级别<b>*</b></label>
<div class="vocation">
<select class="select1" id="grade" name="grade">
<option value="0">初中</option>
<option value="1">高中</option>
</select>
</div>
</li>
<li><label>资源类型<b>*</b></label>
<div class="vocation">
<select class="select1" id="subclass" name="subclass">
<!-- 邹涛20180814 -->
<c:if test="${uid eq 3}">
<option value="微视频">微视频</option>
<option value="实验视频">实验视频</option>
<option value="教学视频">教学视频</option>
</c:if>
</select>
</div>
</li>
<li><label>上传资源<b>*</b></label><input id="file" name="file" type="file" style="width:518px;" /></li>
<li><label>点击量<b>*</b></label><input id="clicks" name="clicks" type="text" class="dfinput" value="0" style="width:518px;"/></li>
<li>
<label> </label><input name="" type="button" class="btn" onclick="startPost();" value="提交"/>
</li>
</ul>
</form>
</div>
</div>
addVideo控制层
源码如下:
/**
* @Description:(视频资源的单独上传的接收)
* @param:@param request
* @param:@param response
* @param:@param session
* @param:@return
* @return:ModelAndView
* @author:Zoutao
* @date:2018-6-12
* @version:V1.0
*/
@RequestMapping(value = "/addVideo")
public ModelAndView uploadflie_Video(
@RequestParam("file") CommonsMultipartFile file,
HttpServletRequest req, HttpServletRequest request) {
System.out.println("进入addVideo视频上传控制层");
if (file.getSize() != 0) {
//上传的多格式的视频文件-作为临时路径保存,转码以后删除-路径不能写//
String path = "E:/Projectpicture/websiteimages/temp/";
File TempFile = new File(path);
if (TempFile.exists()) {
if (TempFile.isDirectory()) {
System.out.println("该文件夹存在。");
}else {
System.out.println("同名的文件存在,不能创建文件夹。");
}
}else {
System.out.println("文件夹不存在,创建该文件夹。");
TempFile.mkdir();
}
// 获取上传时候的文件名
String filename = file.getOriginalFilename();
// 获取文件后缀名
String filename_extension = filename.substring(filename
.lastIndexOf(".") + 1);
System.out.println("视频的后缀名:"+filename_extension);
//时间戳做新的文件名,避免中文乱码-重新生成filename
long filename1 = new Date().getTime();
filename = Long.toString(filename1)+"."+filename_extension;
//去掉后缀的文件名
String filename2 = filename.substring(0, filename.lastIndexOf("."));
System.out.println("视频名为:"+filename2);
//源视频地址+重命名后的视频名+视频后缀
String yuanPATH =(path+filename);
System.out.println("视频的完整文件名1:"+filename);
System.out.println("源视频路径为:"+yuanPATH);
//上传到本地磁盘/服务器
try {
System.out.println("写入本地磁盘/服务器");
InputStream is = file.getInputStream();
OutputStream os = new FileOutputStream(new File(path, filename));
int len = 0;
byte[] buffer = new byte[2048];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.close();
os.flush();
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("========上传完成,开始调用转码工具类=======");
//调用转码机制flv mp4 f4v m3u8 webm ogg放行直接播放,
//asx,asf,mpg,wmv,3gp,mov,avi,wmv9,rm,rmvb等进行其他转码为mp4
if (filename_extension.equals("avi") || filename_extension.equals("rm")
|| filename_extension.equals("rmvb") || filename_extension.equals("wmv")
|| filename_extension.equals("3gp") || filename_extension.equals("mov")
||filename_extension.equals("flv") || filename_extension.equals("ogg")
) {
ConverVideoTest c = new ConverVideoTest();
c.run(yuanPATH); //调用转码
System.out.println("=================转码过程彻底结束=====================");
}
//获取转码后的mp4文件名
String Mp4path = "E://Projectpicture/websiteimages/finshvideo/";
filename2 = filename2+".mp4";
String NewVideopath =Mp4path +filename2;
System.out.println("新视频的url:"+NewVideopath);
//删除临时文件
File file2 = new File(path);
if (!file2.exists()) {
System.out.println("没有该文件");
}
if (!file2.isDirectory()) {
System.out.println("没有该文件夹");
}
String[] tempList = file2.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile() || temp.isDirectory()) {
temp.delete(); //删除文件夹里面的文件
}
}
System.out.println("所有的临时视频文件删除成功");
// 实例化用户类
tb_resource resource = new tb_resource();
//获取填写的相关信息
String title = request.getParameter("title");
String writer = request.getParameter("writer");
int state = Integer.parseInt(request.getParameter("state"));
String time = request.getParameter("time");
int clicks = Integer.parseInt(request.getParameter("clicks"));
int grade = Integer.parseInt(request.getParameter("grade"));
String subclass = request.getParameter("subclass");
int uid = Integer.parseInt(request.getParameter("uid"));
//存储信息
resource.setTitle(title);
resource.setWriter(writer);
resource.setTime(time);
resource.setClicks(clicks);
resource.setGrade(grade);
resource.setSubclass(subclass);
resource.setState(state);
resource.setUid(uid);
resource.setSuffix(filename2);
resource.setUrl(NewVideopath); //已转码后的视频存放地址
// 实现对数据的更新
int n = 0;
n = tb_resourceService.insertResource(resource);
if (n != 0) {
return new ModelAndView("back/public/success").addObject(
"notice", "resourceList?uid=" + uid
+ "&grade=-1&state=-1&subclass=" + subclass);
} else {
return new ModelAndView("back/public/fail").addObject("notice",
"resourceList?uid=" + uid
+ "&grade=-1&state=-1&subclass=" + subclass);
}
}
return null;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-121502-1.html
五年后
国内的啤酒也是淡如水