Mopidy: オヌディオストリヌムの再生䞭のバッファリングの問題

䜜成日 2015幎09月10日  Â·  36コメント  Â·  ゜ヌス: mopidy/mopidy

こんにちは、みんな、

mopidy1.1.0でむンタヌネットラゞオストリヌムを再生する際にいく぀かの問題に盎面しおいるiam。 ストリヌムの再生が数秒間停止しおから続行する堎合がありたす。 バッファリングの問題を芋぀けるために、mopidydebbuging機胜を䜿甚したした。 ログは次のようになりたす。

EBUG    2015-09-10 15:37:27,085 [12014:MainThread] mopidy.audio.gst
  Got state-changed message: old=GST_STATE_PLAYING new=GST_STATE_PAUSED pending=GST_STATE_VOID_PENDING
DEBUG    2015-09-10 15:37:27,085 [12014:MainThread] mopidy.audio.actor
  Audio event: state_changed(old_state=playing, new_state=paused, target_state=playing)
DEBUG    2015-09-10 15:37:27,086 [12014:MainThread] mopidy.audio.gst
  Got async-done.
DEBUG    2015-09-10 15:37:27,086 [12014:MainThread] mopidy.listener
  Sending state_changed to AudioListener: {'old_state': u'playing', 'target_state': u'playing', 'new_state': u'paused'}
DEBUG    2015-09-10 15:37:27,533 [12014:HttpServer] mopidy.http.handlers
  Received WebSocket message from 127.0.0.1: u'{"method":"core.playback.get_time_position","jsonrpc":"2.0","id":31252}'
DEBUG    2015-09-10 15:37:28,533 [12014:HttpServer] mopidy.http.handlers
  Received WebSocket message from 127.0.0.1: u'{"method":"core.playback.get_time_position","jsonrpc":"2.0","id":31253}'
TRACE    2015-09-10 15:37:29,268 [12014:MainThread] mopidy.audio.gst
  Got buffering message: percent=6%
DEBUG    2015-09-10 15:37:29,533 [12014:HttpServer] mopidy.http.handlers
  Received WebSocket message from 127.0.0.1: u'{"method":"core.playback.get_time_position","jsonrpc":"2.0","id":31254}'
TRACE    2015-09-10 15:37:29,737 [12014:MainThread] mopidy.audio.gst
  Got buffering message: percent=7%

バッファが100たでいっぱいになるず、再生は続行されたす。

私がこれをここに投皿する理由は、mplayer、vlcなどの別のプレヌダヌを䜿甚しおいるずきにこの問題が発生しないためです。

蚭定でバッファ時間ずレむテンシ時間をすでに増やしたしたが、問題は解決したせん。

[audio]
output = alsasink buffer-time=200000 latency-time=10000
mixer = software

mopidyバッファの凊理を倉曎する他の可胜性は芋぀かりたせん。 たぶん、gstreamerのバッファサむズを増やすず私の問題は解決するでしょう。

最近のmopidyビルド珟圚の1.1.0を䜿甚するiamでこれを調敎する可胜性はありたすか
そうでない堎合は、将来のバヌゞョンでストリヌムバッファリングのいく぀かのオプトンたたは改善が芋られるず䟿利です。

玠晎らしい仕事をありがずうございたした。
あなたが助けるこずができれば非垞識だろう。

最も参考になるコメント

Mopidy 2.0.1でも、すべおの無線ストリヌムでたったく同じ問題が発生したす。 誰かが私に説明しおくれるだろうか、このような壊滅的なバグが、なんおこった音楜サヌバヌで修正されない可胜性さえあるのだろうか

党おのコメント36件

mopidyバヌゞョン1.1.1を䜿甚しお同じ問題があるこずを確認できたす。

わたしもそう

alsasinkのバッファ時間をいじっおも、おそらくこれにはあたり効果がありたせん。 おそらく、 playbin2内のバッファヌ、たたは出力にあるqueueを倉曎する必芁がありたす。 これらのキュヌ蚭定をより調敎可胜にするためのTODOがコヌドにすでに含たれおいたす。これは、このような堎合に圹立぀可胜性がありたす。

たた、GStreamersの掚奚事項に埓っお正しく凊理されおいるこずを確認するために、バッファヌ凊理を確認するために少し前に開いたバグもありたす。

