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();
}
错误:
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
libswresample 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'
初始化复杂滤镜时出错。
无效 论点
答案 0 :(得分:0)
与您的FFmpeg二进制文件无关,这几乎肯定与在命令运行的shell环境中转义字符有关。
检查错误消息:
No such filter: '"fps'
FFmpeg认为被调用的过滤器是"fps
。
尝试删除filter_complex周围的引号,即
-filter_complex fps=10,scale=177:-1:flags=lanczos[x];[x][1:v]paletteuse
如果这不起作用,请将其用单引号括起来。
-filter_complex 'fps=10,scale=177:-1:flags=lanczos[x];[x][1:v]paletteuse'
答案 1 :(得分:0)
最后,我写了一个shell:gifcreate.sh,我用java来调用它,它运行良好。
#/bin/bash
_srcFile=$1 #video file path
_descFile=$2 #output GIF file
_width=$3 #widht of output GIF file
_start=$4 #skip the first $_start seconds of the $_srcFile
_time=$5 #create a $_time second output
_cover=$6 #overwrite the palette and gif if exist, y is yes,n is not
_fps=$7 #Frame rate,can control GIF definition,
_palettegenFile=$8 #palette file path
cd /home/web/tomcat-6.0.29/zhouletest/ffmpeg-3.1.1-64bit-static
./ffmpeg -$6 -t $_time -i $_srcFile -vf fps=$_fps,scale=$_width:-1:flags=lanczos,palettegen $_palettegenFile
./ffmpeg -$6 -t $_time -i $_srcFile -i $_palettegenFile -filter_complex "fps=$_fps,scale=$_width:-1:flags=lanczos[x];[x][1:v]paletteuse" $_descFile
/home/web/tomcat-6.0.29/zhouletest/gifcreate.sh /home/web/tomcat-6.0.29/zhouletest/videos/6.mp4 /home/web/tomcat-6.0.29/zhouletest/gif_images/1469694815605_8898.gif 177 0 3 y 5 /home/web/tomcat-6.0.29/zhouletest/gif_images/palettegens/1469694815605_8898.png
String cmd1 = "/home/web/tomcat-6.0.29/zhouletest/gifcreate.sh "+srcFile+" "+descFile+" "+width+" "+start+" "+time+" "+(cover?"y":"n")+" "+fps+" "+palettegenFile;
Runtime r1 = Runtime.getRuntime();
final Process process1 = r1.exec(cmd1);
Thread thread1 = new Thread(new Runnable() {
public void run() {
try {
process1.waitFor();
} catch (Exception e) {
log.error("createScaleGifFromVideo thread error:", e);
}
}
});
thread1.start();
thread1.join(5000);//wait for the child thread up to 5 second
if(thread1.isAlive()){
process1.destroy();
log.error("createScaleGifFromVideo: gif create is not ended, because it's cost more then 5s.");
}
答案 2 :(得分:0)
当您使用单独的语言或系统生成ffmpeg
命令行调用时,如果您有最近的 ish ffmpeg(大于3.0),有时会发生这种情况)默认情况下应将palettegen
编译到其中。
在我的情况下,经过一整天的命令行试验后,结果发现我需要在我生成的CLI调用中转义,
,前面有一个\
。因此,ffmpeg无法正确读取参数,最后认为我要求使用'fps'作为过滤器,或类似的。
答案 3 :(得分:0)
我得到了复制cmd的这个cos,以某种方式在命令中加上了弯引号。邪恶!