gstreamer学习与研究之一:介绍与软件安装
来源:互联网 发布:php 会计做账 编辑:程序博客网 时间:2024/06/08 04:52
1.gstreamer介绍
GStreamer是在Linux下创建流媒体的应用程序框架(流媒体:流媒体,就是能够实现网络边传边播放多媒体)。GStreamer不仅可以处理音频和视频,它可以处理任何一种类型的数据流。我认为它主要的功能就是辅助你进行音视频数据流的采集、处理、传输,播放等功能的工具软件。因此可以给予GStreamer构建音视频音乐播放器,同时进行录音录像、进行音视频传输等。
因为工作的关系,今年一直在用gstreamer做视频播放器相关的开发和工程应用。这个软件可以说是linux平台下应用最多的流媒体处理软件。在飞思卡尔的IMX6等平台上已经将其移植进去,因此做嵌入式相关的流媒体开发,gstreamer是最佳的选择之一。gstreamer本身也非常复杂,熟悉其框架结构需要花不少的时间。从本文开始,逐步分享我对gstreamer的理解和使用心得。
介绍的内容从gstreamer的安装开始,之后是自己对gstreamer官方示例、文档和概念的理解,之后是在IMX6Q使用gstreamer做开发的个人心得。
2.linux下安装gstreamer
gstreamer有一个官方的网站gstreamer官网,这无疑是学习gstreamer最权威的材料。本系列博客的大量内容是参考了该网站。
该网站也介绍了在windows、linux和Android、mac等主流操作系统下安装的方法。我使用的是Ubuntu linux,因此主要介绍该环境下的使用和安装方法。
首先使用 apt-get update 更新一下你的系统,这样可以避免很多奇奇怪怪的问题。
完成之后执行下面的命令:
apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
完成之后,将一个视频文件复制到linux系统中,例如放在/opt/video下面的位置;执行下面的命令测试是否安装成功。
gst-play-1.0 /opt/video/0001.mp4
出现上述画面就代表你的环境搭建好了。
3.获得指导教程中的示例代码
gst本身提供了基础的学习指导,仔细学习有利于我们更好的掌握gstreamer,获得方法是在Linux下执行下面的命令:
git clone git://anongit.freedesktop.org/gstreamer/gst-docs
如果你而没有安装git,直接使用apt-get install git即可。
下载完成后,代码和文件在你的当前目录下。
运行第一个程序:
进入examples下的tutorial目录下,打开basic-tutorial-1.c文件,修改这一行,这里可以播放本地视频
pipeline = gst_parse_launch ("playbin uri=file:///opt/video/0001.mp4", NULL);
然后执行下面的命令:
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
编译生成可执行程序basic-tutorial-1可执行程序,然后输入./basic-tutorial-1 来执行,此时同样可以看到上面的播放画面。这说明我们的安装是成功的。
4.basic-tutorial-1.c代码
#include <gst/gst.h>int main(int argc, char *argv[]) { GstElement *pipeline; GstBus *bus; GstMessage *msg; /* 1.Initialize GStreamer */ gst_init (&argc, &argv); /*2. Build the pipeline */ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL); /* 3.Start playing */ gst_element_set_state (pipeline, GST_STATE_PLAYING); /*4. Wait until error or EOS */ bus = gst_element_get_bus (pipeline); msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); /* 5.Free resources */ if (msg != NULL) gst_message_unref (msg); gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0;}
5.解析
5.1 gst-init()
gst_init (&argc, &argv);
初始化gstreamer,放在gstreamer程序的最前面,完成内部数据结构的初始化、对所有可用插件进行检测和执行输入的命令行选项。如果使用argc和argv来给gst_init传递参数,可以方便的使用gstreamer的标准命令行选项。
5.2 gst_parse_launch ()
gst_parse_launch()函数的使用代码为:
pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
这里有两个关键点gst_parse_launch和palybin。
Gstreamer是一个处理多媒体流的框架。媒体从源下载到管道中(前者成为生成者,后者称为消费者),这期间要经过一系列中间元素来完成所有的任务。这些交互的元素称为“管道”。
在Gstreamer中,可以手工组装各个元素,但是如果比较简单,并且不需要复杂的特征时,可以直接使用gst-parse-launch()来完成。这一函数可以接收管道的文本表示信息,并将其转换为实际需要的管道。这功能非常方便,甚至单独封装了一个独立的工具gst-launch。
playbin
我们希望gst_parse_launch()为我们建立哪种管道呢?这就是我们要谈论的第二个问题:我们使用palybin来构建一个只有单个元素的管道。
playbin是一个特殊的元素,既可以作为发送端,也可以作为接收端,是一个完整的管道。事实上,它创建了播放媒体所需要的所有元素。它不允许控制手动管道所做的粒度,但是,它仍然提供了足够的定制来满足广泛的应用需求。这个例子中,我们仅仅将URI一个元素传递给了playbin,这里还可以使用http://或者file://URL等,比如在这个例子中,我们将上面的代码改成了本地播放的视频文件。
5.3 gst_element_set_state ()
gst_element_set_state (pipeline, GST_STATE_PLAYING);
用来设置播放的状态,例如播放/暂停等。
5.4 gst_element_get_bus ()
bus = gst_element_get_bus (pipeline);
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
这两行将一直等待,直到出现了错误或者到达流的终点。gst_element_get_bus()检索管道的总线,如果发生错误,或者到达流终点(EOS)gst_bus_timed_pop_filtered()将会阻塞,下一节重点介绍gstreamer相关概念。
从这里开始,GStreamer密切关注所有相关信息。如果到达流末尾或者错误发生,Gstreamer将尝试进行一些操作,例如关闭视频窗口或者关闭网络。可以通过键盘在命令行输入“Ctrl -C”来实现。
之后的都是执行清理和关闭工作的代码。