Кодирование X264 с использованием Opencv - PullRequest
2 голосов
/ 12 января 2011

Я работаю с камерой высокого разрешения: 4008x2672.Я пишу простую программу, которая берет кадр с камеры и отправляет кадр в файл AVI.Для работы с таким высоким разрешением я нашел только кодек x264, который мог бы справиться с этой задачей (предложения приветствуются).Я использую opencv для большинства вещей обработки изображений.Как уже упоминалось в этом посте http://doom10.org/index.php?topic=1019.0, я изменил члены AVCodecContext в соответствии с предустановками ffmpeg для libx264 (пришлось сделать это, чтобы избежать ошибки настроек по умолчанию в ffmpeg).Это вывод, который я получаю, когда пытаюсь запустить программу

libx264 @ 0x992d040]non-strictly-monotonic PTS 
1294846981.526675 1 0 //Timestamp camera_no frame_no
1294846981.621101 1 1
1294846981.715521 1 2
1294846981.809939 1 3
1294846981.904360 1 4
1294846981.998782 1 5
1294846982.093203 1 6
    Last message repeated 7 times
[avi @ 0x992beb0]st:0 error, non monotone timestamps 
-614891469123651720 >= -614891469123651720

 OpenCV Error: Unspecified error (Error while writing video frame) in
 icv_av_write_frame_FFMPEG, file 
/home/ajoshi/ext/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1034
terminate called after throwing an instance of 'cv::Exception'
 what():  /home/ajoshi/ext/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp:1034:
error: (-2) Error while writing video frame in function icv_av_write_frame_FFMPEG

Прервано

Изменения в AVCodecContext:

if(codec_id == CODEC_ID_H264)
{
    //fprintf(stderr, "Trying to parse a preset file for libx264\n");
    //Setting Values manually from medium preset
    c->me_method = 7;
    c->qcompress=0.6;
    c->qmin = 10;
    c->qmax = 51;
    c->max_qdiff = 4;
    c->i_quant_factor=0.71;
    c->max_b_frames=3;
    c->b_frame_strategy = 1;
    c->me_range = 16;<br>
    c->me_subpel_quality=7;
    c->coder_type = 1;
    c->scenechange_threshold=40;
    c->partitions = X264_PART_I8X8 | X264_PART_I4X4 | X264_PART_P8X8 | X264_PART_B8X8;
    c->flags = CODEC_FLAG_LOOP_FILTER;
    c->flags2 = CODEC_FLAG2_BPYRAMID | CODEC_FLAG2_MIXED_REFS | CODEC_FLAG2_WPRED | CODEC_FLAG2_8X8DCT | CODEC_FLAG2_FASTPSKIP;
    c->keyint_min = 25;
    c->refs = 3;
    c->trellis=1;
    c->directpred = 1;
    c->weighted_p_pred=2;
}

Возможно, я не устанавливаюзначения dts и pts, которые, как я полагал, ffmpeg должен установить для меня.

Любые предложения приветствуются.
Заранее спасибо

Ответы [ 3 ]

1 голос
/ 16 января 2011

Фактическая ошибка - «немонотонные временные метки».Кажется, вы неправильно инициализировали свойства видеокадра.Если это возможно, используйте libx264 напрямую.Это будет проще в обращении.

PS.Вы можете обойти проблему настройки ffmpeg x264, указав файл настроек 264 с опцией -fvpre.

1 голос
/ 16 января 2011

Я бы, вероятно, запустил исполняемый файл x264 в другом процессе и передал ему пиксели rgb или yuv.Затем вы можете использовать все обычные флаги x264 (или ffmpeg), и он обрабатывает многопоточность для вас.

И поскольку x264 лицензируется по лицензии GPL, это также дает вам больше свободы при лицензировании вашего приложения.

ps.Вот пример кода, использующего ffmpeg из Qt , вы можете игнорировать определенные биты Qt, но он дает хорошую отправную точку для использования ffmpeg из приложения c ++.

0 голосов
/ 14 ноября 2011

Значение pts AVFrame, которое вы отправляете в качестве последнего аргумента для avcodec_encode_video, должно быть установлено вами. Как только вы установите это, поле coded_from-> pts контекста кодека будет иметь правильное значение, которое вы можете av_rescale_q () и установить в AVPacket для вашего av_interleaved_write_frame ().

...