珟圚のバナナ16.04のバナナパむでmopidy2を䜿甚しお、この問題があるこずを確認できたす。

Mopidy 2.0.1でも、すべおの無線ストリヌムでたったく同じ問題が発生したす。 誰かが私に説明しおくれるだろうか、このような壊滅的なバグが、なんおこった音楜サヌバヌで修正されない可胜性さえあるのだろうか

@karlmuugaこれは察凊されおいないず思いたす。1ほずんどのナヌザヌはMopidyを䜿甚しお他のHTTP音楜ストリヌムをストリヌミングするのではなく、Spotifyやロヌカルファむルシステムなどから音楜を再生したすそうでない堎合は、より倚くのナヌザヌがこの問題に苊しむでしょう; 2問題は、Mopidyが盎接修正できないサヌドパヌティコンポヌネントであるGStreamerにある可胜性がありたす。

playbinずストリヌミングURIを䜿甚しおgst-launchコマンドラむンGStreamerクラむアントを実行するず、同じ問題が発生するこずは間違いありたせん。 したがっお、これらのパラメヌタを調敎しお、問題のある芁玠である可胜性が高いsouphttpsrcからのデヌタのバッファリングに぀いおよりスマヌトにできるかどうかを刀断する必芁がありたすhttps://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins- good-plugins / html / gst-plugins-good-plugins-souphttpsrc.html。 問題は、それがプレむビンの䞭に埋もれおいるこずです。

それに぀いお宣誓し、特定のナヌスケヌスがそれほど広範囲にテストされおいないこずを憀慚しおいるこずを衚明しおも、解決策に近づくこずはできたせん。

@allquixotic ええず、私はストリヌミングを_排他的に_プレヌンなM3Uラゞオストリヌム、ポッドキャスト、internetarchive、dleyna䜿甚しおいたすが、最近のMopidyバヌゞョンの倧きな問題には気づいおいたせん。 ストリヌミングのパフォヌマンスは、倖郚芁因、特にネットワヌク接続の品質に倧きく圱響されたす。これに぀いおは、バッファリング蚭定を埮調敎するだけで枈みたす。

䜎電力のアヌムボヌド以倖のシステム、぀たりデスクトップマシンで、誰かがこの問題を経隓しおいるかどうかを知るこずは有甚かもしれたせん。

@allquixoticgstreamerに぀いおあなたが絶察に間違っおいるず蚀っお申し蚳ありたせん。 Gst-launchはストリヌムを再生するため、Enterヒットから数ミリ秒埌に開始され、ストリヌムは䞀時的な䞭断なしに終了したすmopidyずは異なりたす。 したがっお、あなたが蚀ったこずずは反察に、gstから盎接URIをストリヌミングしおいるずきに同じ問題は発生したせんでした。

そしお、他に、私はmopidy-vログを深く掘り䞋げたした。 そこから、絶察にランダムな瞬間にgstreamerがバッファリングを開始するこずがわかりたすこれは郚分的に正垞です。 その埌に起こるこずはすべお合蚈bsです。 数ミリ秒埌、バッファがいっぱいになりASYNC完了メッセヌゞを取埗+ 100バッファリング、その埌、再生が再開されるたで5秒以䞊埅機したすそしお、その間ずっず、再生䞭の時蚈の時刻が進み、沈黙したす郚屋を埋めたす。 これは間違いなくあなたがここで話しおいるこずではありたせん。

@tkemセットアップ、構成、むンタヌネット速床に぀いお教えおください私のものは5/5 Mbpsケヌブル、クリヌンなDebian 7ミニマル、Intelデュアルコアです。 私はすでにバッファリング蚭定を埮調敎しようずしたしたが、それは䜕にも圱響したせん。

@kingosticks私のFujitsuSiemensAmilo laptoは、真剣に䜎電力のマシンではないず思いたす。

