Можно ли воспроизводить файлы FLAC на Phonon?

Я пытаюсь воспроизвести некоторые файлы.flac, используя модуль Phonon PySide (на Mac, если это имеет значение), но это не доступный mimetype для воспроизведения. Есть ли способ включить это или плагин, который мне нужно установить?

3 ответа

Решение

Phonon напрямую не поддерживает аудиоформаты, но использует основные возможности ОС. Поэтому ответ зависит от того, есть ли сервис, зарегистрированный для типа 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()

Вы можете воспроизводить все популярные аудио форматы, включая flac, используя Pydub и Pyaudio

Пример кода:

#-*- 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()

Вот ряд изменений, которые позволят выбрать для воспроизведения несколько песен из любой одной папки, ограничивая форматы, чтобы пользователь не мог видеть скрытые файлы или выбирать не аудио файлы. Пожалуйста, дайте мне знать, если это был подходящий пост, и критикуйте мой код - жестко, но тщательно, если вы это сделаете. Я новичок... И мой первый пост здесь @ SO В 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)
Другие вопросы по тегам