1 .
my system
uname -a
Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
2.ffmpeg是从http://johnvansickle.com/ffmpeg/下载
3.我已下载 ffmpeg-release-64bit-static.tar.xz
,解压缩此文件,然后运行: ./ffmpeg
然后 ffmpeg
已安装 . 我用以下方法检查: ffmpeg -version
没问题 .
我在我的系统中运行那些命令没问题:
cd /home/web/tomcat-6.0.29/zhouletest/ffmpeg-3.1.1-64bit-static
./ffmpeg -y -ss 10 -t 3 -i /home/web/tomcat-6.0.29/zhouletest/videos/6.mp4 -vf fps=10,scale=177:-1:flags=lanczos,palettegen /home/web/tomcat-6.0.29/zhouletest/gif_images/palettegens/6.png
./ffmpeg -y -ss 10 -t 3 -i /home/web/tomcat-6.0.29/zhouletest/videos/6.mp4 -i /home/web/tomcat-6.0.29/zhouletest/gif_images/palettegens/6.png -filter_complex "fps=10,scale=177:-1:flags=lanczos[x];[x][1:v]paletteuse" /home/web/tomcat-6.0.29/zhouletest/gif_images/6.gif
但是当我在java中调用此命令时,会发生错误,为什么?
String cmd1 = "/home/web/tomcat-6.0.29/zhouletest/ffmpeg -y -ss 10 -t 3 -i /home/web/tomcat-6.0.29/zhouletest/videos/6.mp4 -vf fps=10,scale=177:-1:flags=lanczos,palettegen /home/web/tomcat-6.0.29/zhouletest/gif_images/palettegens/6.png";
String cmd2 = "/home/web/tomcat-6.0.29/zhouletest/ffmpeg-3.1.1-64bit-static/ffmpeg -y -ss 10 -t 3 -i /home/web/tomcat-6.0.29/zhouletest/videos/6.mp4 -i /home/web/tomcat-6.0.29/zhouletest/gif_images/palettegens/6.png -filter_complex \"fps=10,scale=177:-1:flags=lanczos[x];[x][1:v]paletteuse\" /home/web/tomcat-6.0.29/zhouletest/gif_images/6.gif";
String result1 = executeCommand(cmd1);
String result2 = executeCommand(cmd2);
private static String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
errors:
result1:result2:ffmpeg版本3.1.1-static http://johnvansickle.com/ffmpeg/版权所有(c)2000-2016 FFmpeg开发人员使用gcc 5.4.0(Debian 5.4.0-4)20160609配置: - -enable-gpl --enable-version3 --enable-static --disable-debug --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis - -enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-amrwbenc --enable-grey --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --enable-frei0r --enable-libfribidi --disable-indev = sndio --disable -outdev = sndio --enable-librtmp --enable-libmfx --enable-libzimg --cc = gcc libavutil 55. 28.100 / 55. 28.100 libavcodec 57. 48.101 / 57. 48.101 libavformat 57. 41.100 / 57. 41.100 libavdevice 57 .0.101 / 57. 0.101 libavfilter 6. 47.100 / 6. 47.100 libswscale 4. 1.100 / 4. 1.100 libsw resample 2. 1.100 / 2. 1.100 libpostproc 54. 0.100 / 54. 0.100输入#0,mov,mp4,m4a,3gp,3g2,mj2,来自'/home/web/tomcat-6.0.29/zhouletest/videos/6 .mp4':元数据:major_brand:isom minor_version:512 compatible_brands:isomiso2avc1mp41编码器:Lavf56.40.101持续时间:00:04:36.64,开始:-3.338000,比特率:1089 kb / s流#0:0(und):视频: h264(主)(avc1 / 0x31637661),yuv420p,480x360,997 kb / s,15 fps,15 tbr,16k tbn,30 tbc(默认)元数据:handler_name:VideoHandler流#0:1(und):音频:aac (主要)(mp4a / 0x6134706D),22050 Hz,立体声,fltp,88 kb / s(默认)元数据:handler_name:SoundHandler输入#1,png_pipe,来自'/home/web/tomcat-6.0.29/zhouletest/gif_images /palettegens/6.png':持续时间:N / A,比特率:N / A流#1:0:视频:png,rgba(pc),16x16 [SAR 1:1 DAR 1:1],25 tbr,25 tbn,25 tbc [AVFilterGraph @ 0x45c5260]没有这样的过滤器:'“fps'初始化复杂过滤器时出错 . 无效的论点
3 回答
与您的FFmpeg二进制文件无关,这几乎肯定与在命令运行的shell环境中转义字符有关 .
检查错误消息:
FFmpeg认为被调用的过滤器是
"fps
.尝试删除filter_complex周围的引号,即
或者,如果这不起作用,请将其括在单引号中 .
最后,我写了一个shell:gifcreate.sh,我用java来调用它,它运行良好 .
这是myshell
这是我在shell中的调用方法
这是我在java中的调用方法
参考
https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality?answertab=votes#tab-top
当您使用单独的语言或系统生成
ffmpeg
命令行调用时,有时会发生这种情况,如果您有一个最近的ffmpeg(大于3.0),则默认情况下应将palettegen
编译到其中 .在我的情况下,经过一整天的命令行试验,结果发现我需要在我生成的CLI调用中转义
,
,前面是\
. 因此,ffmpeg无法正确读取参数,最终认为我要求使用'fps'作为过滤器,或类似的 .