如何使用 GStreamer 播放 avi 视频

How to play avi video using GStreamer

我正在尝试使用 GstElement 在 GSTreamer 中播放我的第一个视频,没有预先配置 gst_parse_launch

#include <iostream>
#include <gst/gst.h>

int main(int   argc,    char *argv[])
{
    GstElement *pipeline;
    GstElement *source, *sink;

    gst_init(&argc, &argv); //! Initialize GStreamer

    pipeline = gst_pipeline_new("my-pipeline"); //! Creating pipeline

    source = gst_element_factory_make("filesrc", "file-source"); //! Creating source
    g_object_set(G_OBJECT(source), "location", "file:///D:/workspace/rocket.mp4", NULL);

    sink = gst_element_factory_make("autovideosink", "sink"); //! Creating sink
    if (sink == NULL) 
    {
        g_error("Could not create neither 'autovideosink' element");
    }

    gst_bin_add_many(GST_BIN(pipeline), source, sink, NULL); //! Adding elements to pipeline container

    
    if (!gst_element_link_many(source, sink, NULL))  //! Linking all elements together
    {
        g_warning("Unable to link elements!");
    }

    auto ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); //! Turning pipeline in PLAYING STATE

    if (ret == GST_STATE_CHANGE_FAILURE) 
    {
        g_printerr("unable to set the pipeline to playing state");
        gst_object_unref(pipeline);
        return -1;
    }
    
    return 0;
}

提前致谢!

尝试将“file:///D:/workspace/rocket.mp4”改为“D:/workspace/rocket.mp4”。 也许您还需要将 gst_element_link_many(source, sink, NULL) 更改为 gst_element_link(source, sink).

这是一个答案

首先,github link 我的解决方案附有评论。


解释:

如果你想播放视频文件,没有预定义的管道,如 playbingst_parse_launch 等,你有两个选择

  1. 动态地 link uridecodebin 带有 2 个管道套管(一个用于音频,第二个用于视频)
  2. 通过使用 avidemux 动态 link 并使其达到 'atomic' 级别。它非常复杂,并且在 net 中没有工作帮助。也许我稍后会用工作解决方案更新这个分支。

在我的 github link 中,您会发现第一个解决方案有 2 个管道和 uridecodebin