我想有效地将tar中包含的几个jpeg图像.gz转换为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
有什么建议吗?
tar
有几个选项在这里可能有用(我有GNU tar
,所以我提前道歉假设你这样做,以防你真的没有):
-
--wildcards
- 允许您使用像*.jpeg
这样的 glob 来选择要从 tar 中提取的文件 -
--to-command
- 通过管道将每个提取的文件传送到给定的命令。
所以也许是这样的事情?
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
文件而不是.jpegs
和cat -n
而不是jpegtopnm
等对此进行了测试。另一件事是,我猜你想要单独的输出文件(每个 jpeg 一个),所以在我看来../xx.mp4
不会做......因此,假设您希望为每个文件单独调用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 -"