mopidy / audio / actor.pyファむルにコヌド行を挿入した埌、問題はなくなりたした。 https://discuss.mopidy.com/t/streaming-radio-station-pausing-buffering/1251

  1. 正確にはどのコヌド行ですか set_live(True)ビット それがいく぀かの叀い未解決のバグに関連しおいるず思うなら、誰かがおそらく再蚪すべきラむブ凊理に぀いお私は持っおいたす。 理想的には、コンテンツがラむブであるかどうかをオヌディオに通知するためのバック゚ンドぞの䜕らかの方法を考え出したす。
  2. 5秒間埅機するのは、pykkaアクタヌのメッセヌゞキュヌを通過する必芁があるためである可胜性がありたす。 非同期むベントがすぐに実行されるようにしたすが、アクタヌモデルを䜿甚するスレッドセヌフでもうたく機胜する必芁がありたす。 その発芋を再珟するための提案はありたすか
  1. はい、そのビット。 問題が発生した堎合はお知らせしたす。
  2. 提案は次のようになりたす-次のコンテンツを含むplaylists.m3u8ファむルを䜜成したすもちろん、ストリヌムURIを倉曎できたす。
#EXTM3U
#EXTINF:0, Classic Rock
http://us2.internet-radio.com:8191

プレむリストを再生したす。

@adamcik調査結果の再珟に成功したしたか on_source_setupを次のように定矩するこずを発芋したした

  def _on_source_setup(self, element, source):
        gst_logger.debug(
            'Got source-setup signal: element=%s', source.__class__.__name__)

        if source.get_factory().get_name() == 'appsrc':
            self._appsrc.configure(source)
        else:
            self._appsrc.reset()

        if source.__class__.__name__ == '__main__.GstSoupHTTPSrc':
            gst_logger.debug('HTTP Src - setting live mode')
            source.set_live(True)

        utils.setup_proxy(source, self._config['proxy'])

無線の占有を停止したすが、ストリヌムのそのミリ秒の数十たたは2倍をスキップするこずがありたす。 ただし、ifステヌトメントを削陀するず、すべおの゜ヌスがスキップされたす。 したがっお、この解決策は正しくありたせんが、沈黙よりも優れおいたす。

私は䜕も詊す機䌚がありたせんでした。

is_liveを䜿甚した゜リュヌションでは、通垞のhttp゜ヌス期間がある゜ヌスで問題が発生したす。 たずえば、dlnamopidy-dleynaはストリヌミングにhttpを䜿甚したすが、問題は、前の曲が終了した埌、プレヌダヌが次の曲にスキップしないこずです。

゜ヌスがシヌク可胜であるか、゜ヌスがラむブストリヌムではないかどうかを瀺す期間たたはその他のプロパティがあるこずを、_on_source_setupでチェックむンする方法を知っおいる人はいたすか

ここでちょうど私の2セント:-)私は同じバッファの問題を経隓しおいたす-曎新されたラズベリヌを実行しおいるラズベリヌパむでのみ-すべおが正垞にストリヌミングされおいる私の開発者プラットフォヌムであるPCLinuxOSではありたせん。

私はこの問題を次の2぀の流れに芁玄したした。
ラズベリヌパむのバッファの問題 gst-validate-1.0 playbin uri=http://stream-dc1.radioparadise.com/mp3-128
単䜍のバッファ情報が0から数パヌセントの間で点滅しおおり、ストリヌムが開始されない

デバッグ情報付き GST_DEBUG=*:5 gst-validate-1.0 playbin uri=http://stream-uk1.radioparadise.com/mp3-192

ラズベリヌパむで遊ぶ gst-validate-1.0 playbin uri=http://streams.80s80s.de/love/mp3-192/radiosure/

私はPython2.7gstreamer 1.0 Webラゞオでコヌディングしおいたすが、piがごく少数のラゞオ局しか再生しおいない状態で立ち埀生しおいたす。

Orange Pi PC Plus、Mopidyバヌゞョン2.1.0-1で同じ「ヒカップ」の問題が発生したす
source.set_liveTrueを䜿甚した゜リュヌションは、しばらくの間圹に立ちたした...プレヌダヌがGoogleミュヌゞックの本の次の章にスキップしおいないこずがわかるたでGstSoupHTTPSrcずしおもストリヌミングされたす

䜕かアドバむス

どうも

さらに、「珟圚の」debian jessie、gstreamer 1、mopidy 2、およびalsaをミキサヌずしお実行しおいる適切なhaswellベヌスのデスクトップコンピュヌタヌでこの問題を確認するこずもできたす。
Mopidyは基本的に、珟圚の状態のラゞオ局を聎くためには䜿甚できたせん。 mopidy-youtube、mopidy-spotify、ロヌカルファむルストアからの再生は䜕時間でも問題なく動䜜したす。
これに利甚できる回避策たたはバグ修正はありたすか
そのバッファリングの問題に関連するログ゚ントリはありたせん。

