2010-06-07 7 views
10

파이썬으로 gstreamer 응용 프로그램을 연결합니다.파이썬 gst.LinkError 문제 Gstreamer

import pygst 
pygst.require('0.10') 
import gst 

import pygtk 
pygtk.require('2.0') 
import gtk 

# this is very important, without this, callbacks from gstreamer thread 
# will messed our program up 
gtk.gdk.threads_init() 

def main(): 
    pipeline = gst.Pipeline('pipleline') 

    filesrc = gst.element_factory_make("filesrc", "filesrc") 
    filesrc.set_property('location', 'C:/a.mp3') 

    decode = gst.element_factory_make("decodebin", "decode") 

    convert = gst.element_factory_make('audioconvert', 'convert') 

    sink = gst.element_factory_make("autoaudiosink", "sink") 

    pipeline.add(filesrc, decode, convert, sink) 
    gst.element_link_many(filesrc, decode, convert, sink) 

    pipeline.set_state(gst.STATE_PLAYING) 

    gtk.main() 

main() 

그리고 오류 : 그리고 난 다음 코드를 사용하여 LinkError 얻을 그것은 매우 이상하다

ImportError: could not import gio 
Traceback (most recent call last): 
    File "H:\workspace\ggg\src\test2.py", line 37, in <module> 
    main() 
    File "H:\workspace\ggg\src\test2.py", line 31, in main 
    gst.element_link_many(filesrc, decode, convert, sink) 
gst.LinkError: failed to link decode with convert 

, 같은 파이프 라인을하지만, parse_launch로 구축, 그것을 작동합니다. 여기에 코드가 있습니다 :

import pygst 
pygst.require('0.10') 
import gst 

import pygtk 
pygtk.require('2.0') 
import gtk 

# this is very important, without this, callbacks from gstreamer thread 
# will messed our program up 
gtk.gdk.threads_init() 

def main(): 
    player = gst.parse_launch('filesrc location=C:/a.mp3 ! decodebin ! audioconvert ! autoaudiosink') 
    player.set_state(gst.STATE_PLAYING) 
    gtk.main() 

main() 

여기에 질문 하나, 왜 수동 하나가 실패했지만 파싱 된 하나의 성공? 그게 뭐가 잘못 됐니? 어떻게 해결할 수 있습니까?

감사합니다.

+0

레코드의 경우 "ImportError : gio를 가져올 수 없습니다"라는 오류가 표시되지 않습니다. 나는 나머지 부분을 얻는다. 아래를 보라. –

답변

20

문제는 여기에 있습니다 :

gst.element_link_many(filesrc, decode, convert, sink) 

이유는 모든 요소가 간단하고, 정적 입력과 출력을 가지고있다. 프로그램의이 시점에서, 디코드 빈에는 소스 패드이 없습니다 (즉, 출력 없음).

패드는 젖꼭지와 같으며 요소에 대한 입력/출력입니다. 패드가 나타나거나, 사라지거나, 그냥 앉아있을 수 있습니다. 정적 패드 (가장 쉽고 기대되는 것), 요청 패드 (요청할 때만 나타나는) 및 패드가 때때로 패드를 만들 때만 나타나는 패드 유형입니다. 그들이 나타난다). decodebin의 출력은 이고 때로는 패드입니다. 당신이 gst-inspect decodebin의 출력을 검사하는 경우

, 당신은 자신이 볼 수 있습니다 : 그것은 어떤 소스를 가지고 있지 않기 때문에 프로그램의 라인 (26)에

Pad Templates: 
    SINK template: 'sink' 
    Availability: Always 
    Capabilities: 
     ANY 

    SRC template: 'src%d' 
    Availability: Sometimes 
    Capabilities: 
     ANY 

, 당신은 아무것도에 디코드를 링크 할 수 없습니다 연결할 패드. 디코드 빈의 소스 패드는 입력 스트림이 디코딩 될 때만 나타납니다. 즉석에서 발생하지는 않습니다. 임의의 수의 소스 패드가 나타날 수있다 (예를 들어, 오디오 스트림에 대해서는 하나, 오디오를 갖는 비디오 스트림에 대해서는 2 개, 디코딩 불가능한 스트림에 대해서는 하나도 없음).

패드가 만들어 질 때까지 기다렸다가 연결해야합니다. decodebin은 "new-decoded-pad"라는 신호를 내고 이것이 언제 발생하는지 알려줍니다 (이 내용은 gst-inspect decodebin에 기록되어 있습니다). 콜백 함수를이 신호에 연결하고 디코드 및 audioconvert를 콜백에 연결해야합니다. 당신을 위해 모든 niggly 세부 사항을 담당하기 때문에

#!/usr/bin/python 

import pygst 
pygst.require('0.10') 
import gst 

import pygtk 
pygtk.require('2.0') 
import gtk 

# this is very important, without this, callbacks from gstreamer thread 
# will messed our program up 
gtk.gdk.threads_init() 

def on_new_decoded_pad(dbin, pad, islast): 
    decode = pad.get_parent() 
    pipeline = decode.get_parent() 
    convert = pipeline.get_by_name('convert') 
    decode.link(convert) 
    pipeline.set_state(gst.STATE_PLAYING) 
    print "linked!" 

def main(): 
    pipeline = gst.Pipeline('pipleline') 

    filesrc = gst.element_factory_make("filesrc", "filesrc") 
    filesrc.set_property('location', 'C:/a.mp3') 

    decode = gst.element_factory_make("decodebin", "decode") 

    convert = gst.element_factory_make('audioconvert', 'convert') 

    sink = gst.element_factory_make("autoaudiosink", "sink") 

    pipeline.add(filesrc, decode, convert, sink) 
    gst.element_link_many(filesrc, decode) 
    gst.element_link_many(convert, sink) 

    decode.connect("new-decoded-pad", on_new_decoded_pad) 

    pipeline.set_state(gst.STATE_PAUSED) 

    gtk.main() 

main() 

gst.parse_launch 작품 : 여기 수정 된 코드입니다. 내부에 디코드 빈을 자동으로 생성하고 링크하는 상위 요소 인 playbin도 있습니다.

+0

[Decodebin] (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-components-decodebin.html)도 설명한다. GStreamer 애플리케이션 개발 매뉴얼. – Dejan