เล่นไฟล์เสียงด้วย Python


38

ฉันกำลังมองหาคลัง Python ที่ได้รับการดูแลเป็นอย่างดีพร้อมให้ฉันเล่นไฟล์เสียงบน Raspberry Pi ของฉันโดยใช้เอาต์พุตเสียงมาตรฐาน

จนถึงตอนนี้ฉันได้ลองหลายครั้งแล้ว แต่ดูเหมือนว่ามันไม่ได้ผลเลย แม้ว่า pyglet ทำงานได้ดีบนคอมพิวเตอร์ปกติของฉัน แต่มันก็ทำให้เกิดข้อผิดพลาดใน Raspberry Pi มี Python ไลบรารี่ที่พิสูจน์แล้วว่าใช้งานง่ายหรือไม่?


พิสูจน์แล้วว่าเป็นเรื่องง่ายที่จะใช้เป็นชนิดของญาติ แต่ผมโพสต์ทางเลือกที่จะ pygame คำถามที่คล้ายกันใน StackOverflow มากกว่าที่นี่ โดยพื้นฐานแล้วทางเลือกอื่นคือ vlc.py (โมดูล libVLC Python ซึ่งได้รับการดูแลเป็นอย่างดี)
Ben

คำถามอีกข้อหนึ่งบอกว่า Pyglet ใช้ได้กับ RPi คุณสามารถอัปเดตด้วยข้อผิดพลาดของคุณหรือไม่
Brian Bulkowski

คำตอบ:


31

ฉันขอแนะนำPygame ที่นิยมอย่างกว้างขวาง ฉันอาจจะผิด แต่ฉันเชื่อว่ามันติดตั้งไว้ล่วงหน้าใน Pi คุณสามารถใช้Pygame Mixer Music Moduleเพื่อเล่นไฟล์เสียง ฉันได้รวมโค้ดตัวอย่างด้านล่างแล้ว

myFile.wavสมมติว่าเรามีไฟล์เสียงที่เรียกว่า

