首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用gstreamer暂停后恢复播放?

如何在使用gstreamer暂停后恢复播放?
EN

Stack Overflow用户
提问于 2014-12-18 13:16:40
回答 2查看 8.5K关注 0票数 2

我为每种Gstreamer类型编写了C++包装器。它们既简单又直观,所以我不认为它们的实现需要在这里发布(如果需要的话,我可以在github上发布)。

我面临的问题是,我开始播放一个视频(同时使用gst元素将它保存到一个文件中)....and,当它播放时,我暂停(从不同的线程),这是很好的工作。然而,当我想要继续它时,它不起作用:

代码语言:javascript
复制
void pause()
{
    _pipeline.state(GST_STATE_PAUSED)
}

void resume()
{
    _pipeline.state(GST_STATE_PLAYING);
}

下面是play()函数,我在这里创建管道并将其状态设置为GST_STATE_PLAYING。

代码语言:javascript
复制
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视频覆盖层。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-19 16:50:39

在每个分支上都有队列元素吗?一个用于文件,另一个用于解码?您还可以尝试在文件墨迹上乱动"sync“属性。也许这是真的。

Nawaz编辑。

由于这个答案最初给了我几个方向,而且几乎是一个接近解的方向,所以它应该得到我为这个问题所设置的赏赐。但在此之前,这是解决办法(解释在我的答案-纳瓦兹)。

代码语言:javascript
复制
gst::element filesink("filesink", "file-sink");
filesink.set("async", gboolean(FALSE));

希望这对其他人也有帮助。

票数 5
EN

Stack Overflow用户

发布于 2014-12-27 17:30:22

我自己找到了答案。我试图将所有元素的状态打印为:

代码语言:javascript
复制
void print_status_of_all()
{
    auto it  = gst_bin_iterate_elements(GST_BIN(_pipeline.raw()));
    GValue value = G_VALUE_INIT;
    for(GstIteratorResult r = gst_iterator_next(it, &value); r != GST_ITERATOR_DONE; r = gst_iterator_next(it, &value))
    {
         if ( r == GST_ITERATOR_OK )
         {
             GstElement *e = static_cast<GstElement*>(g_value_peek_pointer(&value));
             GstState  current, pending;
             auto ret = gst_element_get_state(e, &current, &pending, 100000);
             g_print("%s(%s), status = %s, pending = %s\n", G_VALUE_TYPE_NAME(&value), gst_element_get_name(e), gst_element_state_get_name(current), gst_element_state_get_name(pending));
         }
    }
}

然后,它帮助我了解到,所有元素的状态都在从播放变为暂停和暂停,没有任何挂起的状态,除外,除了 filesink元素,它的状态仍然处于播放状态,以及一个挂起的暂停状态(这是因为它试图异步地更改它)--这最终导致我看到了GstBaseSinkasync属性,它是filesink的基类。我只是将其设置为FALSE

代码语言:javascript
复制
gst::element filesink("filesink", "file-sink");
filesink.set("async", gboolean(FALSE));

就这样。现在暂停和恢复工作状态的所有的元素更改为暂停和暂停播放,没有任何挂起的状态!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27547500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档