2

我正在使用高分辨率相机:4008x2672。我编写了一个简单的程序,它从相机中抓取帧并将帧发送到 avi 文件。为了使用如此高分辨率,我发现只有 x264 编解码器可以解决问题(欢迎提出建议)。我将 opencv 用于大多数图像处理的东西。正如这篇文章http://doom10.org/index.php?topic=1019.0中提到的,我根据 libx264 的 ffmpeg 预设修改了 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;
}

我可能没有设置我认为 ffmpeg 应该为我设置的 dts 和 pts 值。

欢迎任何建议。
提前致谢

4

3 回答 3

1

我可能会在另一个进程中运行 x264 可执行文件并将 rgb 或 yuv 像素通过管道传输到它。然后您可以使用所有普通的 x264(或 ffmpeg)标志,它会为您处理多线程。

由于 x264 是 GPL 许可的,它还为您在许可应用程序时提供了更多自由。

附言。这是一些使用来自 Qt 的 ffmpeg 的示例代码,您可以忽略 Qt 特定的位,但它为在 c++ 应用程序中使用 ffmpeg 提供了一个很好的起点。

于 2011-01-15T21:10:05.773 回答
1

实际错误是“非单调时间戳”。我似乎没有正确初始化视频帧属性。如果可能的话,直接使用 libx264。会更容易处理。

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

于 2011-01-16T01:21:38.013 回答
0

您作为 avcodec_encode_video 的最后一个参数发送的 AVFrame 的 pts 值需要由您设置。一旦你设置了这个,编解码器上下文的 coded_from->pts 字段将具有正确的值,你可以 av_rescale_q() 并在 AVPacket 中为你的 av_interleaved_write_frame() 设置。

于 2011-11-14T16:44:53.253 回答