Linux上无损avi编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux上无损avi编码相关的知识,希望对你有一定的参考价值。

我正在尝试使用opencv编写视频。对我来说这很重要 - 因此它必须是一个无损编解码器。我在Ubuntu 12.04上使用OpenCV 2.4.1

以前,我使用的是fourcc代码0.这给了我想要的确切结果,并且我能够完美地恢复图像。

我不确定发生了什么,但截至最近的更新(2012年7月20日左右),出现了问题,我无法再使用这个4cc代码编写文件了。我真的不记得它是什么,但它可能来自更新,从我的软件中心删除一些软件,以及我在一般清洁期间做的其他一些事情......

当我使用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%)

现在,我看到当我使用0 fourcc编解码器编写时,程序实际默认为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。我没有成功使用任何可用的四分之一代码。

答案

很可能是您卸载或更新了编解码器。尝试安装新的编解码器包,或更新您的ffmpeg或gstreamer

另一答案

我不久前结束了这个问题,终于有机会为大家写下来了。你可以在这里看到我的(相当hacky)解决方案:

http://denislantsman.com/?p=111


编辑:随着网站的关闭,以下总结了什么可以是found from the Wayback Machine

  • 将帧保存为单个PNG图像
  • 运行ffmpeg以生成可由OpenCV打开的文件: ffmpeg -i ./outimg/depth%d.png -vcodec png depth.mov
  • 以下Python代码段可用于保存单个框架 std::ostringstream out_depth; ... expand_depth(playback.pDepthMap, expanded_depth, playback.rows, playback.cols); out_depth << root << "/outimg/depth" << framecount << ".png"; cv::imwrite(out_depth.str(), expanded_depth); framecount++; ...

以上是关于Linux上无损avi编码的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看一个视频文件的编码方式?

无损压缩算法历史

使用libjpeg进行图片压缩(哈夫曼算法,无损压缩)

在 iPhone 上录制“Apple 无损”音频

视频相关格式笔记

音频压缩编码技术—无损压缩霍夫曼