집에서 Whole Home Audio 시스템을 제어 할 Gstreamer Python 프로그램을 작성하려고합니다. 기본적인 전제는 내가 소스 (판도라, MP3, 구글 뮤직 등)에 대해 여러 가지 옵션을 가질 것이고, 내 집에서 다른 "존"에서 재생할 수 있다는 것이다. 현재 재생중인 파이프 라인에 영역을 동적으로 추가하기 위해 작동하도록했지만, 영역을 제거하려고 시도하면 오디오가 모든 영역에서 재생되는 것을 멈 춥니 다. 아마 전체 파이프 라인이 일시 정지로 전환Python Gstreamer에서 동적 오디오 장치를 추가 및 제거하는 방법
def __init__(self, username, password, zones=[]):
# initialize the player
self.player = gst.element_factory_make('playbin2', 'pandora_player')
fakesink = gst.element_factory_make('fakesink', 'fakesink')
self.player.set_property('video-sink', fakesink)
# enable progressive download (GST_PLAY_FLAG_DOWNLOAD)
self.player.props.flags |= (1 << 7)
# create bin
teebin = gst.element_factory_make('bin', 'master')
tee = gst.element_factory_make('tee', 'tee')
teebin.add(tee)
ghost_pad = gst.GhostPad('sink', tee.get_pad('sink'))
teebin.add_pad(ghost_pad)
# set bin as audio sink
self.player.set_property('audio-sink', teebin)
# set volume
self.player.set_property('volume', 0.01)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect('message', self.on_message)
# make everything accessible
self.tee = tee
self.teebin = teebin
def add_zone(self, zone_id):
# create out first audio output device
zone_name = 'zone_{0}'.format(zone_id)
device_name = 'mono{0}'.format(zone_id)
bin_name = 'bin_{0}'.format(zone_id)
queue_name = 'q_{0}'.format(zone_id)
# wrap everything in a convenient zone object
zone = gst.element_factory_make('bin', bin_name)
# handle sending to the proper sound device
zone_device = gst.element_factory_make('alsasink', zone_name)
zone_device.set_property('device', device_name)
# create a queue to handle asynchronous playback
zone_queue = gst.element_factory_make('queue', queue_name)
zone.add(zone_queue, zone_device)
zone_queue.link(zone_device)
# add sink into element
zone_ghost = gst.GhostPad('sink', zone_queue.get_pad('sink'))
zone.add_pad(zone_ghost)
self.zones[zone_id] = zone
self.teebin.add(zone)
zone.sync_state_with_parent()
self.tee.link(zone)
def remove_zone(self, zone_id):
# get zone
zone = self.zones[zone_id]
# get src pad that is sending audio
pad = zone.get_pad('sink').get_peer()
# block src pad
pad.set_blocked(True)
# set zone state null
zone.set_state(gst.STATE_NULL)
# unlink and remove zone
self.tee.unlink(zone)
self.teebin.remove(zone)
# remove zone reference
del self.zones[zone_id]
그 설명을 발견했습니다. 불행히도, 그들은 한 요소를 다른 것으로 대체하는 것에 대해 이야기하고 있습니다. 나는 단순히 요소를 모두 제거하려고 시도하고있다. 그래서 게시 한 기사에서 권장하는대로 src 패드를 차단하지만 더 이상 필요하지 않기 때문에 완전히 제거합니다. – Amazinzay
element1과 element3을 다시 연결해도 작동하지 않습니까? 또 다른 "트릭"은 대기열을 대체품으로 삽입하는 것일 수 있습니다. –