2013-08-08 10 views
1

나는 PySide의 Phonon 모듈 (Mac에서 차이가 나는 경우)을 사용하여 일부 .flac 파일을 재생하려고하지만 재생을 위해 사용할 수있는 mimetype이 아닙니다. 이 플러그인이나 설치해야하는 플러그인을 활성화하는 방법이 있습니까?Phonon에서 FLAC 파일을 재생할 수 있습니까?

답변

1

Phonon은 오디오 형식을 직접 지원하지는 않지만 기본 OS 기능을 사용합니다. 따라서 응답은 MIME 유형 audio/flac에 대해 등록 된 서비스가 있는지 여부에 따라 다릅니다. 나를 위해 존재하고 여기에 찾을 수있는 간단한 예제 스크립트입니다 :

from PySide import QtCore 
from PySide.phonon import Phonon 

if __name__ == '__main__': 
    app = QtCore.QCoreApplication([]) 
    app.setApplicationName('test') 

    mime_types = Phonon.BackendCapabilities.availableMimeTypes() 
    print(mime_types) 

    app.quit() 
+0

나는이 질문을 게시 한 후 잠시 작업을했습니다. 포논은 미디어 재생을 위해 Mac에서 Quicktime을 사용하므로, FLAC을 사용하려면 Quicktime을 설정해야합니다. –

1

당신은 PydubPyaudio

를 사용하여 FLAC를 포함한 모든 인기있는 오디오 포맷을 재생할 수있는 예제 코드 :

#-*- coding: utf-8 -*- 
from pydub import AudioSegment 
from pydub.utils import make_chunks 
from pyaudio import PyAudio 
from threading import Thread 


class Song(Thread): 

    def __init__(self, f, *args, **kwargs): 
     self.seg = AudioSegment.from_file(f) 
     self.__is_paused = True 
     self.p = PyAudio() 
     print self.seg.frame_rate 
     Thread.__init__(self, *args, **kwargs) 
     self.start() 

    def pause(self): 
     self.__is_paused = True 

    def play(self): 
     self.__is_paused = False 

    def __get_stream(self): 
     return self.p.open(format=self.p.get_format_from_width(self.seg.sample_width), 
          channels=self.seg.channels, 
          rate=self.seg.frame_rate, 
          output=True) 

    def run(self): 
     stream = self.__get_stream() 
     chunk_count = 0 
     chunks = make_chunks(self.seg, 100) 
     while chunk_count <= len(chunks): 
      if not self.__is_paused: 
       data = (chunks[chunk_count])._data 
       chunk_count += 1 
      else: 
       free = stream.get_write_available() 
       data = chr(0)*free 
      stream.write(data) 

     stream.stop_stream() 
     self.p.terminate() 

song = Song("song.flac") 
song.play() 
0

특정 폴더의 여러 노래를 재생하도록 선택할 수있는 일련의 수정을 통해 사용자가 숨겨진 파일을 보거나 오디오가 아닌 파일을 선택하지 못하도록 형식을 제한 할 수 있습니다. 이 게시물이 적절한 지 그리고 내 코드를 비판하는지 알려주세요. 나는 초보자입니다. 그리고 첫 번째 게시물은 @ S.O입니다. python3.x :

#-*- coding: utf-8 -*- 
from threading import Thread 
from pyaudio import PyAudio 
from pydub import * 
from pydub.utils import make_chunks 
from tkinter.filedialog import askopenfilenames 
from tkinter import Tk 
import time 

class Song(Thread): 
    def __init__(self, f, *args, **kwargs): 
     self.seg = AudioSegment.from_file(f) 
     self.__is_paused = True 
     self.p = PyAudio() 
     print(self.seg.frame_rate) 
     Thread.__init__(self, *args, **kwargs) 
     self.start() 

    def pause(self): 
     self.__is_paused = True 

    def play(self): 
     self.__is_paused = False 

    def __get_stream(self): 
     return self.p.open(format=self.p.get_format_from_width(self.seg.sample_width), 
          channels=self.seg.channels, 
          rate=self.seg.frame_rate, 
          output=True) 

    def run(self): 
     stream = self.__get_stream() 
     chunk_count = 0 
     chunks = make_chunks(self.seg, 100) 
     while chunk_count < len(chunks) and not self.__is_paused: 
       data = (chunks[chunk_count])._data 
       chunk_count += 1 
       stream.write(data) 

     stream.stop_stream() 
     self.p.terminate() 

Tk().withdraw() 
filename = askopenfilenames(initialdir='/default/path', title="choose your file(s)", 
          filetypes=(("audio files", "*.flac *.wav *.mp3 *.ogg"), ("none", ""))) 

# with this logic there is a short gap b/w files - os time to process, 
# trying to shorten gap by removing 
# 1 second from sleep time... works ok but will be system status 
# dependent and may not work across runs?? 
# Better would be to kill each tread when self._is_paused = True. 
# I have a bunch of active threads piling up 
for a in filename: 
    song = Song(a) 
    song.play() 
    songLength = song.seg.duration_seconds 
    time.sleep(songLength - 1)