ffmpeg没有这样的过滤器:linux

时间:2016-07-28 12:22:42

标签: linux ffmpeg

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'
初始化复杂滤镜时出错。
无效   论点

4 个答案:

答案 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来调用它,它运行良好。

这是myshell

#/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

这是我在shell中的调用方法

/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

这是我在java

中的调用方法
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.");
    }

参考

https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality?answertab=votes#tab-top

答案 2 :(得分:0)

当您使用单独的语言或系统生成ffmpeg命令行调用时,如果您有最近的 ish ffmpeg(大于3.0),有时会发生这种情况)默认情况下应将palettegen编译到其中。

在我的情况下,经过一整天的命令行试验后,结果发现我需要在我生成的CLI调用中转义,,前面有一个\ 。因此,ffmpeg无法正确读取参数,最后认为我要求使用'fps'作为过滤器,或类似的。

答案 3 :(得分:0)

我得到了复制cmd的这个cos,以某种方式在命令中加上了弯引号。邪恶!