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