首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gstreamer-1.0通过GUI停止和启动录制流水线

gstreamer-1.0通过GUI停止和启动录制流水线
EN

Stack Overflow用户
提问于 2017-03-09 17:48:43
回答 1查看 1.6K关注 0票数 0

我正在尝试编写简单的视频记录器,基于gstreamer框架,以ARM处理器和Wayland+Qt作为窗口子系统,用于我自己的定制板。我已经创建了带有rec_start槽和rec_stop公共方法的类RecordBin:

代码语言:javascript
复制
void RecordBin::rec_start ()
{
  /* Set pipeline to the PLAYING state */
  gst_element_set_state (record_pipeline, GST_STATE_PLAYING);
  g_print ("setting playing state\n");

  /* Start main loop context */
  g_main_loop_run (rec_loop);
}

void RecordBin::rec_stop ()
{
  /* Set pipeline to the NULL state */
  change_ret = gst_element_set_state (record_pipeline, GST_STATE_NULL);

  /* Quit from main loop context */
  g_main_loop_quit (rec_loop);
}

这是我在主窗口中点击播放/停止按钮的位置:

代码语言:javascript
复制
void MainWindow::on_recordButton_clicked ()
{
  if (!is_recording) {
    if (window_is_opened == false) {
      cout << "start recording" << endl;

      /* Start recording */
      window_is_opened = true;
      emit start_recording ();
    } else {
      cout << "playing window already opened" << endl;
    }
  } else {
    cout << "recording reset" << endl;

    /* Stop recording */
    record_bin->rec_stop ();
    window_is_opened = false;
  }
}

RecordBin类在一个单独的线程中工作(它是通过QThread实现的),所以glib主循环上下文不会阻塞Qt主窗口。我不能使用rec_stop方法作为插槽,因为rec_loop阻塞了消息处理,并且当录制开始时,它不能通过信号停止。但是直接调用rec_stop是线程不安全的。

有没有人可以帮我解决两个问题: 1.如何从另一个线程更改管道状态? 2.通过将管道状态更改为NULL来停止记录是否正确?也许我应该在总线上发送EOS信号并处理它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-09 18:34:13

gst_element_set_state()被标记为MT安全,因此可以从任何线程停止它。我在将gst_element_set_state()设置为NULL时遇到了一个问题:流水线末尾的filesink没有正确地完成输出文件(必须使用EOS并捕获另一个事件,该事件确认filesink已获得该EOS)。但是NULL对玩家来说很好用。

总而言之,我会去掉glib主循环。您可以使用gst_bus_set_sync_handler()设置回调。在回调中,向RecordBin发出Qt信号。RecordBin将是一个驻留在主Qt线程中的QObject。在其插槽中处理到达的GstMessage*

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

https://stackoverflow.com/questions/42691920

复制
相关文章

相似问题

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