GStreamer中解复用器(Demuxer)

在 GStreamer 中,解复用器(Demuxer) 用于分离容器格式(如 MP4、MKV、AVI 等)中的 视频、音频、字幕等流。不同的容器格式需要不同的 Demuxer 元素。

一、常见的 GStreamer Demuxer 元素

1. MP4 / QuickTime 格式

qtdemux

用于解析 MP4(.mp4)、MOV(.mov) 等基于 QuickTime 容器格式的文件。

动态生成 video_%uaudio_%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_%uaudio_%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) 文件。

动态生成 videoaudio 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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容