关于流媒体的简介及技术梳理
理解什么是流媒体
一种具备边传边播特点的多媒体,核心为流式传输技术,也被称为新的媒体传送方式。
不必等到把媒体全部下载完毕,只需要将视音频文件经过压缩处理, 放在媒体服务器上, 在网络中使用流式传输技术分段传送,大概几秒的延时就可以获取到媒体服务器推送的视频数据。
流媒体的出现节省了下载时间和存储空间, 使延时大大减少,极大地方便了人们的工作和生活。
示意图:
举个例子:
视频直播的应用,某用户手机下载视频直播软件在推流端进行拍摄视频,利用推流协议然后在网上进行发布进入流媒体服务器,其他用户进入视频直播软件拉流端进行点播,利用拉流播放协议从流媒体服务器接收视频数据传输进行播放。
流媒体处理技术:
说说基于Pipeline结构的Gstreamer
Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
通过构建由元素组成的管道,GStreamer可用于实现各种多媒体应用程序,包括台式机播放器,音频/视频记录器,多媒体服务器,代码转换器等。元素是对多媒体流执行某些操作的对象,例如:
-读取文件
-在格式之间解码或编码
-从硬件设备捕获
-渲染到硬件设备
-混合或多路复用多个流元素
GStreamer的设计目标包括:
-快速处理大量数据
-允许完全多线程处理
-能够处理多种格式
-同步不同的数据流
-能够处理多个设备
存在不同类别的元素:
-源元素,这些元素不消耗数据,仅为管道提供数据。
-下沉元素,这些元素不产生数据,而是将数据呈现给输出设备。
-转换元素,这些元素将某种格式的输入流转换为另一种格式的流。编码器/解码器/转换器是示例。
-解复用器元素,这些元素解析流并产生几个输出流。
-混合器/混合器元素,将多个输入流合并为一个输出流。
(除此之外,还可以构造其他类别的元素。)
Bins ---- Bin是元素的子类,并充当其他元素的容器,因此可以将多个元素组合为一个元素。
管道是特殊的bin子类,提供以下功能作为其子类:
-为所有子类选择和管理全局时钟。
-根据所选时钟管理运行时间。Running_time是管道在PLAYING状态花费的经过时间,用于同步。
-管理管道中的延迟。
-提供让GstBus与应用程序通讯的元素的方法。
-管理元素的全局状态,例如错误和流结束。
通常,应用程序创建一个管道来管理应用程序中的所有元素
GStreamer支持两种可能的数据流类型,即推模型和拉模型。在推模型中,上游元素通过调用接收服务器上的方法将数据发送到下游元素。在拉模型中,下游元素通过调用来源服务器上的方法从上游元素请求数据。
Gstreamer使用出现的一些坑
系统:ubuntu18.04
安装gstreamer基本库,工具,以及插件
sudo apt-get install libgstreamer0.10-dev gstreamer-tools gstreamer0.10-tools gstreamer0.10-doc
sudo apt-get install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse
* 安装ffmpeg支持
sudo apt-get install gstreamer0.10-ffmpeg
* 测试(录制摄像头视频)
gst-launch autovideosrc ! ffmpegcolorspace ! autovideosink
唯一需要的其他“开发环境”是gcc编译器和文本编辑器。为了编译需要GStreamer并使用GStreamer核心库的代码,请记住将此字符串添加到gcc命令:
pkg-config --cflags --libs gstreamer-1.0
如果使用其他GStreamer库,例如视频库,必须在上面的字符串gstreamer-1.0之后添加额外的包(例如视频库的gstreamer-video-1.0)。
如果应用程序是在libtool的帮助下构建的,例如当使用automake / autoconf作为构建系统时,必须从gst-sdk-shell环境中运行configure脚本。
获取官方教程的源代码:
git clone https://gitlab.freedesktop.org/gstreamer/gst-docs
在每个教程的源代码的底部,需要找到该特定教程的命令,包括所需的库,按要求的顺序。在开发自己的应用程序时,GStreamer文档将说明函数所属的库。
构建:gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
运行:./basic-tutorial-1
如果遇到
Element = gst_element_factory_make("mad", "decoder");
Element为null,说明没安装mad插件,可以通过
gst-inspect mad
命令查看mad插件是否正常安装,如没有安装,在ubuntu下可以通过如下命令进行安装:
sudo apt-get install gstreamer0.10-plugins-ugly、