在 GStreamer 中,解复用器(Demuxer) 用于分离容器格式(如 MP4、MKV、AVI 等)中的 视频、音频、字幕等流。不同的容器格式需要不同的 Demuxer 元素。
一、常见的 GStreamer Demuxer 元素
1. MP4 / QuickTime 格式
qtdemux
用于解析 MP4(.mp4)、MOV(.mov) 等基于 QuickTime 容器格式的文件。
动态生成 video_%u、audio_%u 等 Pad。
示例:
bash
gst-launch-1.0 filesrc location=video.mp4 ! qtdemux name=demux
demux.video_0 ! queue ! h264parse ! avdec_h264 ! autovideosink
demux.audio_0 ! queue ! aacparse ! avdec_aac ! autoaudiosink
2. Matroska / WebM 格式
matroskademux
用于解析 MKV(.mkv)、WebM(.webm) 文件。
动态生成 video_%u、audio_%u 等 Pad。
示例:
bash
gst-launch-1.0 filesrc location=video.mkv ! matroskademux name=demux
demux.video_0 ! queue ! av1dec ! autovideosink
demux.audio_0 ! queue ! vorbisdec ! autoaudiosink
3. AVI 格式
avidemux
用于解析 AVI(.avi) 文件。
动态生成 video、audio Pad。
示例:
bash
gst-launch-1.0 filesrc location=video.avi ! avidemux name=demux
demux.video ! queue ! mpeg4videoparse ! avdec_mpeg4 ! autovideosink
demux.audio ! queue ! mp3parse ! avdec_mp3 ! autoaudiosink
4. MPEG-TS / MPEG-PS 格式
tsdemux
用于解析 MPEG-TS(.ts、.m2ts) 流(如数字电视、DVB 流)。
示例:
bash
gst-launch-1.0 filesrc location=stream.ts ! tsdemux name=demux
demux.video_0 ! queue ! h264parse ! avdec_h264 ! autovideosink
demux.audio_0 ! queue ! aacparse ! avdec_aac ! autoaudiosink
mpegpsdemux
用于解析 MPEG-PS(.vob、.mpg) 文件(如 DVD 视频)。
5. FLV 格式
flvdemux
用于解析 FLV(.flv) 文件(Flash 视频)。
示例:
bash
gst-launch-1.0 filesrc location=video.flv ! flvdemux name=demux
demux.video ! queue ! vp6dec ! autovideosink
demux.audio ! queue ! mp3dec ! autoaudiosink
6. OGG 格式
oggdemux
用于解析 OGG(.ogg、.ogv) 文件(如 Vorbis 音频、Theora 视频)。
示例:
bash
gst-launch-1.0 filesrc location=audio.ogg ! oggdemux name=demux
demux.audio_0 ! queue ! vorbisdec ! autoaudiosink
通用 Demuxer
decodebin / uridecodebin
自动检测容器格式,并选择合适的 Demuxer 和解码器。
适用于 不确定输入格式 的情况。
示例:
bash
gst-launch-1.0 uridecodebin uri=file:///video.mp4 ! autovideosink
如何查看系统支持的 Demuxer?
在终端运行:
bash
gst-inspect-1.0 | grep demux
会列出所有可用的 Demuxer 插件,例如:
text
qtdemux
matroskademux
avidemux
tsdemux
flvdemux
oggdemux
...
示例代码
static void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
// 检查是否是视频 Pad
if (g_str_has_prefix(gst_pad_get_name(pad), "video")) {
g_print("Found video pad: %s
", gst_pad_get_name(pad));
// 进行视频 Pad 的连接操作...
}
}
// 创建 Pipeline
GstElement *pipeline = gst_pipeline_new("my-pipeline");
GstElement *src = gst_element_factory_make("filesrc", "file-source");
GstElement *parse = gst_element_factory_make("qtdemux", "demux");
GstElement *video_dec = gst_element_factory_make("avdec_h264", "h264-decoder");
GstElement *sink = gst_element_factory_make("autovideosink", "video-sink");
// 设置文件路径
g_object_set(src, "location", "test.mp4", NULL);
// 将所有元素添加到 Pipeline
gst_bin_add_many(GST_BIN(
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END

















暂无评论内容