Ошибка ошибки сегментации при попытке сравнить два видео с библиотекой pHash и ее привязками ruby

0

Я создал свою систему с последними библиотеками ffmpeg и pHash (ffmpeg-2.2.1 и pHash-0.9.6), а также с рубиновым камнем pHash (https://github.com/toy/pHash).

Я использую ruby и пытаюсь сравнить два видеофайла следующим образом:

require 'phash/video'

video1 = Phash::Video.new('video1.mp4')
video2 = Phash::Video.new('video2.mp4')

video1 % video2

Выполнение этого скрипта приводит к ошибке Сегментация:

..../gems/pHash-1.1.4/lib/phash/video.rb:20: [BUG] Segmentation fault
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-darwin13.1.0]

-- Control frame information -----------------------------------------------
c:0008 p:---- s:0029 b:0029 l:000028 d:000028 CFUNC  :ph_dct_videohash
c:0007 p:0042 s:0024 b:0024 l:000023 d:000023 METHOD .../gems/pHash-1.1.4/lib/phash/video.rb:20
c:0006 p:0038 s:0017 b:0017 l:000016 d:000016 METHOD .../gems/pHash-1.1.4/lib/phash.rb:43
c:0005 p:0025 s:0014 b:0014 l:000013 d:000013 METHOD .../gems/pHash-1.1.4/lib/phash.rb:39
c:0004 p:0011 s:0011 b:0011 l:000010 d:000010 METHOD .../gems/pHash-1.1.4/lib/phash.rb:48
c:0003 p:0050 s:0006 b:0006 l:000128 d:0011b8 EVAL   video_test_phash.rb:3
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:000128 d:000128 TOP   

-- Ruby level backtrace information ----------------------------------------
video_test_phash.rb:3:in '<main>'
.../gems/pHash-1.1.4/lib/phash.rb:48:in 'similarity'
.../gems/pHash-1.1.4/lib/phash.rb:39:in 'phash'
.../gems/pHash-1.1.4/lib/phash.rb:43:in 'compute_phash'
.../gems/pHash-1.1.4/lib/phash/video.rb:20:in 'video_hash'
.../gems/pHash-1.1.4/lib/phash/video.rb:20:in 'ph_dct_videohash'

...

Abort trap: 6

Похоже, что авария происходит в функции ph_dct_videohash, которая является частью библиотеки pHash. Функция находится в файле pHash.cpp. Я копирую его здесь, если это имеет смысл для кого-то:

ulong64* ph_dct_videohash(const char *filename, int &Length){

    CImgList<uint8_t> *keyframes = ph_getKeyFramesFromVideo(filename);
    if (keyframes == NULL)
    return NULL;

    Length = keyframes->size();

    ulong64 *hash = (ulong64*)malloc(sizeof(ulong64)*Length);
    CImg<float> *C = ph_dct_matrix(32);
    CImg<float> Ctransp = C->get_transpose();
    CImg<float> dctImage;
    CImg<float> subsec;
    CImg<uint8_t> currentframe;

    for (unsigned int i=0;i < keyframes->size(); i++){
    currentframe = keyframes->at(i);
    currentframe.blur(1.0);
    dctImage = (*C)*(currentframe)*Ctransp;
    subsec = dctImage.crop(1,1,8,8).unroll('x');
    float med = subsec.median();
    hash[i] =     0x0000000000000000;
    ulong64 one = 0x0000000000000001;
    for (int j=0;j<64;j++){
        if (subsec(j) > med)
        hash[i] |= one;
        one = one << 1;
    }
    }

    keyframes->clear();
    delete keyframes;
    keyframes = NULL;
    delete C;
    C = NULL;
    return hash;
}

Любая помощь очень ценится!

  • 0
    FFMPEG воспроизводит отдельные видео правильно?
  • 0
    Да, я могу использовать FFPLAY для успешного воспроизведения видео, и я также могу использовать FFMPEG для перекодирования видео в различные форматы без проблем.
Теги:
ffmpeg
segmentation-fault
phash

1 ответ

1

В последних версиях ffmpeg некоторые функции (например, "avformat_open_input" в этом случае) segfault при задании неинициализированного указателя. Кто-то из списка рассылки поддержки pHash показал, как изменить источник pHash, чтобы инициализировать указатели и предотвратить segfaults.

Чтобы исправить ошибки сегментации, строки 365 и 411 в pHash-0.9.6/src/cimgffmpeg.cpp должны быть изменены из AVFormatContext *pFormatCtx; в AVFormatContext *pFormatCtx = NULL; , а затем исходный код должен быть перекомпилирован и установлен.

Обратите внимание, что по-прежнему возникают некоторые проблемы с видео хешами: например, многие (non-.mp4) видеоформаты не поддерживаются и вызывают сбои сегментации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню