![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
gstreamer
文章平均质量分 75
HUI的技术笔记
这个作者很懒,什么都没留下…
展开
-
gst-openmax和openmax component的理解
FTB就是app取数据,把output空buffer送给codec, FBD就是codec把编解码后的数据填好送给app,ETB就是app把input数据送给codec, EBD就是codec把inputbuffer取走了,把input端的空buffer还给app。存放空的omx_buffer, 在GstBuffer过来之后,从in_port队列里面pop一个空的omx_buffer出来,将GstBuffer转换成omx_buffer, 通过。所以empty是input端,fill是output端。原创 2022-12-25 20:34:44 · 563 阅读 · 0 评论 -
gstreamer-hlsdemux插件的初始流程
在gst_soup_http_src_read_buffer部分,如果读不到buffer就会返回GST_FLOW_EOS,gst_base_src_loop中会根据GST_FLOW_EOS创建EOS event,然后push到pad上,gst_uri_downloader_sink_event中再释放downloader->priv->cond条件变量,这个条件变量会结束downloader uri的线程的等待,在gst_uri_downloader_fetch_uri_with_range中可以看到。原创 2022-12-25 14:30:41 · 815 阅读 · 0 评论 -
Gstreamer中pad的链接
pad相当与element的接口,那么element间的连接,实质上就是pad间的连接,所以这里总结下pad的链接。原创 2022-11-30 12:02:47 · 1331 阅读 · 0 评论 -
在gstreamer中做线程同步
这里分别用到了C++ condition_variable和glib的GCond和GMutex做线程同步,C++代码用在外部代码,glib的用法用在pipeline的代码中。原创 2022-11-30 11:20:29 · 836 阅读 · 0 评论 -
gstreamer-插件开发的简单过程
Gstreamer的插件开发使用模板工具生成框架非常方便,比如我这里要实现一个videoprocess插件,使用gst-plugins-bad/toolsgst-element-maker 生成代码框架,然后再添加实际功能,可以达到事半功倍的效果。根据插件模板创建插件videoprocess,videoprocess的bass class是videofilter原创 2022-10-25 20:57:57 · 1427 阅读 · 0 评论 -
Gstreamer BUS处理message
Gstreamer中,BUS(总线)是一个简单的系统,负责将消息从pipeline传递到应用程序。默认情况下,每一个pipeline默认包含一个BUS,所以应用程序不需要再创建BUS。应用程序只需要在BUS上设置消息处理回调程序,当mainloop运行时,将定期检查bus是否有新消息,并在有消息可用时调用回调。原创 2022-10-13 21:22:32 · 1068 阅读 · 0 评论 -
gsteamer日志输出实例
在Gstreamer中日志输出非常强大,可以根据category设置需要显示的部分,还可以设置颜色,突出显示。codec2dec是codec2dec_debug的name,定义好之后,在代码中通过GST_DEBUG输出log,在命令行用这样的环境变量来打开,就可以看到log输出了。\其中GST_DEBUG_BOLD是color flag,定义在文件中,可以设置前景色,背景色,粗体和下划线。原创 2022-09-02 15:24:56 · 842 阅读 · 0 评论 -
Gstreamer利用category调试
之前总结过category的定义和使用,基于这个基础,发现利用gstreamer的categories和log系统,调试起来效率会提升很多。这两个例子都是Gstreamer中基础的部分,其他的element的category通过这个方法查找,再也不怕写错了。举个例子,如下,使用playbin播放http mp4的时候,我想知道都创建了那些element,通过指定。就可以打印出来所有的categories,这个在通过log来调试的时候非常方便。可以列出所有的category,加上。过滤后,列出来的就是。...原创 2022-08-16 21:25:13 · 220 阅读 · 0 评论 -
gstreamer-基础教程8-appsrc和appsink的应用
在appsrc上,需要设置的第一个属性appsrc是caps,它指定元素将要生成的数据类型,因此 GStreamer 可以检查是否可以与下游元素链接(也就是说,下游元素是否会理解这种数据)。这个教程通过appsrc元素,将应用程序数据注入 GStreamer 管道,并且使用appsink元素将 GStreamer 数据提取回应用程序。文件有哪些,比如用gstreamer最近的版本编译的pc文件有下面这么多,那么都可以通过pkg-config命令查到。如何将外部数据注入通用 GStreamer 管道。....原创 2022-08-14 14:48:05 · 2257 阅读 · 0 评论 -
Gstreamer中g_main_loop_new的使用
这样的用大多数情况下都没有问题,比如自己创建的player,或者pipeline里面几乎都是这么用的。原创 2022-08-11 20:43:09 · 2070 阅读 · 0 评论 -
gstreamer的caps event和new_segment event
在gst_pad_set_caps中,创建了GST_EVENT_CAPS类型的event,然后gst_pad_push_event将这个event发送到pad上,如果pad没有link,event会被存起来,处于pending状态,从后面的log中可以看到这个信息。流的时间戳和内容进行调整的信息。.........原创 2022-07-30 18:55:20 · 723 阅读 · 0 评论 -
安装gstreamer开发依赖库到项目sysroot目录
在项目中,需要实现一个gstreamer的pipeline,依赖libgstreamer1.0和libgstapp-1.0库,因为是系统是x86_64环境,需要在i386的sysroot下安装这些库,基于这个背景,发现通过apt安装,然后从apt安装的cache路径,拿到这些库解包后拷贝到sysroot目录是非常方便。完成这些验证,就可以把这个过程应用到我们的环境中,比如我们的环境sysroot路径是。从这个解包的输出可以看出,不带dev的deb包里面是全部的so库,包括符号链接。...原创 2022-07-28 17:29:55 · 1078 阅读 · 2 评论 -
gstreamer插件scan过程
上面这段代码是在gst_registry_scan_plugin_file中调用的,存在下面的调用栈(从下往上),init_post中调用gst_update_registry更新registry,ensure_current_registry中获取。然后,在scan_and_update_registry先通过init_scan_context初始化registry,最后调用gst_registry_scan_path_internal扫描。目录下,经过这样的方式,减小搜索的范围。原创 2022-07-08 13:42:51 · 1600 阅读 · 0 评论 -
openh264解码数据流向分析
openh264dec中finish_frame的逻辑和avviddec比起来比较简单,在handle_frame中,buffer先送给解码器解码(),然后调用将解码后的buffer发到downstream。DecodeFrameNoDelay解码,返回yuvdata,完成后unmap input_buffer:gst_video_frame_map的功能使用@info和@buffer来填入@frame的值。@frame通常被分配在堆栈中,你将把地址传给分配在堆栈中的#GstVideoFrame结构。原创 2022-07-04 19:40:07 · 959 阅读 · 0 评论 -
Gstreamer中的task
在gstreamer中,可以在需要的时候方便的创建一个task作为独立线程,task可以是普通的task,也可以是pad task,这个需要根据具体需求来定,下面先看下v4l2和avdemux里面task的代码。通过gst_pad_start_task开始一个,task函数是gst_v4l2_video_dec_loop。...原创 2022-07-03 20:40:40 · 492 阅读 · 0 评论 -
gst-launch的-v参数
先看一个简单的例子:gst-launch的pipeline,增加-v参数就可以输出caps的详细信息,包括我们想要的codec_data,那么,这个-v参数是怎么输出这些的,就需要深入跟踪下代码,因为这个输出不受GST_DEBUG的控制,是直接输出到terminal的。在gst-launch的代码中,-v参数的作用是输出状态信息和属性通知,deep_notify处理.........原创 2022-07-03 12:37:41 · 637 阅读 · 0 评论 -
gstreamer ffmpeg avdec解码数据流向分析
avdec_xxx是gst-libav中的解码插件,对应文件是gstavviddec.c。avdec初始化的时候,decoder中初始化了下面这些函数,所以libav的avviddec插件中,主要的数据处理,关注几个函数的实现就可以了原创 2022-07-02 17:51:53 · 855 阅读 · 0 评论 -
gstreamer中解析生成android的csd-0和csd-1
在Android中,使用codec的时候,通常要先配置csd数据,全称codec specific data,通常从datasource里面都能获得,对应csd-0:SPS数据,csd-1:PPS数据,并且Android硬解码只接受AnnexB格式的数据。所以,在gstreamer中使用Android codec的时候,要配置csd-0和csd-1给codec,就先要从caps里面拿到codec_data,然后进行解析,如果不是annexb格式的数据,就要做一个buffer转换。...原创 2022-06-17 21:23:03 · 1384 阅读 · 0 评论 -
gstreamer之category
gstreamer的category,简单来说就是用于区分log信息的类别。原创 2022-05-23 22:08:25 · 380 阅读 · 0 评论 -
gstreamer的状态转换
gstreamer element和pad都可以处于不同的状态。 pad的状态与element的状态相关联,因此状态的设计主要集中在element状态。一个element可以处于 4 种状态。 NULL、READY、PAUSED 和 PLAYING。 当一个元素最初被实例化时,它处于NULL状态。原创 2022-05-20 19:29:31 · 1250 阅读 · 0 评论 -
gstreamer中GList的使用
`GList`结构及其相关函数提供了一个标准的双链接列表数据结构。`GList`是`GLib`中的双向链表,其每个元素都包含一块数据和指向前后元素的指针。存储的数据类型是gpointer,在GLib中,gpointer指向实际数据的指针。原创 2022-05-17 22:41:39 · 717 阅读 · 0 评论 -
gstreamer在线视频AAC声音异常分析
背景:在播放在线视频的时候声音播放不正常,通过生成pipeline dot文件分析,看到audio部分是aac raw格式,所以初步思路是dump es流后,分析gstreamer pipeline播放,然后发现问题。(dump数据后,pipeline都是在ubuntu上运行的)原创 2022-05-13 11:01:06 · 528 阅读 · 0 评论 -
gstreamer之G_DEFINE_TYPE
G_DEFINE_TYPE是一个用于类型实现的宏,它声明了一个类的初始化函数,一个实例的初始化函数(关于这些的信息请参考gtype.h)和一个名为`type_name##_parent_class`的静态变量,指向父类。此外,它还定义了一个`type_name##_get_type()`函数。原创 2022-05-11 18:55:26 · 755 阅读 · 0 评论 -
去掉v4l2mpeg4dec插件的mpeg4解码能力
背景:去掉v4l2videodec的MPEG4的capsMPEG4 caps的初始化调用栈plugin_init在gst-plugins-good/sys/v4l2/gstv4l2.c文件中,是v4l2相关plugin的init函数,通过gst-inspect可以看到video4linux2对应一系列插件video4linux2: v4l2src: Video (video4linux2) Sourcevideo4linux2: v4l2sink: Video (video4linux2) .原创 2022-04-28 14:16:29 · 581 阅读 · 0 评论 -
gstreamer在线视频AAC音频声音异常分析
背景:在播放在线视频的时候声音播放不正常,通过生成pipeline dot文件分析,看到audio部分是aac raw格式,所以初步思路是dump es流后,分析gstreamer pipeline播放,然后发现问题。(dump数据后,pipeline都是在ubuntu上运行的)首先需要dump数据,dump GstBuffer到文件:GstMapInfo map;std::ofstream outfile;gst_buffer_map (buffer.get(), &map, GST_MA原创 2022-04-28 11:56:09 · 742 阅读 · 0 评论 -
gstreamer不同的调度模式
pad的调度模式定义了数据如何从source pads获取数据或给数据给sinkpads。GStreamer可以在两种调度模式下运行,称为推模式和拉模式。GStreamer支持在任何一种调度模式下的`element pads`,而不是所有的pads都需要在同一模式下运行。原创 2022-04-08 21:26:56 · 874 阅读 · 0 评论 -
westerossink代码理解
Westeros是一个轻量级的Wayland合成器库。它使用Wayland协议,并设计为与使用Wayland合成器构建的应用程序兼容。本文是阅读westeros里面的westerossink部分得来,westerossink是作为gstreamer的一个插件,使用硬件v4l2的能力进行解码和显示。原创 2022-03-24 15:16:44 · 908 阅读 · 0 评论 -
gstreamer avidemux增加h265支持
AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用户管理Windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。RIFF文件的实际数据中,使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套列表和块。整个RIFF文件可以看成一个数据库,其数据块ID为RIFF ,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。原创 2022-02-20 23:17:59 · 1253 阅读 · 0 评论 -
WPEWebkit调试MSE播放
MediaSource是在js中通过代码调用才能创建,并不是所有的html5 video都是MSE,所以刚开始接触的时候,用`https://www.w3.org/2010/05/video/mediaevents.html`的测试页面,就没有这个过程,很怀疑是不是代码思路看错了。原创 2022-02-16 21:07:26 · 659 阅读 · 0 评论 -
gstlibav的初始化过程
gstlibav的初始化过程gst-libav的文件目录结构gstlibav的核心代码在gst-libav/ext/libav目录下,把plugin对应的c文件列出来有以下这么多:gst-libav/ext/libav├── gstavauddec.c├── gstavaudenc.c├── gstav.c├── gstavdemux.c├── gstavmux.c├── gstavprotocol.c├── gstavutils.c├── gstavviddec.c├── gsta原创 2022-02-15 23:01:57 · 1815 阅读 · 0 评论 -
gstreamer初始化和plugin registry过程
gst_init的过程分析gstreamer/gst/gst.cgstreamer在开始的时候,都会调用gst_init初始化gstreamer,gst_init可以处理main函数的argc和argv变量,解析处理自己的option,加载plugin,注册插件等,完成初始化相关工作。gst_init函数很简单,调用gst_init_checkvoidgst_init (int *argc, char **argv[]){ GError *err = NULL; if (!gst_原创 2022-02-15 22:48:11 · 1601 阅读 · 1 评论 -
vscode调试gstreamer
vscode的debug和前面的qtcreator实际上是一样的,vscode需要安装Native Debug工具,配置json文件,配置好之后vscode用起来一样方便。原创 2022-01-29 11:21:29 · 1215 阅读 · 0 评论 -
gstreamer编译生成预处理文件看element定义
在gstreamer的代码中有大量的宏定义,代码阅读起来不是很方便,今天用gcc的-save-temps选项生成预处理文件,加以分析理解。下面以qtdemux为例,G_DEFINE_TYPE定义了gst_qtdemux_class_intern_init先看下G_DEFINE_TYPE的定义:// @TN: 新类型的名字// @t_n: 用`_`分隔的小写单词组成的类型名字// @T_P: GType类型的父类类型#define G_DEFINE_TYPE(TN, t_n, T_P) G_D原创 2022-01-17 22:29:24 · 598 阅读 · 0 评论 -
GstElementr的创建和释放
GstElement中的创建和释放GstElementGstElement是一个抽象的基类。GObject ╰──GInitiallyUnowned ╰──GstObject ╰──GstElement 所有elemetn都继承于GstElement,element用于构建pipeline。codec、mux/demux、filter等插件实际上都是一个 GstElement对象。element可以通过gst_element_factory_make原创 2022-01-10 20:49:02 · 1138 阅读 · 2 评论 -
qtcreator调试gstreamer-meson编译
gstreamer目前有cerbora和meson两种编译方式,meson是gstreamer现在合并到一个git仓库后用的编译方式,本文分享如何用qtcreator调试gstreamer。原创 2022-01-07 17:51:55 · 997 阅读 · 0 评论 -
使用Cerbero编译gstreamer
Cerbero是一个跨平台的开源项目构建聚合工具,可以为不同的平台、架构和发行版构建和创建本地包。它支持本地编译和交叉编译,可以在MacOS、Linux和Windows上运行。原创 2022-01-01 22:13:08 · 1004 阅读 · 0 评论 -
使用meson编译gstreamer
Meson构建系统是一个可移植的构建系统,它速度快,更容易使用。它可以生成构建指令,然后由ninja执行。在2021年9月,所有主要的GStreamer模块都被合并到一个代码库中,即GStreamer mono repo,它存在于主要的GStreamer git仓库中,现在GStreamer 1.19/1.20及以后的版本都在这里进行开发。在mono仓库合并之前,不同的GStreamer模块分布在不同的git仓库中,有一个单独的元构建项目,叫做gst-build,用于下载和构建所有的子项目。如果想针原创 2022-01-01 21:06:35 · 6799 阅读 · 34 评论 -
编译运行gstreamer android tutorials
这个教程是gst-doc里面的example,可以快速熟悉android上gstreamer的使用,使用很简单,现在gst-doc,然后导入tutorials到android studio里面,修改下sdk和ndk的路径,配置好gstAndroidRoot环境变量,修改个别配置就可以跑起来了,下面是记录比较重要的几个点。原创 2022-01-01 17:24:39 · 1363 阅读 · 0 评论 -
qtcreator调试gstreamer
安装qtcreatorCerbero编译gstreamer参考 Building from source using Cerbero,gstreamer通过Cerbero编译非常简单,可以在Readme.md中看到。下载cerbero$ git clone https://gitlab.freedesktop.org/gstreamer/cerbero gstreamer-cerbero下载后的代码路径为:/home/hui/gstreamer/gstreamer-cerbero配置编译e原创 2021-11-26 20:49:33 · 2496 阅读 · 0 评论