A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谷粒姐姐 于 2019-6-14 15:06 编辑

1.2.3 视频处理实现 1.2.3.1确定消息格式
MQ消息统一采用json格式,视频处理生产方会向MQ发送如下消息,视频处理消费方接收此消息后进行视频处 理:
{“mediaId”:XXX} 1.2.3.2处理流程
1)接收视频处理消息 2)判断媒体文件是否需要处理(本视频处理程序目前只接收avi视频的处理)
当前只有avi文件需要处理,其它文件需要更新处理状态为“无需处理”。
3)处理前初始化处理状态为“未处理”
4)处理失败需要在数据库记录处理日志,及处理状态为“处理失败”
5)处理成功记录处理状态为“处理成功”   1.2.3.3数据模型
在MediaFile类中添加mediaFileProcess_m3u8属性记录ts文件列表,代码如下:
[AppleScript] 纯文本查看 复制代码
//处理状态 private String processStatus;
//hls处理 private MediaFileProcess_m3u8 mediaFileProcess_m3u8;

[AppleScript] 纯文本查看 复制代码
@Data
 @ToString public class MediaFileProcess_m3u8 extends MediaFileProcess {  
   //ts列表   
  private List<String> tslist; } 

1.2.3.4 视频处理生成Mp4
1、创建Dao 视频处理结果需要保存到媒资数据库,创建dao如下:

[AppleScript] 纯文本查看 复制代码
public interface MediaFileRepository extends MongoRepository<MediaFile,String> {  
 }

2、在application.yml中配置ffmpeg的位置及视频目录的根目录:

[AppleScript] 纯文本查看 复制代码
xc‐service‐manage‐media:  
 video‐location: F:/develop/video/ 
  ffmpeg‐path: D:/Program Files/ffmpeg‐20180227‐fa0c9d6‐win64‐static/bin/ffmpeg.exe

3、处理任务类 在mq包下创建MediaProcessTask类,此类负责监听视频处理队列,并进行视频处理。
整个视频处理内容较多,这里分两部分实现:生成Mp4和生成m3u8,下边代码实现了生成mp4。

[AppleScript] 纯文本查看 复制代码
@Component public class MediaProcessTask {     private static final Logger LOGGER = LoggerFactory.getLogger(MediaProcessTask.class);   
    //ffmpeg绝对路径  
   @Value("${xc‐service‐manage‐media.ffmpeg‐path}")   
  String ffmpeg_path;    
   //上传文件根目录  
   @Value("${xc‐service‐manage‐media.upload‐location}")
    String serverPath;
    @Autowired    
 MediaFileRepository mediaFileRepository;   
      @RabbitListener(queues = "${xc‐service‐manage‐media.mq.queue‐media‐processtask}")     public void receiveMediaProcessTask(String msg) throws IOException {   
      Map msgMap = JSON.parseObject(msg, Map.class);    
     LOGGER.info("receive media process task msg :{} ",msgMap);      
   //解析消息  
       //媒资文件id   
      String mediaId = (String) msgMap.get("mediaId");    
     //获取媒资文件信息 
        Optional<MediaFile> optional = mediaFileRepository.findById(fileMd5);  
       if(!optional.isPresent()){        
     return ;    
     }      
   MediaFile mediaFile = optional.get();     
    //媒资文件类型        
 String fileType = mediaFile.getFileType();     
    if(fileType == null || !fileType.equals("avi")){//目前只处理avi文件    
         mediaFile.setProcessStatus("303004");//处理状态为无需处理       
      mediaFileRepository.save(mediaFile);     
        return ;  
       }else{ 
            mediaFile.setProcessStatus("303001");//处理状态为未处理       
      mediaFileRepository.save(mediaFile);  
       }     
    //生成mp4   
      String video_path = serverPath + mediaFile.getFilePath()+mediaFile.getFileName();   
      String mp4_name = mediaFile.getFileId()+".mp4";    
     String mp4folder_path = serverPath + mediaFile.getFilePath();    
     Mp4VideoUtil videoUtil = new  Mp4VideoUtil(ffmpeg_path,video_path,mp4_name,mp4folder_path);     
    String result = videoUtil.generateMp4();   
      if(result == null || !result.equals("success")){       
      //操作失败写入处理日志    
         mediaFile.setProcessStatus("303003");//处理状态为处理失败     
        MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();   
          mediaFileProcess_m3u8.setErrormsg(result);           
  mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);       
      mediaFileRepository.save(mediaFile);    
         return ;    
     }    
     //生成m3u8...   
      } }

说明:
1、原始视频转成mp4如何判断转换成功?

根据视频时长来判断,取原视频和转换成功视频的时长(时分秒),如果相等则相同。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马