如何使用 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 我的解决方案附有评论。
解释:
如果你想播放视频文件,没有预定义的管道,如 playbin
、gst_parse_launch
等,你有两个选择
- 动态地 link
uridecodebin
带有 2 个管道套管(一个用于音频,第二个用于视频)
- 通过使用
avidemux
动态 link 并使其达到 'atomic' 级别。它非常复杂,并且在 net 中没有工作帮助。也许我稍后会用工作解决方案更新这个分支。
在我的 github link 中,您会发现第一个解决方案有 2 个管道和 uridecodebin
我正在尝试使用 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 我的解决方案附有评论。
解释:
如果你想播放视频文件,没有预定义的管道,如 playbin
、gst_parse_launch
等,你有两个选择
- 动态地 link
uridecodebin
带有 2 个管道套管(一个用于音频,第二个用于视频) - 通过使用
avidemux
动态 link 并使其达到 'atomic' 级别。它非常复杂,并且在 net 中没有工作帮助。也许我稍后会用工作解决方案更新这个分支。
在我的 github link 中,您会发现第一个解决方案有 2 个管道和 uridecodebin