質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2121閲覧

kivyで音楽ファイルを任意の時間から再生したい

daichi3

総合スコア4

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/14 09:30

前提・実現したいこと

「kivyで任意の時間から音楽ファイルを再生したい。」

kivyを使用。
SoundLoaderのseek()で、
任意の時間から音楽ファイルを再生を開始したい。

発生している問題・エラーメッセージ

0秒から再生されてしまう。

該当のソースコード

python

1from kivy.app import App 2from kivy.uix.boxlayout import BoxLayout 3from kivy.uix.button import Button 4from kivy.core.audio import SoundLoader 5 6 7class MainScreen(App): 8 def __init__(self, **kwargs): 9 super().__init__(**kwargs) 10 11 def playing(self, *args): 12 self.sound.play() 13 self.sound.seek(5) 14 15 def build(self): 16 root = BoxLayout() 17 18 btn0 = Button(text='play') 19 self.sound = SoundLoader.load("music.wav") 20 btn0.bind(on_press = self.playing) 21 22 root.add_widget(btn0) 23 24 return root 25 26 27if __name__=="__main__": 28 MainScreen().run()

試したこと

self.sound.seek(int(5))もself.sound.seek('5')も同様に0秒から再生される。
self.sound.get_pos()はどういうわけか必ず0秒が帰ってくる。

補足情報(FW/ツールのバージョンなど)

kivy1.11.1を使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

オーディオのバックエンドによってはサポートされてないものが有るようですね。

kivy.core.audio.libs_loaded の値や起動時のログで確認

原因: ソースコード該当箇所


対策:

投稿2020/05/14 10:54

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daichi3

2020/05/15 04:20

ご回答ありがとうございます。 オフィシャルの説明にも載っているのに、そういったこともあるのですね。 https://kivy.org/doc/stable/api-kivy.core.audio.html ちなみに、上記サイトの関数?API?(勉強不足でなんと呼べばいいなかわからず恐縮です)の中で、 get_pos()とseek()が機能しませんでした。他のは機能しました。(loop, unloadは試していません) 対策をお示しいただき大変助かります。 勉強して環境の設定変更にトライしてみます。
guest

0

ベストアンサー

Clockを使ってseek()を遅らせるとどうなりますか?

python3

1 def playing(self, *args): 2 from kivy.clock import Clock 3 sound = self.sound 4 sound.volume = 0 5 sound.play() 6 def later(dt): 7 sound.seek(5) 8 sound.volume = 1 9 Clock.schedule_once(later, .1)

投稿2020/05/14 10:29

gottadiveintopy

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daichi3

2020/05/15 04:03

ご回答ありがとうございます。 ご教示いただいた書き方にしてみたところ、 聴覚上では0秒から始まっているようになりました。 (実際は再生後0.1秒に音が1になってでている) 例えばClockの時間を.1ではなく3にすると、再生ボタンを押したのち3秒経過した後、3秒時点から再生されます。 いずれにせよ、seek(5)はが機能していないようです。
gottadiveintopy

2020/05/15 19:09 編集

駄目でしたか...とりあえず以下の事を試してみるのをお勧めします。 1. 音が鳴っている最中にsound.get_pos()を呼んでその値が秒で表されているか確認 2. sound.seek()に与える数値を浮動小数点数にしてみる それで駄目なら @teamikl さんの言ってるようにAudio Providerを変えてみるとかですかね。 因みに現在のOSとAudio Providerは何ですか?環境の違いが原因の可能性もあるので。
gottadiveintopy

2020/05/15 07:51

いちおう私のlogは [INFO ] [Kivy ] v2.0.0rc1, git-ede9bd1, 20200320 [INFO ] [AudioGstplayer] Using Gstreamer 1.14.5.0 [INFO ] [Audio ] Providers: audio_gstplayer, audio_sdl2 (audio_ffpyplayer ignored) で使っているOSはUbuntu 18.04LTS派生なんですが普通にsound.seek()は機能していますね。
gottadiveintopy

2020/05/15 19:12

書き忘れてましたが上で勧めた事はseek()の遅延をしている状態でです。
daichi3

