bramp / ffmpeg-cli-wrapper

Java wrapper around the FFmpeg command line tool
BSD 2-Clause "Simplified" License
1.72k stars 413 forks source link

FFmpegJob running. how to do force stop job? #298

Open 13330863440 opened 11 months ago

13330863440 commented 11 months ago
public  static Set<String> closeIdSet = new HashSet<>();
executor.execute(() -> {
    // thread
     Thread currentThread = Thread.currentThread();
    String currentJobId="xxxx";
   ScheduledExecutorService sche= new ScheduledThreadPoolExecutor(1);
                    sche.scheduleAtFixedRate(() -> {
                       if(closeIdSet.contains(currentJobId)){
                          //force stop thread and stop job  !!  . how to do force stop job?
                           currentThread.stop();
                       }
                    }, 0, 1, TimeUnit.SECONDS);

    FFmpegJob job = executor.createJob(builder)
    job.run();  // job running.  need force stop running

    next steps
    xxxx
    xxxx
    xxxx
});
//add closeIdSet  "xxxx" in  other thread 
13330863440 commented 11 months ago

just stop job.run(). like as

Process p = runFunc.run(path(args));
assert (p != null);
p.destroyForcibly()

Can this be done without modifying the source code

luoyh commented 3 days ago

@13330863440 you can implements net.bramp.ffmpeg.RunProcessFunction, the #run() return java.lang.Process. like :


static class OwnProcessFunction extends RunProcessFunction {

        private Process p;

        @Override
        public Process run(List<String> args) throws IOException {
            p = super.run(args);
            // set process
            return p;
        }
        // destroy process.
        private void close() {
                ProcessHandle h = p.toHandle();
                h.destroy();
                h.descendants().forEach(ProcessHandle::destroy);
        }
    }

  public static void main(String[] args) {
        String ffmpegPath = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
        // use my processfunction.
        OwnProcessFunction proc = new OwnProcessFunction();
        FFmpeg ffmpeg = new FFmpeg(ffmpegPath, proc);
        // todo
        // in other thread, can call proc.close(); destroy process;
  }
``