过去两周,我试图找到一种正确的方法来读取.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视频文件。