gstreamer学习笔记

本文介绍了GStreamer中元素的状态机,包括NULL、READY、PAUSE和PLAYING四个状态,并通过一个简单的hello-worlddemo演示了如何使用playbin从网络加载媒体并播放。还提供了手动编译和CMake构建的示例。
摘要由CSDN通过智能技术生成

1. GStreamer中文教程

GStreamer中文教程
gstreamer-example代码列子

1.1. GStreamer的elements仅有四种状态

GStreamer的elements仅有四种状态,四种状态从NULL<->READY<->PAUSE<->PLAYING必须依次切换,即使越级切换状态成功也是接口内部完成了相关的操作。

  • GST_STATE_NULL:默认状态,在这个状态不会申请任何资源,当element的引用计数变为0时必须处于NULL状态。其他状态切换到这个状态会释放掉所有已申请的资源。
  • GST_STATE_READY:在这个状态下element会申请相关的全局资源,但不涉及stream数据。简单来说就是NULL->READY仅是打开相关的硬件设备,申请buffer;PLAYING->READY就是把停止读取stream数据。
  • GST_STATE_PAUSE:这个状态实际是GStreamer中最常见的一个状态,在这个阶段pipeline打开了stream但并未处理它,例如sink element已经读取到了视频文件的第一帧并准备播放。
  • GST_STATE_PLAYING:PLAYING状态和PAUSE状态实际并没有区别,只是PLAYING允许clock 润run。

2. demo

2.1. hello-world

代码将打开一个窗口并显示一个带有音频的电影。由于这段媒体是从网络上获取的,所以可能需要等待几秒才会显示窗口,等待时间取决于网络连接的速度。
01_helloworld.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;
}
  • 手动编译
pkg-config --cflags --libs gstreamer-1.0
gcc 01_helloworld.c -o 01_helloworld `pkg-config --cflags --libs gstreamer-1.0`
./01_helloworld
  • CMake构建
    CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(01_helloworld)
set(CMAKE_CXX_STANDARD 11)

include(FindPkgConfig)# equals `pkg-config --cflags --libs gstreamer-1.0`
pkg_check_modules(GST   REQUIRED gstreamer-1.0)
pkg_check_modules(GSTAPP REQUIRED gstreamer-app-1.0)

include_directories(
   ${GST_INCLUDE_DIRS}
   ${GSTAPP_INCLUDE_DIRS}
)

link_directories(
   ${GST_LIBRARY_DIRS}
   ${GSTAPP_LIBRARY_DIRS}
)

add_executable(${PROJECT_NAME}
  01_helloworld.c
)

target_link_libraries(${PROJECT_NAME}
   ${GST_LIBRARIES}
   ${GSTAPP_LIBRARIES}
)

cmake -H. -Bbuild/
cd build
make
./basic-tutorial-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekPlusA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值