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がそういうスタンスだからだが。。。