4

我想编写一个脚本,该脚本将根据一组图像文件路径的输入生成延时视频。我知道您可以执行以下操作:

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

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

4

3 回答 3

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
    
于 2014-10-23T08:26:09.973 回答
0

我最终通过管道 ls 创建链接,然后渲染链接。

x=0; for i in $(ls -t *JPG); do counter=$(printf %05d $x); ln -s "$i" "$counter".jpg; x=$(($x+1)); done
于 2013-02-13T20:34:10.067 回答
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
于 2018-06-02T22:54:56.433 回答