使用OpenCV进行X264编码

3
我正在使用一台高分辨率相机:4008x2672。我正在编写一个简单的程序,从相机中获取帧并将其发送到avi文件。为了处理这样高的分辨率,我发现只有x264编解码器可以胜任(欢迎提供建议)。我大部分使用opencv来处理图像。正如在此帖子http://doom10.org/index.php?topic=1019.0中所述,我根据ffmpeg预设的libx264进行了AVCodecContext成员的修改(必须这样做以避免损坏的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个回答

2
我会考虑在另一个进程中运行x264可执行文件,并将rgb或yuv像素传输到它。然后,您可以使用所有常规的x264(或ffmpeg)标志,并且它会为您处理多线程。而且,由于x264具有GPL许可证,因此它还为您提供了更多关于应用程序许可的自由。
附:这里有一些使用Qt中的ffmpeg的示例代码,您可以忽略特定于Qt的部分,但它为从C ++应用程序中使用ffmpeg提供了一个良好的起点。

1

实际错误是“非单调时间戳”。看起来您没有正确初始化视频帧属性。如果可能,请直接使用libx264。这样更容易处理。

PS. 您可以通过使用-fvpre选项指定264预设文件来解决ffmpeg x264设置问题。


0
你发送到 avcodec_encode_video 的 AVFrame 的 pts 值需要由你设置。一旦你设置了这个值,编解码器上下文的 coded_from->pts 字段将具有正确的值,你可以使用 av_rescale_q() 对其进行缩放,并在 AVPacket 中进行设置以供 av_interleaved_write_frame() 使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接