一.处理视频的方式
课件写到了处理视频的两种方式:
1.自动处理:课件与教程有讲解不过多陈述
2.手动处理:这里是本人自己思考的情况以及解决方案如果不够完美或有错误敬请原谅。
二.需要手动处理的情况
出现处理失败需要手动处理的情况有两种
(1)视频上传成功,消息也发送成功但是在处理时没有成功,视频处理状态会记录失败,在MediaProcessTask类中监听消息方法receiveMediaProcessTask中当转换成mp4或者m3u8格式只要失败会记录processStatus=“303003”;
(2)视频上传成功,消息没有发出(mq服务没有启动)这时就会没有处理成功,但是会保存文件信息到mongodb数据库这时是没有记录视频处理状态processStatus的值,在媒资列表,视频处理状态一栏会是空白。
三.处理思路
前端页面media_list.vue,获取文件ID -mediaId,视频处理的状态processStatus,文件状态fileStatus,文件类型fileType
第一步:判断文件是否上传成功(这里上传不成功不会显示在媒资文件列表中),文件格式是否为avi格式,不是给出错误信息,都正确执行第二步
第二步:判断视频处理状态的值,为处理失败就可以调用接口发送消息进行视频的处理。
第三步:考虑mq没有启动的情况老师讲解教程中捕获mq异常时没有进行processStatus值的设置,所以首先我们需要修改后端发送消息的代码sendProcessVideoMsg方法中添加mq出现异常设置processStatus值的代码,代码如下
//发送视频处理的消息,参数是媒资文件的ID,就是上传文件时的MD5值
public ResponseResult sendProcessVideoMsg(String mediaId){
//查询数据库media_file
Optional<MediaFile> optional = this.mediaFileRepository.findById(mediaId);
if (!optional.isPresent()){
//表示此视频文件不存在直接抛出异常
ExceptionCast.cast(CommonCode.FAIL);
}
//构造消息的内容
Map<String,String> map=new HashMap<>();
map.put("mediaId",mediaId);
String msg = JSON.toJSONString(map);
try {
//向MQ发送视频处理的消息
this.rabbitTemplate.convertAndSend(RabbitMQConfig.EX_MEDIA_PROCESSTASK,this.routingkey_media_video,msg);
} catch (AmqpException e) {
//更新视频处理状态为失败
MediaFile mediaFile = optional.get();
mediaFile.setProcessStatus("303003");
MediaFile save = this.mediaFileRepository.save(mediaFile);
if (save==null){
//表示消息发送失败,更新视频状态失败,抛出异常
log.error("视频处理消息发送失败,mediaId:"+mediaId+";更新视频处理状态失败");
ExceptionCast.cast(CommonCode.FAIL);
}
e.printStackTrace();
log.error("视频处理消息发送失败,mediaId:"+mediaId);
//发生异常,返回失败
return new ResponseResult(CommonCode.FAIL) ;
}
return new ResponseResult(CommonCode.SUCCESS) ;
}
四.代码的编写
1.media_list页面发送处理请求的代码
//处理失败的文件
process (mediaId,processStatus,fileStatus,fileType) {
if (fileStatus=="301002"&&(fileType=="avi"||fileType=="mp4"||fileType=="mov"||fileType=="rmvb"||fileType=="flv")){//基本要求一个上传成功,一个视频格式为avi或常见格式
//一种情况发送消息了处理失败,另一种情况消息发送失败根本没有处理(这种情况,后台设置了处理状态为失败)两种情况都可以根据状态进行重新处理
if (processStatus=="303003") {
//表示文件上传成功发送消息处理失败的媒资文件,需要重新发送MQ消息进行视频的处理
mediaApi.media_process(mediaId).then((res)=>{
if(res.success){
this.$message.success('开始处理,请稍后查看处理结果或处理状态');
}else{
this.$message.error('操作失败,请刷新页面重试');
}
})
}else {
this.$message.warning('视频处理状态进行中或者无需处理,请勿重复处理');
}
}else{
this.$message.error('系统暂只支持常见视频格式处理。例如avi,mp4,mov,rmvb,flv');
}
},
- media.js 发送请求的方法
//发送消息开始处理上次失败的文件
export const media_process=mediaId=>{
return http.requestQuickGet(apiUrl+'/media/file/process/'+mediaId)
}
3.服务端api与controller
//Api代码
@ApiOperation("开始处理某个媒资文件")//Id 媒资文件的ID
public ResponseResult process(String Id) ;
//controller代码
//开始处理某个文件,处理文件上传成功,但是视频处理失败的接口进行消息的发送进行从新处理
@Override
@GetMapping("/process/{mediaId}")
public ResponseResult process(@PathVariable(value = "mediaId") String mediaId) {
return this.mediaUploadService.sendProcessVideoMsg(mediaId);
}
3.service就是调用发送消息的方法,参数是媒资文件的ID
五.测试
我们关闭mq服务,上传一个avi文件媒资文件列表就会显示处理失败,然后开启mq服务,查看处理状态会由处理失败更改为处理中最后处理成功,或者去视频处理后的存储目录进行查看即可
本人技术有限写的不好的地方敬请原谅,如有什么问题或者更好的建议大家可以留言或者私信