应用上层了解如何基于gstreamer 的api来构建一个视频播放的应用
2.1 基于gstreamer api的MP3 播放
基本的一个流程
1、初始化gst, 开始一个主的循环,
2、定义一个pipeline 和 pipeline里面需要的元素比如有source decoder sink等。
3、设置必要组件的一些信息。
4、获取总线,监听总线的消息。
5、调用gst_bin_add_many将各个element 组成pipeline,然后调用gst_element_link_many,将这些组件链接在一起
6、设置pipeline的状态为playing。
7、开始执行这个主循环
8、在总线的监听回调函数中,如果监听到文件末尾的事件,就退出主循环。
9、代码示例:
GMainLoop *loop;
GstElement *pipeline,*source,*decoder,*sink;//定义组件
GstBus *bus;
gst_init(&argc,&argv);
loop = g_main_loop_new(NULL,FALSE);//创建主循环,在执行 g_main_loop_run后正式开始循环
if(argc != 2)
{
g_printerr("Usage:%s <mp3 filename>\n",argv[0]);
return -1;
}
//创建管道和组件
pipeline = gst_pipeline_new("audio-player");
source = gst_element_factory_make("filesrc","file-source");
decoder = gst_element_factory_make("mad","mad-decoder");
sink = gst_element_factory_make("autoaudiosink","audio-output");
if(!pipeline||!source||!decoder||!sink){
g_printerr("One element could not be created.Exiting.\n");
return -1;
}
//设置 source的location 参数。即 文件地址.
g_object_set(G_OBJECT(source),"location",argv[1],NULL);
//得到 管道的消息总线
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
//添加消息监视器
gst_bus_add_watch(bus,bus_call,loop);
gst_object_unref(bus);
//把组件添加到管道中.管道是一个特殊的组件,可以更好的让数据流动
gst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULL);
//依次连接组件
gst_element_link_many(source,decoder,sink,NULL);
//开始播放
gst_element_set_state(pipeline,GST_STATE_PLAYING);
g_print("Running\n");
//开始循环
g_main_loop_run(loop);
g_print("Returned,stopping playback\n");
gst_element_set_state(pipeline,GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
return 0;
2.2 qt mutlimedia
qt是通过QMediaPlayer来进行操作的。 QMediaPlayer集成了底部包括音频输出和音频文件读取等等操作,是一个高层次的,封装好的播放器内核,通过调用它,你可以实现输入任意格式的视频、音频播放,并实现对其播放状态的调整。
用QMediaPlayer来播放一段音乐的代码
player = new QMediaPlayer;
player->setMedia(QMediaContent(QUrl::fromLocalFile("coolsong.mp3")));
player->play();
第一步:创建QMediaplayer对象;第二步:设置当前播放的媒体文件;第三步:播放。
QMediaPlayer底层则是gstreamer经过一系列的封装 来提供实现的。
具体的流程
QMediaPlayer 经过一系列的调用 最后所有的操作都会调用到QGstreamerPlayerSession里。在 QGstreamerPlayerSession的构造函数中 调用gst_element_factory_make("playbin3", NULL);
创建好了gstreamer的 playbin pipeline,同时设置了playbin 的videoSink和AudioSink, 并监听了bus,最后对一些消息设置回调函数。如下图 所有QMediaPlayer的pause paly stop等播放控制的操作,最后都是对这个playbin 设置不同的状态。如play的操作:gst_element_set_state(m_playbin, GST_STATE_PLAYING)
在了解了gstreamer的基本概念和流程之后,就要深入gstreamer的源码去了解gstreamer的工作机制。