将多个JPEG合并为一个JXL动画



使用ffmpeg,我可以将多个JPEG混合到M-JPEG容器中,而不会有任何损失,因为它只是一个普通的比特流副本:

ffmpeg -framerate 30 -i input%03d.jpg -codec copy output.mjpeg

最近linux发行版开始提供JPEG-XL命令行工具。我现在可以重新编码(无损再压缩)JPEG到JXL:

% file input.jpg
input.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 1016x708, components 3
% cjxl input.jpg output.jxl
% djxl output.jxl output.jpg
% md5sum input.jpg output.jpg
bea9e9c74e3580f6196ba9ac21509652  input.jpg
bea9e9c74e3580f6196ba9ac21509652  output.jpg

然而,我不明白如何创建一个JXL动画(多于一个JPEG) ?

,

% ffmpeg -framerate 30 -i input%03d.jpg -codec copy output.jxl
[...]
[image2 @ 0x55c22e680040] The specified filename 'output.jxl' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0x55c22e680040] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
[image2 @ 0x55c22e680040] Cannot write more than one file with the same name. Are you missing the -update option or a sequence pattern?
av_interleaved_write_frame(): Invalid argument
frame=    2 fps=0.0 q=-1.0 Lsize=N/A time=00:00:00.06 bitrate=N/A speed= 223x
video:224kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!

或:

% cjxl input*.jpg output.jxl
Unknown argument: input002.jpg
Use 'cjxl -h' for more information

简短的回答:我还没有在现有的工具中公开这样做的能力,但是代码库代码本身看起来很有希望(但需要制作自定义实用程序或可能对jcxl实用程序进行重要的添加)。

我会考虑就此打开一个特性请求/问题。


在为cjxl编写jxl参考实现时,实际工作从入口点EncodeImageJXL(params, ppf, jpeg_bytes, &compressed);开始其中jpeg_bytes是可选的(可能是nullptr,并且只代表一个图像),否则图像数据(可能包含多个帧)是ppf的一部分。

在一些初始设置之后,这个函数根据这个可选的jpeg_bytes分割逻辑,它将使用它将直接通过JxlEncoderAddJPEGFrame使用提供的单个jpeg字节,或者循环ppf.frames中的每一帧并调用JxlEncoderAddImageFrame为每一帧解压的像素数据

这些代码路径之间也有相当多的设置和设置不同,我很难区分哪些是与动画相关的,哪些是完全压缩的结果,而不是仅仅重新压缩jpeg数据。

不幸的是,目前没有办法使用cjxl甚至为cjxl选择多个输入文件,我不认为ffmpeg暴露了一种选择必要的JxlEncoderAddJPEGFrame编码的方法。但是代码确实向我建议,应该可以通过从每个代码路径中挑选出必要的设置并为每个jpeg文件数据调用JxlEncoderAddJPEGFrame。也许这可以成为cjxl的一部分;大部分的工作将是使它安全(检查所有的图像是jpeg,检查类似的大小,添加帧率选项等)。

我可能在jxl字节流中缺少一些基本的限制,这意味着不支持这种类型的无损再压缩,但是看到没有任何相互预测,我希望这是支持的。

最新更新