Java的新项目学成在线笔记-day14(三)

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] 纯文本查看 复制代码

?

1

2

//处理状态 private String processStatus;

//hls处理 private MediaFileProcess_m3u8 mediaFileProcess_m3u8;

[AppleScript] 纯文本查看 复制代码

?

1

2

3

4

@Data

 @ToString public class MediaFileProcess_m3u8 extends MediaFileProcess { 

   //ts列表  

  private List<String> tslist; }


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

[AppleScript] 纯文本查看 复制代码

?

1

2

public interface MediaFileRepository extends MongoRepository<MediaFile,String> { 

 }


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

[AppleScript] 纯文本查看 复制代码

?

1

2

3

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] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

@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如何判断转换成功?

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

猜你喜欢

转载自blog.csdn.net/czbkzmj/article/details/91802598