В настоящее время я пытаюсь поэкспериментировать с воспроизведением видео на GSteamer.В настоящее время он реализован следующим образом:
void VPlayer::playFile(QString video_filename, bool loop)
{
m_isLooping = loop;
QString cmdstr = "gst-launch-1.0 -v filesrc location=" + video_filename + " ! qtdemux ! queue max-size-buffers=0 max-size-time=0 ! vpudec frame-drop=0 ! queue ! imxv4l2sink device=/dev/video16";
GError **l_error = NULL;;
m_gst_pipeline = gst_parse_launch (cmdstr.toUtf8().data(), l_error);
m_gst_bus = gst_pipeline_get_bus (GST_PIPELINE(m_gst_pipeline));
gst_bus_set_sync_handler (m_gst_bus, GStreamerBusCallback, this, nullptr);
gst_object_ref (m_gst_bus);
gst_object_ref(m_gst_pipeline);
gst_element_set_state (m_gst_pipeline, GST_STATE_NULL);
gst_element_seek_simple (m_gst_pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0);
gst_element_set_state (m_gst_pipeline, GST_STATE_PLAYING);
}
GstBusSyncReply VPlayer::GStreamerBusCallback(GstBus *bus, GstMessage *msg, gpointer data)
{
VPlayer* player = (VPlayer*) data;
GstElement *pipeline = player->getPipeline();
switch (GST_MESSAGE_TYPE(msg))
{
case GST_MESSAGE_EOS:
/* restart playback if at end */
qDebug() << "PLAYBACK FINISHED";
if(player->isLooping())
{
qDebug() << "LOOPING";
gst_element_seek_simple (pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
}
break;
default:
break;
}
return GST_BUS_PASS;
}
Когда я запускаю этот пример, я получаю EOS, как и ожидалось, и вывод отладки в порядке, но вместо поиска изображения зависает и ничего не происходит.Кроме того, зацикливание, кажется, не продолжается.
Что я здесь пропустил?