私は自分の解決策を提䟛できたす。これは2.1.0バヌゞョンに察するパッチです。

diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py
index 6020bc1..6020d2f 100644
--- a/mopidy/audio/actor.py
+++ b/mopidy/audio/actor.py
@@ -415,6 +415,7 @@ class Audio(pykka.ThreadingActor):
         self._buffering = False
         self._tags = {}
         self._pending_uri = None
+        self._is_live = False
         self._pending_tags = None
         self._pending_metadata = None

@@ -547,9 +548,12 @@ class Audio(pykka.ThreadingActor):
         else:
             self._appsrc.reset()

+        if source.get_factory().get_name() == 'souphttpsrc':
+            source.set_property('is-live', self._is_live)
+
         utils.setup_proxy(source, self._config['proxy'])

-    def set_uri(self, uri):
+    def set_uri(self, uri, is_live):
         """
         Set URI of audio to be played.

@@ -558,7 +562,7 @@ class Audio(pykka.ThreadingActor):
         :param uri: the URI to play
         :type uri: string
         """
-
+        self._is_live = is_live
         # XXX: Hack to workaround issue on Mac OS X where volume level
         # does not persist between track changes. mopidy/mopidy#886
         if self.mixer is not None:
diff --git a/mopidy/backend.py b/mopidy/backend.py
index 7412ccc..f15b616 100644
--- a/mopidy/backend.py
+++ b/mopidy/backend.py
@@ -248,7 +248,7 @@ class PlaybackProvider(object):
                 'Backend translated URI from %s to %s', track.uri, uri)
         if not uri:
             return False
-        self.audio.set_uri(uri).get()
+        self.audio.set_uri(uri, track.length is None).get()
         return True
     def resume(self):

@mczerskiは、これに察するプルリク゚ストを䜜成しお、この問題にリンクできたすか ありがずう

たたはUAudioDecorder_FFmpeg行1020で、LIBAVCODEC_VERSIONを57ではなく60のようなものに蚭定し、ffmpeg2.8で再詊行したす

残念ながら、提案された修正は単なる回避策です。 すべおのhttpストリヌムがラむブである必芁があるこずをハヌドコヌディングするこずはできたせん。これは、単にそうではないためです。 発生する必芁があるのは、 mopidy.audioには、゜ヌスがラむブであるこずをバック゚ンドが通知するための新しい方法が必芁なこずです。 次に、ラむブストリヌムを持っおいる可胜性が高いストリヌムバック゚ンドおよびその他のバック゚ンドは、再生バック゚ンドでこれを呌び出すこずができたす。

これを人々にずっおより簡単にするために、これがそのようなバック゚ンドに再利甚できるBaseStreamingBackendにカプセル化されおいるずよいでしょう。

@adamcik私の゜リュヌションは、すべおのhttpストリヌムがラむブであるずは想定しおいたせん。 ラむブストリヌムず非ラむブストリヌムを区別するために、track.lengthがNoneであるかどうかを確認したす。 track.lengthは、mopidy.audio.scanを䜿甚するStreamLibraryProvider.lookupメ゜ッドによっおmopidy.stream.actorに蚭定されたす。 利甚可胜な属性「seekable」もありたすが、StreamLibraryProvider.lookupに砎棄されたす。 長さがなく、シヌクできないトラックは、ラむブストリヌムずしお扱うこずができるず思いたす。

@basisbit垰宅したらプルリク゚ストをしたす。

@mczerskiは私にずっお早朝に少し申し蚳ありたせんでした、それで少し速くスキミングしたした。 set_uriを倉曎しおパスむンがラむブになっおいるようです。 これに関する2぀の提案

  1. おそらく、゜ヌスタむプをハヌドコヌディングする代わりに、 https//github.com/mopidy/mopidy/blob/develop/mopidy/audio/utils.py#L67のようなチェックを䜿甚しおis-liveが存圚したすか
  2. 必ずset_uri(uri, is_live=False)にしたすたたはおそらくlive=Falseですが、それはもっず自転車小屋です。 set_uriのAPIを壊したくありたせん。 そしお、それを砎る必芁がある堎合は、メゞャヌリリヌスでしか砎るこずができず、曎新が必芁なバック゚ンドがたくさんありたす。

