如何使用gstreamer 1.0从.mts视频文件中读取帧并通过OpenCV处理它

时间:2013-10-13 08:49:43

标签: opencv gstreamer

过去两周,我试图找到一种正确的方法来读取.mts视频文件中的帧并在OpenCV中处理它们。当.mts文件采用25p(25 fps逐行扫描)格式时,OpenCV的VideoCapture可以很好地用于搜索视频帧,但是当它处于50i(25 fps隔行扫描)格式时,OpenCV的VideoCapture无法逐帧正确解码。 (例如,在我获得帧#1然后读取帧#300并且稍后读取帧#1的示例场景中,它返回与我之前读取的帧#1不同的损坏图像)(我正在使用OpenCV 2.4.6)< / p>

我决定替换该程序的视频解码器部分。

我尝试了FFmpegSource2但是没有解决正确寻找.mts帧的问题(大部分时间FFMS_GetFrame函数为50i .mts文件的几个连续帧返回相同的输出)。

我也试过DirectShow。但是对于TIME_FORMAT_FRAME的IMediaSeeking的IsFormatSupported方法不会返回50i .mts视频文件的S_OK,并且它仅支持此类视频文件的TIME_FORMAT_MEDIA_TIME。我没有试过自己,但朋友说即使使用TIME_FORMAT_MEDIA_TIME进行帧搜索也会产生与上述相同的问题,我可能无法跳回到各个帧并读取他们的数据。

现在我要尝试gstreamer。我在以下链接中找到了用于链接gstreamer和openCV的示例方法: Adding opencv processing to gstreamer application

当我尝试在gstreamer 1.0中编译它时,我收到以下错误:

错误C3861:'gst_app_sink_pull_buffer':找不到标识符

我已经包含了gst / gst.h,gst / app / gstappsink.h,gst / app / gstappsrc.h

查看以下帮助链接,那里也没有gst_app_sink_pull_buffer功能。 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-appsink.html

我正在使用gstreamer.freedesktop.org的gstreamer 1.0(v1.2.0)

可能来自www.gstreamer.com的gstreamer SDK(基于gstreamer 0.1)为此工作,但我还没有尝试过,而是更喜欢使用gstreamer.freedesktop.org中的gstreamer

我不知道gst_app_sink_pull_buffer的定义位置。有人知道如何编译为gstreamer 0.1 in提供的样本方法 Adding opencv processing to gstreamer application对于gstreamer 1.0?

提前谢谢。

更新1:我是gstreamer的新手。现在我知道必须将Adding opencv processing to gstreamer application的样本方法从gstreamer 0.1移植到gstreamer 1.0。我用gst_app_sink_pull_sample和gst_sample_get_buffer替换了gst_app_sink_pull_buffer函数。必须在代码的其他部分上工作更多,看看是否可以从50i .mts视频文件中打开所需的帧并使用OpenCV进行处理。

更新2:我找到了一个非常好的例子 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-data-spoof.html#section-spoof-appsink 我轻松地将使用GTk保存快照的部分替换为将帧数据缓冲区加载到OpenCV Mat的功能。这个程序适用于许多视频文件类型,我可以在OpenCV Mat中抓取视频文件的帧。但是当输入视频文件是50i .mts视频文件时,它会返回以下错误,我无法读取帧数据:

     No accelerated IMDCT transform found
     0:00:00.405110839  4632   0B775380 ERROR                  libav :0:: get_buffer() failed (-1 2 00000000)
     0:00:00.405740899  4632   0B775380 ERROR                  libav :0:: decode_slice_header error
     0:00:00.406401077  4632   0B7756A0 ERROR                  libav :0:: Missing reference picture
     0:00:00.406705867  4632   0B7756A0 ERROR                  libav :0:: Missing reference picture
     0:00:00.416044436  4632   0B7759C0 ERROR                  libav :0:: Cannot combine reference and non-reference fields in the same frame
     0:00:00.416813339  4632   0B7759C0 ERROR                  libav :0:: decode_slice_header error
     0:00:00.417725301  4632   0B775CE0 ERROR                  libav :0:: Missing reference picture

逐步调试显示运行

后出现“未找到加速的IMDCT转换”
    ret = gst_element_get_state( pipeline, NULL, NULL, 5 * GST_SECOND );

和谷歌搜索显示我可以忽略它作为警告。

所有其他错误在运行

后立即出现
     g_signal_emit_by_name( sink, "pull-preroll", &sample, NULL );

我不知道如何解决这个问题?我已经在另一个使用playbin和gstreamer的例子中播放了这个.mts文件,当我使用playbin时,可以很好地播放这个.mts视频文件。

0 个答案:

没有答案