本篇教程会学到:
学习一门编程语言,打印一个hello world是最好的实践。学习gstreamer也是,不过不是打印hello world,而是播放一个视频文件。
首先把如下代码拷贝到一个命名为basic-tutorial-1.c
的文件中。
#include <gst/gst.h>
int
main(int argc, char *argv[])
{
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
/* Initialize GStreamer */
gst_init(&argc, &argv);
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
NULL);
/* Start playing */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
/* 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);
/* 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;
}
执行编译(linux)
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
运行
效果是会弹出一个视频播放窗口,播放的是从网络上拉取一段带有音频的视频。
/* Initialize GStreamer */
gst_init(&argc, &argv);
使用gstreamer必须先调用此函数,它做的事情包括:
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
NULL);
这行代码是本篇教程的核心,它包含了两个重要的点:gst_parse_launch()和playbin。
gst_parse_launch
GStreamer是一个用来处理多媒体流的框架。多媒体经过“source”元件(生产者),流到“sink”元件(消费者),中间经过一系列的用于处理各种任务的元件。这样将多个元件连接起来的集合就称为一个pipeline。注意,这里说的元件是一个专有名词,英文是element,后面还会提到。
在GStreamer中,通常是手动的组合各个独立的元件来构成一个pipeline。但是当pipeline足够简单的时候,你不需要一些高级特性的时候,你就可以使用gst_parse_launch()。
此函数采用管道的文本表示形式并将其转换为实际的管道,非常方便。 实际上,这个功能的使用非常方便,它有一个完全围绕它构建的工具,在看过后面的教程后你就会非常熟悉了(请参阅基础教程10:GStreamer工具以了解gst-launch-1.0和gst-launch-1.0语法)。
playbin
在本例中,我们用gst_parse_launch()构建了一个由称为playbin的单个元件组成的管道。
playbin是一个特殊的元件,它既是一个source元件,也是一个sink元件,并且也是一个完整的pipeline。在内部,他创建并连接了播放多媒体必需的所有元件,所以我们不用过多操心。
它没有像手工pipeline那样的控制粒度,但是仍然有足够的自定义部分以满足各种应用程序的需要,包括本教程。
在本例中,我们只向playbin传了一个参数,那就是我们想要播放的视频的URI,当然也可以尝试更改为其他的以http://或file://为前缀的URI。playbin都会透明地实例化相应的GStreamer source。
如果你写入的URI是错误的,或者文件不存在,或者缺少插件,则GStreamer提供了几种通知机制,但是在此例中我们唯一要做的就是错误时退出,不再做过多介绍。
/* Start playing */
gst_element_set_state(pipeline, GST_STATE_PLAYING);
这行代码里有一个重要的概念:状态。每一个GStreamer的元件都有一个关联的状态,你可以或多或少地将其视为常规DVD播放器中的“播放/暂停”按钮。 在将管道设置为“PLAYING”状态之前,播放不会开始。
这行代码用gst_element_set_state将pipeline的状态设置为PLAYING,从而启动了播放。
/* 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);
这段代码会一直等待,直到出现错误或到达流的结尾。gst_element_get_bus会获取pipeline的bus,gst_bus_timed_pop_filtered会阻塞到通过bus收到错误或者EOS(End-Of-Stream)。GStreamer的bus概念在第二篇教程还会解释。
这个示例就这些,GStreamer会做大部分的事情,直到遇到错误或者到达流的末尾,执行操作才会结束。当然,随时执行control+C都会立即中断程序。
清理
在退出程序之前,还有一些清理工作要做。
/* 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);
记住,一定要阅读对应函数的文档,这样才能知道是否应该释放掉他们返回的对象。
比如在本例中:
gst_bus_timed_pop_filtered()返回了一个必须要用gst_message_unref()释放的message对象。
gst_element_get_bus()的调用,会让bus增加一个引用,因此也必须用gst_object_unref()来释放。
将pipeline的状态设置为NULL,以确保它释放了所有之前申请的资源。
最后,释放pipeline以销毁它及其所有相关内容。
文章浏览阅读4k次,点赞7次,收藏30次。首先声明,这篇的操作有许多需要手动的地方,不能一键生成,也希望以后能有更快捷的手法。之前讲了MIMICIV数据库在PostgreSQL中的安装,今天主要是讲在pgAdmin中调整原代码并生成SOFA评分。0. 谋定而后动在pgAdmin中选中数据库,右键选择Query Tool,接着打开sofa.sql可以看到,除了原生数据之外,sofa评分还使用了icu_hourly, ventilation, vitalsign等衍生数据,如下表:SOFA需要的衍生数据衍生数据需要的衍生数据_mimic数据库提取sofa评分
文章浏览阅读2.4k次。===============同步捕获,var http = require('http');var fs = require('fs');var url = require('url');var routes=require('./models/routes');http.createServer(function (request, response) { var pathnam..._node js 报symbol miss
文章浏览阅读1.8k次,点赞2次,收藏8次。开源成语答题小程序源码采用云开发,无需搭建服务器,无需域名即可使用云端能力。目前成语答题小程序集成微信banner广告,视频广告,插屏广告,激励视频广告等功能,方便运营者赚取广告收益.。成语答题小程序一直被很多人休闲娱乐,成语小秀才更是占据整个小程序榜单首位,成语答题小程序简单又可以学习,让很多人都钟情于它。本代码有几大特点:成语答题小程序源码开发过程中考虑到云开发的免费额度,所以开发成语答题小程序设计中以减少数据请求次数,减少云函数调用为特点,用更少的调用次数服务更多的用户。让免费额度可以服务_成语答题赚小程序v1.1.2前后端源码+小程序前端
文章浏览阅读163次。windows下面,先去下载https://github.com/Jay-Goo/ProtectedApkResignerForWalle,电脑要安装python的系统。修改channel中的渠道信息为自己需要的,修改config中的信息,如下:config的配置#!/usr/bin/python#-*-coding:utf-8-*-#keystore信息#Windows 下路径分割线请注意使用\..._360加固 多渠道 dex不一致
文章浏览阅读5.3k次,点赞15次,收藏111次。C++习题03_类和对象习题03(01)计算器类题目描述下面是一个计算器类的定义,请完成该类成员函数的实现,并编写main()。class Counter{public: Counter(int num); void increament(); //给原值增1 void decrement(); //给原值减1 int getValue(); //取得计数器值 void print(); //显示计数private: int value;}; _构建一个book类,有四个私有数据成员
文章浏览阅读8.1k次,点赞4次,收藏10次。eclipse中运行项目问题提示信息从上图可看出#号第一条为:没有足够的内存让Java运行时环境继续运行。解决方法:修改Run Configurationsmaven项目在代码上右键,依次点击“Run As”->“Run Configurations”,在Arguments参数中的“VM arguments:”中填入如下值即可。-Xms64m -Xmx1..._eclipse there is insufficient memory for the java runtime environment to con
文章浏览阅读4.8k次,点赞2次,收藏3次。1. 购买 淘宝最牛 esp32开发板:https://item.taobao.com/item.htm?id=5573255796962. 安装cp2104 usb转串口驱动程序https://www.silabs.com/products/develop … cp-drivers https://www.silabs.com/documents/public … rivers.zip3. 下载windows开发与下载sdk包https://dl.espressif.com/dl/esp32_淘宝的esp32 开发板哪家好
文章浏览阅读471次。一、认识FineUploader的功能:进入示例网站:https://fineuploader.com/demos.html#basic-setup; 二、准备相关的js,css Build Fine Uploader yourself from the GitHub repogit clone https://github.com/FineUploader/fine-up..._fineuploader包含demo和server端和最新的js
文章浏览阅读1.9k次。ssh-keygen -f “/home/xt/.ssh/known_hosts” -R 145.192.1.20_ssh-keygen -f
文章浏览阅读9.7k次,点赞8次,收藏22次。1网络广播:网络广播是指一个节点同时向相同域中的其它所有节点传输数据包的过程。例如有4台主机, 分别为1号主机,2号主机,3号主机,4号主机. 假如1号主机 要给4号主机发数据! 如果是用广播传输方法的话! 那么4台主机都会收到数据包! 4台主机 在收数据包的时候 会查看数据包里的目标IP地址是不是自已的,是的话就收下,不是就不收!2.ARP广播原理:(1)A(135.24.25..._arp广播
文章浏览阅读6.7k次,点赞2次,收藏3次。CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);// 有些硬件会自动八分频 导致后面的计算出现错误_stm8s输出pwm频率不对
文章浏览阅读4.4k次。先标记一下, 后面会详细整理:用DbVisualizer来直接使用ElasticSearch, 第一件事就是破解x-pack-core-6.4.0.不然你用Dbvis连接es会报错:dbvisualizer current license is non-compliant for [jdbc]dbvisualizer current license is non-complian..._x-pack-sql-jdbc-6.4.0