avconv - 传递图像路径列表

时间:2013-01-01 15:14:56

标签: ubuntu libavcodec

我想编写一个脚本,根据图像文件路径的设置输入生成间隔拍摄视频。我知道你可以执行这样的事情:

avconv -r 15 -i %04d.JPG -s hd480 -vcodec libx264 time-lapse.mp4

这将根据文件名模式0000.JPG,0001.JPG等查找目录中的文件。但是,我试图弄清楚是否有一种方法可以在文件名列表中传递它按照我要处理的顺序?我理想的情况是我可以执行一些数据库查询以按时间顺序检索图像文件路径列表,然后将它们传递给avconv命令并让它动态生成视频。我的图像有一个特定的文件夹结构,所以理想情况下我不想将必要的文件复制到临时目录中,以便能够正确命名它们然后处理它们。

3 个答案:

答案 0 :(得分:1)

这也是我使用它的唯一方法(image2pipe技巧对我不起作用)。

  1. 制作一个只包含电影中所需图像的文件夹。

  2. 重命名文件(确保在出现错误之前备份您的图片)

    aa=0;for i in `ls`; do mv $i `printf "%04d" $aa`.png; aa=$(($aa+1));done
    
  3. 运行avconv

    avconv -f image2 -i %04d.png -b 2500k -codec mpeg4 Heligyro.avi
    

答案 1 :(得分:0)

我最终选择了ls来创建链接,然后渲染链接。

x=0; for i in $(ls -t *JPG); do counter=$(printf %05d $x); ln -s "$i" "$counter".jpg; x=$(($x+1)); done

答案 2 :(得分:0)

我根据安全摄像头拍摄的图像进行时间推移视频。相机按日期将JPG分类到文件夹中,然后按小时分类到子文件夹中。

这会变平,重命名并将结果推送到avconv。

#!/bin/bash

SOURCE_DIR="/home/ftp/camera/$1"
TIMELAPSE_DIR="/home/ftp/camera/timelapse-batch"
FRAME_DELAY=50

ls -1 $SOURCE_DIR |

        while read DAY;
        do
                echo "=================================================================";
                echo "| >>> Processing $SOURCE_DIR/$DAY";

                cd $SOURCE_DIR/$DAY;

                echo "| >>> Flattening...";

                find $SOURCE_DIR/$DAY -mindepth 2 -type f -exec mv -t $SOURCE_DIR/$DAY -i '{}' +

                echo "| >>> Frame Count: $(ls -1 | wc -l)";

                echo "| >>> Converting...";

                echo "-----------------------------------------------------------------";

                #gets list of images, renames them to a format that avconv expects, then runs avconv
                ls |
                        grep jpg |
                        awk -v name=$1 'BEGIN{a=0}{printf "mv %s " name "%04d.JPG\n" , $0, a++}' |
                        bash && avconv -y -r $FRAME_DELAY -i $1%4d.JPG -r $FRAME_DELAY -vcodec libx264 -q:v 4  -vf scale=iw:ih $TIMELAPSE_DIR/$DAY"_"$1.mp4;

                echo "-----------------------------------------------------------------";
                echo "| >>> Done!";
                echo "=================================================================";
                echo -e "\n\n\n\n";

        done