我在Python-GStreamer中创建一个玩家,在一个非常过时的GStreamer 0.10.32上,像这样:
import pygst
pygst.require("0.10")
import gst
import gobject
self.__player = gst.parse_launch(
'filesrc name="source" location="/file/here.mp3" '
'! audio/mpeg, mpegversion=1, layer=3 '
'! ffdec_mp3 '
'! audioconvert ! audioresample ! volume name="vol" '
'! alsasink name="sink" sync=false')
它工作正常,但我从来没有从播放器的总线上收到标签消息。我确实需要id3标签。
所以我用audio/mpeg, mpegversion=1, layer=3
替换了大写过滤器(id3demux
),某些MP3上出现错误:" streaming task paused, reason not-linked (-1)
"。
将identity
或queue
放在前面并链接到它们对id3demux
没有帮助。
由于某些原因,我的平台上没有mad
元素。
为什么赢得了我的第二次替换工作,还是有另一种方法从流中获取id3标签?
编辑:显然,这是由特定文件引起的。不知道那些MP3有什么特别之处。当我使用gst-launch
测试管道时,也会发生这种情况。
GST_DEBUG = 2,我得到了:
0:00:00.046048767 32720 0x22388a0 WARN tagdemux gsttagdemux.c:680:gst_tag_demux_chain:<id3demux0> Downstream did not handle newsegment event as it should
0:00:00.046096615 32720 0x22388a0 WARN basesrc gstbasesrc.c:2625:gst_base_src_loop:<source> error: Internal data flow error.
0:00:00.046106087 32720 0x22388a0 WARN basesrc gstbasesrc.c:2625:gst_base_src_loop:<source> error: streaming task paused, reason not-linked (-1)
使用大写过滤器替换id3demux
会有所帮助,但我从未获得过标记。
答案 0 :(得分:2)
我最终诉诸playbin2
。它设法构建一个工作流水线,以某种方式发送标签消息。