首页 文章

ffmpeg在linux中没有这样的过滤器:'palettegen'

提问于
浏览
2

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 回答

  • 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'
    
  • 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

  • 0

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

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

相关问题