Filesrc源码分析

概述

根据上一篇博客的介绍,我们知道对于filesrc类我们只需完成其静态方法即可,调用逻辑则由pipeline/bin来完成。这里额外要提的是filesrc是继承basesrc的,basesrc是所有src类型element的一个模板,其接口完成了状态切换管理、Pad协商、内存分配器协商等等一系列逻辑。filesrc仅仅重载了basesrc的部分接口,如果不想使用basesrc的默认提供的逻辑,也可自己通过重载进行替换。

代码分析

filesrc类的成员和方法的介绍可参见:filesrc官方介绍,官方介绍中详细描述了每个属性和接口的功能。由于filesrc 类并未额外声明接口,其源码所实现接口也全都是重载basesrc接口,因此想了解这些接口的功能,需要查阅basesrc的官方介绍。此处额外补充各个接口的调用逻辑,这样针对filesrc的代码逻辑就一目了然了。

如下便是笔者通过添加打印得出的filesrc函数调用时序。通过该调用时序,我们能窥探出Pipeline的各个阶段需要准备的事情。

  • 【NULL】to【READY】阶段:创建元素的实例。
  • 【READY】to【PAUSED】阶段:打开文件句柄,获取文件流信息。
  • 【PAUSED】to【PREROLL】阶段:成功读取了第一个buffer的数据。
  • 【PLAYING】阶段:源源不断的将读取文件数据,并填充到指定buffer中,直到读完数据返回GST_FLOW_EOS。
  • 【PLAYING】to【PAUSED】阶段:具体实现对filesrc是透明的。
  • 【PAUSED】to【READY】阶段:具体实现对filesrc是透明的。
  • 【READY】to【NULL】阶段:关闭文件句柄
$ gst-launch-1.0 filesrc location=/oem/200frames_count.h264 ! filesink location=/tmp/flc.h264

FLC-DBG:[GstFileSrc] <gst_file_src_class_init> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_init> is called!
Setting pipeline to PAUSED ...
FLC-DBG:[GstFileSrc] <gst_file_src_start> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_is_seekable> is called!
Pipeline is PREROLLING ...
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_fill> is called!
FLC-DBG:[GstFileSrc] <gst_file_src_get_size> is called!
Got EOS from element "pipeline0".
Execution ended after 0:00:00.009744000
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
FLC-DBG:[GstFileSrc] <gst_file_src_stop> is called!
Setting pipeline to NULL ...
Freeing pipeline ...
FLC-DBG:[GstFileSrc] <gst_file_src_finalize> is called!
`rtph264depay` 和 `filesrc` 都是 GStreamer 中的元素,用于处理实时流和文件流。 `rtph264depay` 元素用于将 RTP 中的 H264 数据流还原为原始的 H264 压缩数据流。例如,如果您从网络上接收实时的 RTP 流并且该流包含 H264 数据,则可以使用 `rtph264depay` 元素将 RTP 流还原为 H264 数据流。 以下是使用 `rtph264depay` 元素的示例 GStreamer 命令行: ``` gst-launch-1.0 udpsrc port=5000 ! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! mp4mux ! filesink location=output.mp4 ``` 在这个命令中,`udpsrc` 元素从 UDP 端口 5000 接收 RTP 数据。`rtph264depay` 元素将 RTP 数据还原为 H264 数据流。`h264parse` 元素解析 H264 数据流。`mp4mux` 元素将 H264 数据流封装为 MP4 容器格式。最后,`filesink` 元素将 MP4 文件写入磁盘。 `filesrc` 元素用于从本地文件系统中读取文件。例如,如果您要从本地文件系统中读取 H264 数据流,则可以使用 `filesrc` 元素。 以下是使用 `filesrc` 元素的示例 GStreamer 命令行: ``` gst-launch-1.0 filesrc location=input.h264 ! h264parse ! mp4mux ! filesink location=output.mp4 ``` 在这个命令中,`filesrc` 元素从本地文件系统中读取名为 input.h264 的文件。`h264parse` 元素解析 H264 数据流。`mp4mux` 元素将 H264 数据流封装为 MP4 容器格式。最后,`filesink` 元素将 MP4 文件写入磁盘。 请注意,这些命令仅用于示例目的。您需要根据自己的需求调整输入和输出参数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值