Кодирование avi без потерь в Linux

Я пытаюсь написать видео, используя opencv. Для меня важно сделать это именно -, поэтому это должен быть кодек без потерь. Я работаю с OpenCV 2.4.1 в Ubuntu 12.04

. Раньше я использовал код fourcc 0. Это дало мне точный результат, который я хотел, и я смог восстановить изображения идеально.

Я не уверен, что произошло, но после недавнего обновления (примерно 20 июля 2012 года )что-то пошло не так, и я больше не могу записывать файлы с этим кодом 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%)

Теперь я вижу, что когда я пишу с использованием кодека 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. Когда я пытаюсь открыть старые файлы с помощью видеозахвата, шаг открытия работает нормально, но попытка выполнить операцию чтения приводит к segfault. Кроме того, когда я пытаюсь писать с помощью:

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.

6
задан dlants 22 July 2012 в 07:33
поделиться