2016-06-23 2 views
0

나는 httprequest를 기다리는 자바 서블릿을 가지고 있는데, 도착하면 FFmpeg를 호출하여 두 개의 비디오를 섞는다. FFmpeg가 끝나면 Java 코드는 혼합 된 비디오를 다시 요청자에게 보내야합니다. 혼합 비디오가 준비되면 FFmpeg를 설정하여 Java 서블릿에 알릴 수 있습니까? 현재 모양의 코드가 FFmpeg가 완전히 완료되지 않은 동안 비디오 전송을 시작합니다.작업이 끝나면 FFmpeg가 자바 코드로 신호를 보내도록 설정하는 방법은 무엇입니까?

thread.sleep() 또는 이와 유사한 메소드를 사용할 수 있지만 연구 작업의 처리 시간을 측정해야하므로 사용할 수 없습니다.

내가 도와 주시면 감사하겠습니다.

String videoId=req.getParameter("id");   
     String ad= "/var/Videos/ads/angrybirds-adv.mp4"; 
     String url="http://"+RequesterIP+"/"+videoId; 
     System.out.println("url: "+url); 
     String output= new SimpleDateFormat("yyyyMMddhhmm'.mp4'").format(new Date()); 
     String videoPath = "/var/Videos/"+output; 
     List<String> cmds = new ArrayList<>(); 
     cmds.add("ffmpeg"); 
     cmds.add("-i"); 
     cmds.add(url); 
     cmds.add("-i"); 
     cmds.add(ad); 
     cmds.add("-filter_complex"); 
     cmds.add("[0:v][1:v] overlay"); 
     cmds.add(videoPath); 
     ProcessBuilder pb = new ProcessBuilder(cmds); 
     Process p = pb.start(); 

     /** Terminal **/ 
     final InputStream inStream = p.getErrorStream(); 
     new Thread(new Runnable() { 
     public void run() {   
       InputStreamReader reader = new InputStreamReader(inStream); 
       Scanner scan = new Scanner(reader); 
       while (scan.hasNextLine()) { 
        System.out.println(scan.nextLine()); 
       } 
      } 
     }).start();  

// send the mixed video to the requester 
File downloadFile = new File(videoPath); 
... 

자세한 내용 : 광고 영상은 원본 비디오가 요청자 기계 공용 폴더에있는 FFmpeg를 동일한 시스템에있는 오버레이 비디오, 그리고이다 이 코드의 일부입니다 이 URL을 사용하여 액세스 할 수 있습니다 : http://requester-IP/videoId

답변

1

ffmpeg가 완료 될 때까지 스레드를 일시 중지하려면 Process#waitFor()을 사용해야합니다.

관련 문제