2020/05/18 03:21 編集

返信遅れまして申し訳ありません。 >1. 音が鳴っている最中にsound.get_pos()を呼んでその値が秒で表されているか確認 Clock.schedule_once(later, 3)にして、 def later内sound.volume=1の下にprint(sound.get_pos())をしてみたところ、 再生ボタンを押してから三秒後に、三秒経過した音源が再生され、0 とプリントされます。タイプを確認したところintでした。 .get_pos()も機能していないようです。 >2. sound.seek()に与える数値を浮動小数点数にしてみる sound.seek(5.0), sound.seek(float(5)) いずれも機能しないようでした。 >因みに現在のOSとAudio Providerは何ですか?環境の違いが原因の可能性もあるので。 OSですがその他のソフトの関係上、少し古くて、macOS Sierra を使っています。 アップデートすると、他のソフトの動作に支障をきたすので、この環境で可能な限りやれたらと思っています。 やはりこれが怪しいでしょうか。。 Audio Providerは、 [INFO ] [Audio ] Providers: audio_sdl2 (audio_ffpyplayer, audio_avplayer ignored) のようです。
gottadiveintopy

2020/05/18 13:04 編集

Audio ProviderにSDL2を使っているのが原因かもしれないので teamiklさんが貼ったlink先の情報を元にproviderを別の物(例えばffpyplayer)に換えてみると良いかもしれないです。
daichi3

2020/05/19 04:41 編集

確かにSDL2ではseek(), get_pos()は機能しなさそうですね。 いろいろと勉強になります。 ありがとうございます。 Audio Providerをffpyplayerに設定しようとしているのですが、どうもうまくいきません。 import os os.environ['KIVY_AUDIO'] = 'ffpyplayer' としているのにも関わらず、 [INFO ] [Audio ] Providers: (audio_avplayer, audio_sdl2, audio_ffpyplayer ignored) [WARNING] [Audio ] Unable to find a loader for </Volumes/hoge/music.wav> となってしまい、soundそのものが機能しなくなってしまいます。 ffpyplayerは、ffmpegを普段からよく使用しているのでインストールされているはずなのですが、何か私の認識に大きな勘違いがあるのだと思います。 ささいなヒントでもいただけますと幸いです。
daichi3

2020/05/19 15:02

はい、インストールいたしましたが、ダメでした。
gottadiveintopy

2020/05/20 01:16 編集

avplayerの方も試しましたか?
gottadiveintopy

2020/05/20 11:04 編集

これで駄目ならちょっともう私に思い浮かぶ節はないですね。後やるとすればKivyやSDL2_Mixerのversionを上げるとかになります。 追記: Audio ProviderにSDL2を使わない以上SDL2_Mixerは関係無いですね、ごめんなさい。
daichi3

2020/05/20 10:13

ご助言ありがとうございます。 だいぶ原因がしぼれたかと思います。 大変参考になりました。
gottadiveintopy

2020/05/21 13:02

avplayerがどうだったか教えてほしいのですが...
daichi3

2020/06/04 03:50

コメントを見落としておりました。 大変失礼いたしました。 avplayerも試しましたが、 同じく [Audio ] Providers: (audio_ffpyplayer, audio_sdl2, audio_avplayer ignored) Unable to find a loader for </Volumes/hoge/music.wav> となってしまい機能しません。
daichi3

2020/06/04 06:47

できました! anacondaに、conda install -c conda-forge ffpyplayer でインストールすることで、 [INFO ] [Audio ] Providers: audio_ffpyplayer, audio_sdl2 (audio_avplayer ignored) となり、無事、seekもget_posも機能いたしました! 環境構築についてよくわからないまま、python、kivyをしておりました。 私が環境構築について勉強不足なため、大変お手間をおかけしてしまいました。 根気強くアドバイスくださり誠にありがとうございます!
guest

0

$ conda install -c conda-forge ffpyplayer
でanacondaにffpyplayerをインストールすることで、
seek()が機能するようになった。

投稿2020/06/04 06:50

daichi3

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問