This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:陆地上的 GStreamer 记录应用

Guru**** 2618835 points

Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579967/linux-am5728-gstreamer-recording-application-in-wayland

器件型号:AM5728

工具/软件:Linux

我有基于 gstreamer 和 qt 的应用程序、在 Ubuntu 上工作。 我想将其移植到 Sitara am5728 EVM。
此应用程序将视频记录在文件中、并在监视器上并行输出。

 我已使用 rec_start 插槽和 rec_stop 公共方法创建了类 RecordBin:

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);
}

这是我在 MainWindow 中用于单击播放/停止按钮的插槽:

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 会阻止消息处理、并且当录制开始时、无法通过信号停止。  

此应用程序可在我的 Ubuntu 主机上正常工作。 但在 EMV 上会发生奇怪的情况:
单击录制按钮几次后、视频输出窗口将停止显示、当我单击停止时、该窗口将在几秒钟后显示 、右键将关闭。 输出文件正确、我可以播放它。
发生什么事了? 线程或 Weston 有问题吗? 如何解决此问题?


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!


    您有两个线程,一个用于解码->显示,另一个用于解码->保存在文件中,对吧? 您正在停止/启动这两个或仅启动其中一个?
    我不知道 qt、但我建议您检查 g_main_loop_quit 文档是否为线程保存。


    BR
    玛格丽塔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。
    问题通过以下方法得到解决:为了停止流水线、我通过 GST_ELECK_SEND_EVENT 函数在流水线总线上发布 EOS 事件、并在总线回调函数中对其进行处理。 现在、崩溃输出窗口的问题消失了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我很高兴这个问题得到解决。

    BR
    玛格丽塔