Rohi
Rohi

Reputation: 385

ffmpeg watermark from java Runtime.exec cannot find output

I'm having a problem in sending a ffmpeg command to add a watermark to my video from Java using Runtime.exec(). The strange thing is that the same command is working perfectly from terminal.... Any idea what the issue could be? this is the command

ffmpeg -i /home/mydir/inputvideo.mp4 -vf "movie=/home/mydir/watermarklogo.png [wm]; [in][wm] overlay=10:10 [out]" /home/mydir/outputvideo.mp4

and this is the Java code (same as above, just wrapped in the exec code, and escaped characters

Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("ffmpeg -i /home/mydir/inputvideo.mp4 -vf \"movie=/home/mydir/watermarklogo.png [wm]; [in][wm] overlay=10:10 [out]\" /home/mydir/outputvideo.mp4");
        InputStream stderr = proc.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        while ( (line = br.readLine()) != null)
            System.out.println(line);
        int exitVal = proc.waitFor();
        System.out.println("Process exitValue: " + exitVal);

exit code is always 1 when running this.... this is the full output

    ffmpeg version 0.10.9-7:0.10.9-1~saucy1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Oct 18 2013 17:40:10 with gcc 4.8.1
  configuration: --arch=amd64 --disable-stripping --enable-pthreads --enable-runtime-cpudetect --extra-version='7:0.10.9-1~saucy1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-libcdio --enable-x11grab --enable-libx264 --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
  libavutil      51. 35.100 / 51. 35.100
  libavcodec     53. 61.100 / 53. 61.100
  libavformat    53. 32.100 / 53. 32.100
  libavdevice    53.  4.100 / 53.  4.100
  libavfilter     2. 61.100 /  2. 61.100
  libswscale      2.  1.100 /  2.  1.100
  libswresample   0.  6.100 /  0.  6.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/rohif/oshi.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf54.59.106
  Duration: 00:00:48.13, start: 0.000000, bitrate: 2482 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2362 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 117 kb/s
    Metadata:
      handler_name    : 
[NULL @ 0x18fb9a0] Unable to find a suitable output format for '[wm];'
[wm];: Invalid argument
Process exitValue: 1

Upvotes: 2

Views: 1111

Answers (1)

Azdy
Azdy

Reputation: 320

I wrote below code in the Kotlin(You can convert it to java source):

     ffmpeg = FFmpeg(ffmpegConfig.ffmpegPath)
     ffprobe = FFprobe(ffmpegConfig.ffProbePath)
     val builder = FFmpegBuilder().setComplexFilter("overlay=x=(main_w-overlay_w)-2:y=(main_h-overlay_h)-2")
        .addInput(videoPath)
        .addInput(watermarkPath)
        .overrideOutputFiles(true)
        .setFormat("mp4")
        .addOutput(tempWaterMarkMediaFile.absolutePath)
        .done()
    val executor = FFmpegExecutor(ffmpeg, ffprobe)
    executor.createJob(builder).run()

Upvotes: 1

Related Questions