使用无损视频编解码器归档(单色)科学视频数据


9

基本问题: 什么是适合以无损方式存储/存档科学视频数据的编解码器

我正在尝试帮助我的研究小组存储/存档用显微镜记录的一些视频。这些(灰度)视频采用未压缩(原始视频)的BGR24格式,分辨率为660x492 @ 61fps,通常约为1分钟。这些文件的巨大容量(每个千兆字节)使我的实验室伙伴发疯。我建议使用无损编解码器压缩它们。(这里需要无损是因为视频是科学数据;因此,有损编解码器可能会以不良/意想不到的方式更改内容。)

这是我尝试过的。首先,我抓住了其中一个视频的前10秒,并使用FFMpeg将其转换为单色(原始)格式。

ffmpeg -t 10 -i RecordedData.avi -c:v rawvideo -pix_fmt gray raw_gray.mkv

然后,我尝试使用libx264的无损模式(通过设置-crf 0)来压缩生成的文件

ffmpeg -i raw-gray.mkv -c:v libx264 -crf 0 -pix_fmt yuv420p -color_range pc x264-yuv420p.mkv

最后,我从原始和h264 MKV文件中提取了原始YUV数据,并进行了比较。

ffmpeg -i raw-gray.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
ffmpeg -i x264-yuv420p.mkv -c:v rawvideo -pix_fmt gray x264-decompressed.yuv
diff -sq raw-gray.yuv x264-decompressed.yuv

在这里,diff命令报告文件在我期望它们相同时有所不同。为什么是这样?这仅仅是一些轻微的舍入错误,还是在执行H264(据说无损)压缩后可能会丢失一些内容?发生了像素格式的某种转换(gray (YUV400) <-> YUV420),但是彩色(UV)通道应该只是空的,因为输入是单色的。

如果确实丢失了某些东西,是否有什么办法可以解决?是否有另一个(无损)编解码器可能更适合我的数据?


更新1:我使用hexdump更详细地比较了raw-gray.yuv(从未压缩)和x264-decompressed.yuv(压缩后再解压缩)未压缩YUV数据的内容。这是前几个字节。

[raw-gray.yuv]

00000000  4e 50 51 53 53 52 51 50  51 51 50 4f 50 50 50 50
00000010  51 51 50 51 52 53 51 51  52 52 53 53 52 51 51 53
00000020  51 53 54 55 53 51 52 54  53 53 52 50 51 50 52 52
00000030  51 52 51 51 51 52 54 52  52 52 51 51 51 53 57 58
00000040  57 57 55 54 54 52 53 51  51 52 53 55 55 54 53 53
00000050  51 51 52 52 53 52 51 50  50 50 50 51 51 4f 4f 4e
00000060  4c 4d 4e 4d 4f 50 4f 50  51 51 51 52 52 52 52 50
00000070  50 50 52 52 53 55 55 55  57 52 53 53 53 54 56 56

[x264-decompressed.yuv]

00000000  53 55 56 57 57 56 56 55  56 56 55 54 55 55 55 55
00000010  56 56 55 56 56 57 56 56  56 56 57 57 56 56 56 57
00000020  56 57 58 59 57 56 56 58  57 57 56 55 56 55 56 56
00000030  56 56 56 56 56 56 58 56  56 56 56 56 56 57 5b 5c
00000040  5b 5b 59 58 58 56 57 56  56 56 57 59 59 58 57 57
00000050  56 56 56 56 57 56 56 55  55 55 55 56 56 54 54 53
00000060  51 52 53 52 54 55 54 55  56 56 56 56 56 56 56 55
00000070  55 55 56 56 57 59 59 59  5b 56 57 57 57 58 5a 5a

前一个文件中的值比后者中的值小4到5。可以发现该文件更深一些。


更新2:如果我在RGB模式下使用libx264,则除了执行以下操作外,还可以通过与上面相同的操作来与原始文件完全匹配。

ffmpeg -i raw-gray.mkv -c:v libx264rgb -crf 0 -pix_fmt bgr24 x264-bgr24.mkv
ffmpeg -i x264-bgr24.mkv -c:v rawvideo -pix_fmt gray x264-bgr24-decomp.yuv
diff -sq raw-gray.yuv x264-bgr24-decomp.yuv

最后一条命令报告两个文件相同。不幸的是,x264-bgr24.mkv它大约是的3倍x264-yuv420.mkv,因此RGB模式下的压缩效果不佳。

我读到某个地方,libx264在YUV模式下有效地压缩了灰度视频,因为它吸收了以下事实:只有Y通道包含任何实际信息(对于单色视频,U和V通道均为零)。在RGB模式下,我相信所有通道都将包含用于单色输入的相同信息。也许libx264rgb没有利用这一点。

那么,由于这种压缩方式效率更高有没有办法让我使用YUV模式而不更改视频?


更新3:我能够通过使用-pix_fmt yuvj420p代替来解决libx264的问题-pix_fmt yuv420p -color_range pc。然后,我恰好在压缩/解压缩后重现原始文件。从FFmpeg文档中,我给人的印象是这两套标志是等效的,但是事实显然并非如此。唯一的问题是,我收到后一组标志的警告:[swscaler @ 0x55b56347fe20] deprecated pixel format used, make sure you set the range correctly。另外,我发现此错误报告可能与我的问题有关。我不确定在不使用明显不赞成使用的yuvj420p像素格式的情况下“正确”的处理方法。


1
由于数据已解压缩,因此最好将它们都转换为文本格式(例如使用hexdump)并在其上运行diff。diff将简单地说,该文件是某个地方不同。一比特,一兆字节,都是一样的。通过检查十六进制差异,您可以更好地估计发生了什么以及是否有任何担心。另外,请检查该操作是否没有使视频的宽度或高度变圆(我遇到了这种情况)。
LSerni'9

1
一个可能的中断源可能是不同的Y通道钳位(根据CCIR-601)。检查是否有机会失去Y值低于16且高于240的Y值。另请参见video.stackexchange.com/questions/16840/…–
LSerni

1
您还可以使用ffmpeg将两个视频重新分解为单个图像,并使用imagemagickcompare进行比较。
xenoid

1
比较无损的一个好方法是使用哈希复用器。显示的完整输出ffmpeg -i RecordedData.avi。libx264rgb支持bgr24,因此您可以考虑使用编码器。
llogan's

1
只需使用x264的RGB模式对它们进行无损编码(跳过像素格式转换)。
Gyan

Answers:


6

这不是您实际问题的直接答案,但是我会考虑使用FFmpeg内部FFV1编解码器:

$ ffmpeg -i raw-gray.mkv -c:v ffv1 ffv1.mkv

或者,它的版本3:

$ ffmpeg -i raw-gray.mkv -c:v ffv1 -level 3 ffv1.mkv

然后:

$ ffmpeg -i ffv1.mkv -c:v rawvideo -pix_fmt gray raw-gray.yuv
$ diff -sq raw-ffv1.yuv raw-gray.yuv
Files raw-ffv1.yuv and raw-gray.yuv are identical

使用时,它的效率不如无损模式下的libx264 yuv420p,但比使用libx264的效率更高bgr24(在我的测试中,数据速率介于两者之间)。一些机构,例如国会图书馆,也认为FFV1是合适的保存格式


不过,这是我最初的基本问题的答案,我对其进行了编辑以使其更加清晰。FFV1没有遇到任何问题。实际上,-crf 0 -preset medium对于我的特定视频,FFV1达到了与libx264(w / )相同的压缩率,并且速度更快。更好的是,它直接支持gray像素格式。确实,这似乎是一个很好的解决方案。
尼克C.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.