Untar之后的流链

时间:2012-12-09 18:41:07

标签: bash stream tar

我想将tar.gz中包含的几张jpeg图像高效转换为x264 mp4电影。

gzip -cd Monitor-1-xx.tar.gz|cpio -i --to-stdout|jpegtopnm|ppmtoy4m -F 4:1| \
>  x264 --crf 24 -o Monitor-1-xx.mp4 --stdin y4m -

这里的问题是,在cpio之后我在一个流中有多个jpg文件而jpegtopnm只转换第一个。

我想找到一个分割流的功能(或者让它预分割)。然后我想为每次拆分多次运行jpegtopnm。它有点像xargs在我首先解压到磁盘时所做的事情。写入磁盘是我想要避免的:

mkdir tmpMonitor && cd tmpMonitor && tar -xf ../Monitor-1-xx.tar.gz
find . -iname "*.jpg"|xargs -n1 jpegtopnm|ppmtoy4m -F 4:1| \
    x264 --crf 24 -o ../xx.mp4 --stdin y4m -
cd .. && rm -rf tmpMonitor

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

tar有两个选项可能在这里有用(我有GNU tar,所以我提前道歉,假如你实际上没有):

  1. --wildcards - 允许您使用像*.jpeg
  2. 这样的整体选择要从tar中提取的文件
  3. --to-command - 将每个提取的文件传递给给定的命令。
  4. 那么也许是这样的?

    tar -xzf Monitor-1-xx.tar.gz --wildcards '*.jpeg' \
        --to-command="jpegtopnm|ppmtoy4m -F 4:1| x264 --crf 24 -o ../xx.mp4 --stdin y4m -"
    

    我对x264了解不多,所以请考虑未经测试的代码。我使用简单的.txt文件代替.jpegscat -n代替jpegtopnm等来测试此内容。另一件事是,我猜你想要分开输出文件(每个jpeg一个),所以它看起来像我../xx.mp4不会...所以假设您希望每个文件的{strong>单独调用jpegtopnm|ppmtoy4m -F 4:1| x264 --crf 24 -o ../xx.mp4 --stdin y4m -然后你想要-o的不同输出文件名吗? - 在这种情况下,以下黑客可能会起作用:

    tar -xzf Monitor-1-xx.tar.gz --wildcards '*.jpeg' \
        --to-command="jpegtopnm|ppmtoy4m -F 4:1| x264 --crf 24 -o ../xx-`date +%H%M%S%N`.mp4 --stdin y4m -"