大家好!我是大聪明-PLUS

您是否好奇过 Totem、Rhythmbox 或 Banshee 等 Gnome 播放器是如何工作的?或许,在新安装的 Ubuntu 系统中,尝试播放 AVI 短片时,都会看到一条提示,提示需要安装 gst-ffmpeg 或 gst-plugins-ugly 等附加软件包。接下来,我将尝试阐明这个多媒体框架的工作原理及其功能。

与 VLC 或 FFmpeg 的主要区别在于,该环境最初并非为特定应用程序开发,而是为所有能够处理多媒体的程序开发。该框架集成到以下语言中:C、C++/Qt、Python、Ruby、Perl。
 

GStreamer 允许您创建具有以下功能的应用程序:

  • 使用几乎任何协议接收和传输音频和视频:HTTP、RTSP/RTP、MMS、RTMP 等。
  • 解析/收集不同格式的流:MPEG、AVI、ASF、FLV、MKV 等。
  • 将元数据拉取并粘贴到文件中。
  • 几乎可以对任意编解码器组合的流媒体进行解码/编码。
    在这种情况下,您不仅可以使用开源解决方案(libavcodec、libmp3lame、libfaac),还可以使用可购买的专有解决方案。您还可以使用支持 CUDA/VAAPI/CrystalHD 技术的硬件解码器。
  • 使用从 DirectFB 到 X 的各种解决方案将流输出到屏幕或声卡。


为了解决诸如将电影重新编码为其他格式之类的问题,像 mencoder 或 VLC 这样的程序非常流行。但使用 GStreamer 实现同样的效果也并不难。

以下是 Linux 的示例,展示了该框架的功能。在这些示例中,我们将使用主要程序 gst-launch 和 gst-inspect - 有点让人联想到 Windows 应用程序 GraphEdit。对于需要图形界面的用户,可以使用gst-editor。但请记住,这些程序旨在用于调试,因此不要指望它们易于使用。

要开始使用 GStreamer,您需要了解一些概念:

  • element — 可以接收/发送数据的 GStreamer 元素对象。
  • — 生成流(文件、流或设备)。
  • 过滤器——转换流的元素(解析器、多路复用器、编解码器)。
  • 接收器——接受流并且不重定向它。
  • 管道——相互连接的元素的集合。


经典的形式是这样的:源 -> 解析器 -> 解码器 -> 过滤器 -> 接收器。

如果你懒得手动组装整个编解码器和多路复用器链,GStreamer 可以帮你搞定:
 

$ gst-launch playbin uri=file:///home/me/audo.mp3



“playbin”元素会解析文件本身,找到所需的编解码器和输出元素。您只需指定要播放的文件的路径即可。如果您想知道每个元素负责什么,可以运行 gst-inspect 并查看所有可用元素,“gst-inspect lame”将显示 mp3 编码器的参数。“decodebin2”元素也很有用,它本身可以找到所需的解码器。

最简单的音频播放器:
 

$ gst-launch filesrc location=audio.mp3 ! decodebin2 ! alsasink



最简单的音频播放器(手动选择编解码器并同意格式):
 

$ gst-launch filesrc location=audio.mp3 ! mad ! audioconvert ! audioresample ! alsasink



更复杂的播放器(带有声音和视频):
 

$ gst-launch filesrc location=audovideofile.mpeg ! decodebin2 name=decoder \
decoder. ! ffmpegcolorspace ! xvimagesink \
decoder. ! audioconvert ! audioresample ! alsasink



如果需要将 AVI 文件重新编码为 MOV,可以使用以下命令:
 

$ gst-launch-0.10 filesrc location=film.avi ! \
decodebin2 name=decoder { qtmux name=muxer ! filesink location=film.mov } \
{ decoder. ! ffmpegcolorspace ! jpegenc ! queue ! muxer. } \
{ decoder. ! queue ! audioconvert ! queue ! muxer. }



想要进行直播,同时录制到文件并在屏幕上显示直播视频吗?没问题:
 

$ gst-launch v4l2src ! queue ! \
ffmpegcolorspace ! tee name=t1 ! \
queue ! xvimagesink sync=false t1. ! \
queue ! theoraenc quality=1 ! \
queue ! oggmux name=mux \
alsasrc ! audio/x-raw-int,rate=8000,channels=1,depth=8 ! \
queue ! audioconvert ! vorbisenc ! \
queue ! mux. mux. ! \
queue ! tee name= t ! \
queue ! filesink location=test.ogg t. ! \
queue ! shout2send ip=<наш-icecast-сервер> port=8000 password=hackme



感谢 librtmp(您需要重建 gst-plugins-bad 包),Flash 广播粉丝也不会被排除在外:
 

$ gst-launch v4l2src ! \
queue ! ffmpegcolorspace ! ffenc_flv ! \
queue ! flvmux name=muux is-live=true ! \
rtmpsink location='rtmp://localhost/path/to/stream live=1' \
alsasrc ! audio/x-raw-int,rate=22050,channels=1,depth=16 ! \
queue ! audioconvert ! lame bitrate=48 ! \
queue ! muux.



如果您使用 MacOS 或 Windows,开发人员还考虑到了使用“原生”多媒体框架(QuickTime/DirectShow),这要归功于“桥接器”。

总而言之,我想说的是,开发人员仍然需要解决许多问题(例如不同步、内存泄漏和性能问题)。其中大多数问题与使用第三方库有关,而这些库的编写并不总是很完善。因此,开发人员想出了一个有趣的技术——将插件分为 5 类:

  • gst-plugins-base — 包中包含的基本插件:CDDA、RTP、RTSP、ogg、theora、vorbis、Xvideo、V4L。
  • gst-plugins-good — 可靠性毋庸置疑的插件:FLAC、speex、JPEG、PNG。
  • gst-plugins-bad — 可以运行,但可能存在问题:VP8、XVID、FAAC、dirac、RTMP、VDPAU、DirectShow。
  • gst-plugins-ugly — 使用时必然会出现问题:ASF、real、DVDSub、a52、AMR、x264。
  • gst-ffmpeg — 独立的一体化编解码器套件。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