我正在尝试使用 opencv 编写视频。准确地做到这一点对我来说很重要——所以它必须是一个无损编解码器。我在 Ubuntu 12.04 上使用 OpenCV 2.4.1
以前,我使用的是fourcc 代码0。这给了我想要的确切结果,并且我能够完美地恢复图像。
我不确定发生了什么,但在最近的一次更新中(2012 年 7 月 20 日左右),出了点问题,我不再能够用这个fourcc 代码编写文件。我真的不记得它是什么了,但它可能来自进行更新,从我的软件中心删除一些软件,以及我在一般清洁期间所做的一些其他事情......
当我使用 mediainfo (http://www.fourcc.org/identifier/) 检查旧文件时,我看到以下结果:
Complete name : oldsample.avi
Format : AVI
Format/Info : Audio Video Interleave
Format profile : OpenDML
File size : 1.07 GiB
Duration : 41s 467ms
Overall bit rate : 221 Mbps
Writing application : Lavf53.5.0
Video
ID : 0
Format : RGB
Codec ID : 0x00000000
Codec ID/Info : Basic Windows bitmap format. 1, 4 and 8 bpp versions are palettised. 16, 24 and 32bpp contain raw RGB samples
Duration : 41s 467ms
Bit rate : 221 Mbps
Width : 640 pixels
Height : 4294966 816 pixels
Display aspect ratio : 0.000
Frame rate : 30.000 fps
Bit depth : 8 bits
Stream size : 1.07 GiB (100%)
现在,我看到当我使用 0fourcc 编解码器编写时,程序实际上默认使用 i420 编解码器。这是我现在尝试编写的文件之一的输出:
Complete name : newsample.avi
Format : AVI
Format/Info : Audio Video Interleave
File size : 73.0 MiB
Duration : 5s 533ms
Overall bit rate : 111 Mbps
Writing application : Lavf54.6.100
Video
ID : 0
Format : YUV
Codec ID : I420
Codec ID/Info : 8 bit Y plane followed by 8 bit 2x2 subsampled U and V planes.
Duration : 5s 533ms
Bit rate : 111 Mbps
Width : 640 pixels
Height : 480 pixels
Display aspect ratio : 4:3
Frame rate : 30.000 fps
Compression mode : Lossless
Bits/(Pixel*Frame) : 12.000
Stream size : 72.9 MiB (100%)
这种格式和我尝试使用的其他格式(如 huffyuv HFYU)对我不起作用,因为我最终会得到这样的效果http://imgur.com/a/0OC4y - 你会看到明亮的伪影由于在 HFYU 的情况下,我假设是有损压缩或色度子采样,这应该是无损的。您正在查看的是我的一个视频中的红色通道。当您同时查看所有 3 个通道时,感知效果可以忽略不计,但我必须准确地重建图像。
此外,虽然我可以在 vlc 等媒体播放器中播放我的旧文件,但我突然发现它们与 opencv 完全不兼容。当我尝试使用视频捕获打开旧文件时,打开步骤工作正常,但尝试执行读取操作会导致段错误。此外,当我尝试使用以下任一方式编写时:
CV_FOURCC(0,0,0,0)
0
出于某种原因,Opencv 默认为 I420。
接下来,我尝试使用一些替代编解码器。“DIB”似乎对我有用,在 opencv 网站 (http://opencv.willowgarage.com/wiki/VideoCodecs) 上,它被列为“推荐”编解码器。但是,尝试使用它会导致以下消息:
OpenCV-2.4.1/modules/highgui/src/cap_gstreamer.cpp:483: error: (-210) Gstreamer Opencv backend doesn't support this codec acutally. in function CvVideoWriter_GStreamer::open
Aborted (core dumped)
我检查了这个编解码器的 opencv 源代码,偶然发现了以下内容:
cd OpenCV-2.4.1/modules
grep -i -r "CV_FOURCC" ./*
...
./highgui/src/cap_qt.cpp: /*if( fourcc == CV_FOURCC( 'D', 'I', 'B', ' ' ))
./highgui/include/opencv2/highgui/highgui_c.h:#define CV_FOURCC_DEFAULT CV_FOURCC('I', 'Y', 'U', 'V') /* Use default codec for specified filename (Linux only) */
我尝试安装 qt4 并使用 WITH_QT 标志重新配置,但这并没有改变任何东西。我也尝试取消注释那部分代码并重新安装opencv,但这也不起作用。
我的最终目标是以任何方式有效地存储和检索每个像素为 16 位的视频流(如 32float 可以正常工作,然后它不需要完美)。现在我正在将 16 位解压缩到红色和绿色通道中,这就是为什么我需要它是完美的 - 因为红色通道中的 1 错误在最终结果中乘以 256。我没有任何可用的fourcc代码成功。