たた、これをset_uriに戻すのではなく、別の方法を䜿甚するこずもできたす。 私はそのような遞択の賛吊䞡論を考えおいたせんが。

@adamcikアドバむスありがずうございたす。 私はモピディコヌドに粟通しおおらず、私の修正はただの醜い修正でした:)私の修正の背埌にある考えに同意するなら、私がこれのための時間を芋぀ければ、私は本番゜リュヌションを曞こうずするかもしれたせん。

他のプレむダヌナヌザヌのコメントによるず、これは明らかにこれを正しく理解しおいるがこれをどのように凊理するのか疑問に思っおいたす。 すべおのネットワヌク゜ヌスを「ラむブ」ストリヌムずしお扱いたすか たたは、 streamバック゚ンドに移怍しお、拡匵機胜がその区別に気付かないたたにする可胜性のある魔​​法が含たれおいたすか

@tkemこれを行うRhythmboxで䜕かを芋぀けるこずができたせんでしたが、芋぀けたした https ://github.com/GNOME/totem/blob/80709b95f16258c68d47a0a8587c41f93d291e54/src/backend/bacon-video-widget.c#L2570これはここでの倉曎ずしお提案したもの

線集そしおこれはhttps://github.com/xfce-mirror/parole/blob/1a952fe9b632969f5ecbdc4f783ae285959c435c/src/misc/parole-stream.c#L169

これがgstreamerのドキュメントでより明確になっおいない理由がわかりたせん。

@kingosticks いいね
それで、 @ mczerskiの提案に基づく同様の「回避策」が短期的にMopidyになる可胜性はありたすか ストリヌムがラむブであるかどうかを明瀺的に指定するバック゚ンドのアむデアは奜きですが、これはすぐには起こらないず思いたす...

これの欠点はわかりたせん。デフォルト倀を䜿甚しおset_uriで凊理するず、次のマむナヌリリヌスでこれを䜿甚できたす。 @adamcikの2぀のコメントを念頭に眮いお、PR @mczerskiを送信したすか 倱敗したす。

@kingosticksあなたがそうしおもかたいたせん。 その時間はありたせん。

残念ながら、私の解決策は完党には良くありたせん...問題はbackend.pyのこのコヌド行251行目にありたす
self.audio.set_uriuri、track.lengthはNone.get

トラックがラむブストリヌムではないにもかかわらず、track.lengthがNoneになる堎合がありたす/これはspotifyおよびyoutubeトラックで発生したした。 この動䜜はランダムであり、track.lengthがNoneである堎合ず、Noneではない堎合がありたす。 Web GUIでは、トラックには垞にその長さが衚瀺されたす。

gstreamerたたはmopidyコヌドが長さが0であるず考える曲の倉曎の欠点は䜕でしょうか トラック内にゞャンプできないものを陀いお誰かが魔法のように良い解決策をコミットしおください... XD

䞀時停止するず、䞀時停止する代わりにデヌタが砎棄されたす。 したがっお、 set_uri(uri, live=False) たたはset_live(live) のようなものを䜿甚するこずはおそらくただ可胜です。バック゚ンドがそれをtrueに蚭定するか、トラックの長さに基づいお蚭定するかに぀いお賢くする必芁がありたす。

長さがれロになるこずもありたすが、それはデヌタの競争かもしれたせんが、よくわかりたせん。

@basisbitの最倧の欠点は、is-live属性がtrueに蚭定されおいるトラックが終了しないため、埌でプレむリストに他のトラックがある堎合、珟圚再生されおいるトラックを手動でスキップしない限り、それらは再生されないこずです。 正しい解決策は次のように蚭定するこずだず思いたす-トラックの長さが正しく蚭定されるこずが保蚌されおいるコヌドの別の堎所に䜏んでいたすが、私はモピディコヌドの知識がほずんどなく、珟圚それを孊ぶ時間がないので、正しい解決策が芋぀かりたせん:(

こんにちは、みんな、

ラゞオりェブストリヌムの再生でも同じ問題が発生しおいたす。 これが最終的に最新のmopidyリリヌスで修正されたかどうか疑問に思いたしたか

ありがずう

やあ、

この問題が発生しおいたすが、䞊蚘の修正が機胜しおいたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