import pygame
pygame.mixer.init()
pygame.mixer.music.load("myFile.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

หมายเหตุ:หากสิ่งนี้ล้มเหลวโปรดไปที่เทอร์มินัลแล้วอัปเดตระบบของคุณด้วย

apt-get update
apt-get upgrade

และลองอีกครั้ง


2
หากคุณมีมากกว่าหนึ่งเสียงในการเล่น (ซึ่งน่าจะเป็น) ควรสร้าง pygame.mixer.Sound วัตถุสำหรับแต่ละเสียงจากนั้นคุณสามารถเก็บคำจำกัดความของชื่อไฟล์เสียงไว้ในที่เดียว
รานซิส

นี่คือสิ่งที่ฉันต้องการ แต่เสียงเมนบอร์ดของฉันไม่มีไดรเวอร์ดังนั้นฉันจึงใช้การ์ดเสียง USB มันเล่นได้espeakดี แต่ไม่ใช่แบบนี้
SDsolar

10

ฉันต้องการสคริปต์เพื่อเล่นเพลงจากสามสิบวินาทีในพื้นหลังในขณะที่ตอบสนองต่อการป้อนข้อมูลของผู้ใช้คนอื่น ฉันต้องการให้มันจบเพลงในบางเหตุการณ์

ฉันไม่คิดว่ามันจะงดงามโดยเฉพาะอย่างยิ่ง แต่ฉันเปิดไปป์เป็นกระบวนการ MPlayer พื้นหลัง

import subprocess
player = subprocess.Popen(["mplayer", "song.mp3", "-ss", "30"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

จากนั้นเมื่อฉันต้องการที่จะยุติกระบวนการ MPlayer ฉันก็เขียน "q" เพื่อออกจากท่อ

player.stdin.write("q")

ดูเอกสารประกอบคำสั่ง MPlayer สำหรับคำสั่งทุกประเภทที่คุณสามารถทำได้ด้วยวิธีนี้เพื่อควบคุมการเล่น

หวังว่าจะเป็นประโยชน์บ้าง!


1
นี่มันเรียบร้อยจริงๆ บทแนะนำ adafruit นี้พูดถึงการเล่นเสียง แต่ไม่หยุด
gideon

6

ตัวเลือกอื่นคือการใช้mpg321และเรียกใช้จากบรรทัดคำสั่ง

apt-get install mpg321

จากนั้นใน Python:

import os

os.system('mpg321 foo.mp3 &')

Pygame เกือบจะแข็งแกร่งขึ้นอย่างแน่นอน แต่ขึ้นอยู่กับว่าฉันต้องการในสิ่งที่คุณต้องการ


1
ฉันคิดเกี่ยวกับเรื่องนี้ด้วยตัวเอง แต่ฉันคิดว่ามันไม่ได้สวยมากเพราะมันทำให้การควบคุมระดับเสียงหยุดชั่วคราวและอื่น ๆ ยากขึ้นมาก
สไตน์

นี่ช้ามาก
อเล็กซ์

3

ฉันจะแนะนำpygletมากกว่าpygameหากคุณไม่ต้องการกราฟิก ในมุมมองของฉันมันง่ายกว่าสง่างามและบำรุงรักษาได้ดีกว่า จากนั้นอีกครั้งฉันคาดหวังว่ามันอาจเป็นเรื่องของรสนิยม


1
ดังนั้นคุณจะใช้มันอย่างไร
SDsolar

pyglet ดูเหมือนว่าจะทำงานเมื่อมีการแสดงผลเท่านั้น เรียกใช้จากระยะไกลหรือเป็นดีมอนเพื่อจุดประสงค์ในการเล่นเสียงไม่ทำงาน
oh7lzb

0

Pygame ช่วยให้คุณโหลดและเล่นเสียงได้ง่ายและสะดวกในช่องสัญญาณต่าง ๆ


0

คุณสามารถใช้ผู้เล่นภายนอกผ่านทางท่อจำนวนหนึ่ง อย่างไรก็ตามคุณจะพบกับการสูญเสียความเร็วเกือบตลอดเวลา นอกจากนี้ยังมีปัญหากับการควบคุมการเล่น

ฉันขอแนะนำให้คุณ pyaudio มันทำงานได้ดี

หากคุณต้องการเล่นไฟล์บีบอัดเช่นกันฉันจะชี้คุณไปที่โมดูล decoder.py ของฉัน คุณสามารถค้นหาได้บน PyPI

นอกจากนี้ยังใช้กระบวนการย่อย แต่เรียกใช้ตัวถอดรหัสแทนผู้เล่น พวกเขาไม่ได้ใช้ CPU มากและบางคนรู้วิธีใช้การเร่งด้วยฮาร์ดแวร์ จากนั้นคุณสามารถใช้ pyaudio หรือบางสิ่งเพื่อส่งข้อมูลเสียงดิบ หากคุณต้องการคุณสามารถใช้ pygame โดยใช้ pygame.sndarray ด้วยวิธีนี้คุณสามารถเล่นรูปแบบได้มากกว่าการรองรับ pygame

ฉันลอง decoder.py ในสภาพแวดล้อม PyQT GUI ด้วย pyaudio และใช้ aplay เป็นผู้เล่นภายนอกด้วย นั่นคือราสเบอร์รี่ Pi บี

ผลลัพธ์ค่อนข้างน่าพอใจทั้งสองกรณี

ความเรียบง่ายสามารถถูกสอบสวน

decoder.py นั้นง่ายมาก แต่คุณต้องรวมเข้ากับ libs อื่นและจะเพิ่มบรรทัดโค้ด

มีตัวอย่างเกี่ยวกับวิธีเล่นไฟล์ที่มาพร้อมกับ decoder.py


0

ฉันใช้ OSMC (Debian) และได้รับเสียงเพื่อเล่นผ่านลำโพงทีวีซึ่งเชื่อมต่อด้วย HDMI https://youtu.be/p2ljmTE67gs

วิธีการของฉันก็ขึ้นอยู่กับวิธีการแก้ปัญหาดังกล่าวข้างต้นโพสต์โดย @xxmbabanexx เช่นเดียวกับที่นี่ โดยทั่วไปฉันมีการเพิ่มdtparam=audio=onการ/boot/config.txt


ฉันคิดว่า TS หมายถึงแจ็ค 3.5 มม. เมื่อพูดถึง "เอาต์พุตเสียงมาตรฐาน" ใช้งานได้กับแจ็ค 3.5 หรือไม่
Bex

อ้อเข้าใจแล้ว. อืมมันอาจจะไม่ถึงแม้ว่าฉันจะไม่ได้ลองก็ตาม
jjinking
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.