【发布时间】:2014-12-18 13:16:40
【问题描述】:
我为每种 Gstreamer 类型编写了 C++ 包装器。它们简单直观,所以我认为不需要在此处发布它们的实现(尽管如果需要,我可以发布它们(也许在 github 上))。
我面临的问题是我开始播放视频(并同时使用 gst tee 元素将其保存到文件中)......并且在播放时,我暂停(从不同的线程),这很好用.但是,当我想恢复它时,它不起作用:
void pause()
{
_pipeline.state(GST_STATE_PAUSED)
}
void resume()
{
_pipeline.state(GST_STATE_PLAYING);
}
这是我创建管道并将其状态设置为 GST_STATE_PLAYING 的 play() 函数。
int play(std::string const & source_path, std::string const & save_as_file)
{
gst::element source(source_path.substr(0,4) == "http" ? "souphttpsrc" : "filesrc", "media-source");
gst::element demuxer("decodebin", "decoder");
gst::element vconv("videoconvert", "vconverter");
gst::element vsink("autovideosink", "video-output");
gst::element aconv("audioconvert", "aconverter");
gst::element asink("autoaudiosink", "audio-output");
gst::element filesink("filesink", "file-sink");
gst::element fq("queue", "file-queqe");
gst::element tee("tee", "media-tee");
gst::element aq("queue", "audio-queue");
gst::element vq("queue", "video-queue");
source.set("location", source_path.c_str());
gst::bus bus = _pipeline.bus();
guint bus_watch_id = _session.add_watch(bus);
_pipeline.add(source, demuxer, vconv, vsink, aconv, asink, filesink, tee,fq, aq, vq);
gst::element::link(source, tee);
gst::element::link(vq, vconv, vsink);
gst::element::link(aq, aconv, asink);
gst::pad tee_src_pad = tee.request_pad("src_%u");
gst::pad demuxer_sink_pad = demuxer.static_pad("sink");
gst::pad::link(tee_src_pad, demuxer_sink_pad);
filesink.set("location", save_as_file.c_str());
gst::element::link(fq, filesink);
gst::pad tee_src_pad2 = tee.request_pad("src_%u");
gst::pad fq_pad = fq.static_pad ("sink");
gst::pad::link(tee_src_pad2, fq_pad);
gst::element::dynamic_link(demuxer, aq);
gst::element::dynamic_link(demuxer, vq);
g_print ("Now playing: %s\n", source_path.c_str());
_pipeline.state(GST_STATE_PLAYING);
//code
_session.run()
//cleanup
}
如果有人能帮我找出解决这个问题的方法,我将不胜感激。
我正在使用 Qt 小部件的句柄播放视频并将其传递给 gstreamer 视频叠加层。
【问题讨论】:
-
管道的实际状态是否变回正在播放?如果是这样,您可能需要重新显示叠加层。
-
你能在更简单的管道上测试你的暂停/恢复代码吗,比如没有 tee 的简单 videotestsrc?我对 GStreamer 的经验是,你的管道越复杂,像这样的简单命令就越不可能起作用。解释“暂停”应该在所有元素中做什么的方法太多了。例如mp4 多路复用器应如何处理暂停流上的时间戳?创建一个长时间运行的冻结帧,还是从用户离开的地方继续?那么如果你有 mp4 muxer 和 matroska muxer 实现不同的行为呢?那种东西。
-
@mpr: 哇...如果我删除 tee 元素(连同整个分支),那么暂停/恢复效果很好。我还注意到当我使用 tee 时,pause 确实会暂停播放,但它不会改变状态(状态保持在 *_PLAYING)
-
@BenjaminTrent:不,它不会改变任何状态。即使我暂停,它也不会将状态更改为 *_PAUSED。状态停留在 *_PLAYING。但是如果我删除 tee 元素,暂停/恢复效果很好(状态也会改变)。
-
您真的认为这可能是 Qt 问题吗?如果没有,请您删除Qt标签吗?让我担心的是,我在你的 sn-p 中没有看到一个
Q。
标签: c++ video media-player gstreamer