LibVLCSharpでVLC(RTSP)と戦った時のメモ
使ったのはここら辺
- LibVLCSharp.Form 3.3.1
- VideoLan.LibVLC.iOS 3.1.5.1
- VideoLan.LibVLC.Android 3.2.0
- Visual Studio 2017 15.9.17
- Xamarin.Android SDK 9.1.7.0 (HEAD/ba9da7a76)
- Xamarin.iOS and Xamarin.Mac SDK 12.4.0.64 (9c8d8e0)
libvlc
- libvlc はスレッドセーフ https://forum.videolan.org/viewtopic.php?t=84269
media_list は media_list_lock とか必要
libvlc インスタンスは別スレッドで共有しちゃダメ - RTSP の TCP 接続タイムアウトはオプション ipv4-timeout が利用される
- データが来ない時(RTP?)のタイムアウトはここら辺でハードコード(ucast約10秒 mcastは41秒) されている
https://github.com/videolan/vlc/blob/master/modules/access/live555.cpp#L1477 - RTSP サーバーのタイムアウトする値が0の場合60秒へ置き換える処理がハードコードされている (仕様っぽい)
https://github.com/videolan/vlc/blob/master/modules/access/live555.cpp#L1273 - なんで誰も libvlc_media_player_stop でハングするの直せねーんだよ https://forum.videolan.org/viewtopic.php?t=147724
ほんとにね
LibVLCSharp
- スリープ時に再生停止が必要
MediaPlayer 作り直しが良さげ - Media.Parse() iOS でよく固まる
MediaPlayer に Media 渡して任す方がよい (事前にメディア情報取れんがな...) - MediaPlayer, Media (LibVLC も?) の IDisposable.Dispose() 呼ばずに GC 回収の方が安全
リソース速攻破棄している副作用で例外? - Android でハードウェアアクセラレーションを有効化すると例外が起きる端末がある
iOS は大丈夫 - MediaPlayer.Stop() で固まる
Xamarin.Android のバグ? https://code.videolan.org/videolan/LibVLCSharp/issues/123
RTSPは仕様上長い - MediaPlayer.EndReached iOSで複数再生時に不適切なイベントが発生するAndroidでは起きない
別のイベントにやってきているかファイルの扱いが微妙に違うかも - バッファが小さいと iOS で例外
2000ms 以上必要? - MediaPlayer.IsMute を制御すると iOS で例外
iOS の音声周り怪しい?
Media.Parse() MediaPlayer.Dispose() を呼んでいた時の出会いが混じっているので呼ばなければ幾分大丈夫なのかもしれない