Gstreamer 显示图片

本文介绍使用GStreamer播放图片的方法,包括通过gst-launch命令快速播放图片和提供了一个C语言编写的示例程序,该程序详细展示了如何创建播放管道、添加元素、链接元素等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,通过简单的gst-launch命令可以进行picturename图片的播放:

gst-launch-0.10 filesrc location=/home/user/picturename.jpg ! jpegdec ! freeze ! autovideosink

gst-launch-0.10 filesrc location=/home/user/picturename.png ! pngdec ! freeze ! autovideosink


由于gstreamer播放视频的教程很多(尤其是playbin2),但播放图片的程序demo较少,因此这里贴下显示图片的demo仅供参考(以png文件为例):

#include <gst/gst.h>
#include <glib.h>

//声明所用到的element,总线bus,主循环loop
GstElement *pipeline, *source, *decoder, *freeze, *sink;
GstBus *bus;
GMainLoop *loop;


// 消息处理函数(EOS和ERROR)
static gboolean bus_call(GstBus *bus,GstMessage *msg,gpointer data)
{
    GMainLoop *loop = (GMainLoop *) data;//这个是主循环的指针,在接受EOS消息时退出循环
    switch (GST_MESSAGE_TYPE(msg))
    {
        case GST_MESSAGE_EOS:
            g_print("End of stream\n");
            g_main_loop_quit(loop);
            break;
        case GST_MESSAGE_ERROR:
        {
            gchar *debug;
            GError *error;
			gst_message_parse_error(msg,&error,&debug);
            g_free(debug);
            g_printerr("ERROR:%s\n",error->message);
            g_error_free(error);
            g_main_loop_quit(loop);
            break;
        }
        default:
             break;
    }
    return TRUE;
}

int main(int argc, char *argv[]) {
    // 初始化
    gst_init (&argc, &argv);
	// 创建主循环
    loop = g_main_loop_new (NULL, FALSE);
	
	//创建各个element,其中gst_element_factory_make第一个参数为gstreamer插件名称
    pipeline = gst_pipeline_new ("png-player");
    source = gst_element_factory_make ("filesrc", "file-source");
    decoder = gst_element_factory_make ("pngdec", "vorbis-decoder");
    freeze = gst_element_factory_make ("freeze", "image-freeze");
    sink = gst_element_factory_make ("autovideosink", "image-output");
    if (!pipeline || !source || !decoder || !freeze || !sink) {
        g_print ("One element could not be created\n");
        return -1;
    }

	//设置source文件路径
    g_object_set (G_OBJECT (source), "location", "/home/usr/logo.png", NULL);

	//获取播放管道的消息总线并设置获取消息后的回调函数
    bus = gst_pipeline_get_bus (GST_PIPELINE(pipeline));
    gst_bus_add_watch (bus, bus_call, NULL);

	//将各element添加到管道中
    gst_bin_add_many (GST_BIN (pipeline),source, decoder, freeze, sink, NULL);
 
	//依次连接各element
    gst_element_link_many (source, decoder, freeze, sink, NULL);

 	//开始播放,设置播放状态为GST_STATE_PLAYING
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
    g_print("Running\n");

    //开始主循环
    g_main_loop_run(loop);

   	//循环退出后,释放资源
    gst_object_unref (bus);
    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);
    return 0;
}

gstreamer的环境搭建及文件编译请参考其他博客

最后附上gstreamer实现简单MP3播放器的小程(大神的博客)  http://www.cnblogs.com/phinecos/archive/2009/06/07/1498166.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值