Other Parts Discussed in Thread: 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 有问题吗? 如何解决此问题?