読者です 読者をやめる 読者になる 読者になる

ひこぽんのーと

覚書と雑記です。

pythonで音声を再生するのこと その3

その2の続き。

再生の手順としては、基本的にpygameの時とは変わらない。

ライブラリの初期化 → 音声のロード → 再生・停止 → ライブラリの開放

といった手順はわかるものの、どう書くのか。
pythonのサンプルも見つけられなかったので、
sdl-mixerのサイトからダウンロードできるC用のサンプルを参考に作ってみた。

一応、使う関数は以下の通り。

パッケージ 関数 備考
sdl2 SDL_Init ライブラリの初期化。
引数に初期化対象を指定する必要がある。
pygame.init()に当たる。
sdl2 SDL_Quit ライブラリの開放。
sdl2.sdlmixer Mix_Init ミキサーの初期化。再生対象のファイル形式を指定する。
pygame.mixer.init()にあたる。
sdl2.sdlmixer Mix_OpenAudio ミキサーの再生クオリティを指定する。
pygame.mixer.init()にあたる。
sdl2.sdlmixer Mix_LoadMUS 音声ファイルの読み込み。
pygame.mixer.music.load()にあたる。
sdl2.sdlmixer Mix_PlayMusic 音声ファイルの再生。
pygame.mixer.music.play()にあたる。
sdl2.sdlmixer Mix_PauseMusic 再生の停止。
pygame.mixer.music.pause()にあたる。
sdl2.sdlmixer Mix_FreeMusic 音声ファイルの開放。

以下にソース。

# -*- coding: utf-8 -*-

from ctypes import *
from sdl2 import *
from sdl2.sdlmixer import *
from time import sleep


if __name__ == u"__main__":
	SDL_Init(SDL_INIT_AUDIO)
	Mix_Init(MIX_INIT_MP3)
	Mix_OpenAudio(22050, AUDIO_S16, 2, 4096)

	path = c_char_p(b"MP3のファイルパス")
	music = Mix_LoadMUS(path)
	Mix_VolumeMusic(64)
	Mix_PlayMusic(music, 1)
	sleep(300)
	Mix_PauseMusic()
	Mix_FreeMusic(music)
	SDL_Quit()

とまぁ、簡単に音が出る、けれど、注意点もある。

関数呼び出しのパラメータと復帰値については注意が必要。
基本、こいつらはCの型を要求する。
pythonの型からCの型へ変えてやらないと、うまく実行できない。*1
Mix_LoadMUSの引数は、libsdl-mixerでは、char *なので、
ここではctypesを使って、byte列をCのchar *に変えて渡している。
また、ここではチェックを省いているが、
復帰値は関数実行の成否を表しているので、都度、チェックを行い、
エラー時には中断するなりのエラーハンドリングを書いてやる必要がある。

それさえ気をつければ、pygameのように扱える、と思う。

*1:正確にはpysdl2がそういうスタンスだからだが。。。