avconv - 传递图像路径列表

4
我希望编写一个脚本,基于一组图像文件路径生成时间轴视频。我知道你可以执行类似这样的操作:
avconv -r 15 -i %04d.JPG -s hd480 -vcodec libx264 time-lapse.mp4

那将根据文件名模式0000.JPG,0001.JPG等在目录中查找文件。但是,我正在尝试弄清楚是否有一种方法可以按照我想要的顺序传递文件名列表进行处理?我的理想情况是,我可以执行一些DB查询以按时间顺序检索图像文件路径列表,然后将它们传递到avconv命令中,并让其即时生成视频。我有一个特定的图像文件夹结构,因此理想情况下,我不希望必须将必要的文件复制到临时目录中以便能够正确命名并处理它们。
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
    

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

0

我最终使用管道将ls命令输出链接,然后渲染这些链接。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接