包含音频和视频的ogg文件的播放 – GStreamer实现

在这篇文章我写到了纯音频ogg文件的播放方法:

1
2
3
4
 
GstElement *vdoQueue = gst_element_factory_make ("queue", "video-queue");
GstElement *audioQueue = gst_element_factory_make ("queue", "audio-queue");
 

在需要开启线程的点之前加入queue element即可,然后再按实际情况链接各个元素。

为了让程序更加具有拓展性,需要获取ogg文件包含的数据流,根据数据流类型来决定是否需要两个线程来完成音频或视频的播放。如果不进行判断,直接加入两个queue element,则会出现一条不完整的链接,导致程序异常。

因为queue element需要等待pad added事件到来,再链接到demuxer的pad,如果只有一种数据流,pad added只会发生一次,也只能链接一个类型的queue element,剩下的则没有可链接的了。

至于为什么其中一条链接不完整会导致其他链接也不能正常工作,不知道它内部原理,所以就无法得知了。

 

一:获取ogg文件内部包含哪些编码格式 

ogg视频的编码格式为theora,音频的为vorbis,这里采用简单粗暴的办法,直接从ogg源文件的开头100多个字节中提取出字符串,如果里面包含theora,则含有视频流,包含vorbis则包含音频流,它的编码格式中应该是有说明需要在首部声明使用的编码方式的,用vim打开ogg文件即可以看到theora或者vorbis的字符串。

实现代码如下:

 

二:根据包含的流进行相应元素创建和连接

 

将上诉代码保存到 vdoAdoOGGPlayer.c

编译:

运行:

其中ogg文件可以是纯音频,纯视频,或者杂糅了音频和视频。