【发布时间】:2013-12-28 11:39:54
【问题描述】:
我在发送 ffmpeg 命令以使用 Runtime.exec() 从 Java 向我的视频添加水印时遇到问题。 奇怪的是,相同的命令在终端上运行良好...... 知道问题可能是什么吗? 这是命令
ffmpeg -i /home/mydir/inputvideo.mp4 -vf "movie=/home/mydir/watermarklogo.png [wm]; [in][wm] overlay=10:10 [out]" /home/mydir/outputvideo.mp4
这是Java代码(和上面一样,只是包裹在exec代码中,还有转义字符
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);
运行时退出代码始终为 1....这是完整的输出
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
【问题讨论】:
-
标准输出有输出吗? ffmpeg 在您的路径中吗?尝试提供完整路径,例如
rt.exec("/usr/bin/ffmpeg ...(当然,调整为安装时的真实 ffmpeg 路径)。 -
对不起,我现在添加了输出,你可以看到 ffmpeg 被识别为命令
-
它不需要与您的问题相关,但可能是输入流之一导致错误。在java world 上有一篇关于这类问题的精彩文章
-
可能是 rt.exec 首先调用 shell 的问题,它解释你的命令行并摆弄引号。试试 rt.exec 的数组版本:
rt.exec(new String[] { "ffmpeg", "-i", "/home/mydir/inputvideo.mp4", "-vf", "movie=/home/mydir/watermarklogo.png [wm]; [in][wm] overlay=10:10 [out]", "/home/mydir/outputvideo.mp4"}); -
+1。正是 Guntram Blohm 所说的。
标签: java ffmpeg runtime.exec watermark video-watermarking