(Android)ログ出力ライブラリ"Timber"を使ってみる
Androidのログ出力ライブラリ"Timber"でログ出力機能を使ってみたのでメモ。
動作環境
- Android Studio : 2.3.3
- Compile Sdk Version : API26 Android8.0 (O)
- Min Sdk Version : API19 Android4.4 (KitKat)
- Timber Version : 4.5.1*1
パッケージを導入する
- [File] - [Project Structure...] からパッケージを追加したいモジュールの[Dependencies]タブを選択する。
- 画面右側の[+]をクリック[Library dependency]を選択する。
- "com.jakewharton.timber:timber:4.5.1"と入力し、検索する。
- "com.jakewharton.timber:timber:4.5.1"を選択して[OK]ボタンをクリックする。
- build.grableに以下が追加されていればOK
compile 'com.jakewharton.timber:timber:4.5.1'
Timberを使う
Timberは初期化する際にログ出力機構のTreeを指定します。
以下は予め用意されているデバッグ用のTreeを設定しています。
リリース用のTreeは自前で作成する必要があるようです。
Timber.plant(new DebugTree());
使用する場合は通常のLogクラスと使い方は同じです。
サンプルを作成がてらログ出力機能を作りました。
以下のLoggerクラスはTimberのログ出力機能をラッパーです。
gist.github.com
initializeで初期化しているログTreeは以下のようになっています。
gist.github.com
後はこれを以下の様に使用します。
gist.github.com
これを実行するとLogCatには以下のようなログが出力されます。
あとはログの出力先をファイルにするなりクラッシュレポートを送信するなりすると使えそうです。
*1:2017年9月12日時点で最新版です。
MediaPlayer でファイル再生時のエラー回避方法について
またもやWPF のMediaPlayer ネタです。
MediaPlayer のイベントにMediaFailed がありますが、このイベントで以下のようなメッセージが出力される場合があります。
HRESULT からの例外:0xC00D11BA
これはWindows Media Player が出力している例外メッセージです。
MediaPlayer.Play() を呼び出した後にこの例外がスローされるのであれば、多くの場合、以下の内容が原因とされています。
- サウンド ドライバーが最新でない。
- 再生ファイルのコーデックが不足している。
など
しかし、再生中にたまにこの例外がスローされる事があります。
そうなった場合、再度MediaPlayer.Play() を実行しても楽曲が再生されません。
残念ながら確実に発生するオペレーションの確立と原因の究明までには至っていないため、この現象の発生を止めることはできません。
今回は"この現象が発生してももう一度楽曲を再生できる"ような対象法をまとめます。
動作環境
- OS : Windows10
- Visual Studio : 2015 Enterprise
- 言語 : C#
- GUI アーキテクチャ : WPF
対策
正しいかどうかは別として、"エラー発生後に楽曲ファイルを再読読み込み"することで回避は可能です。
エラーの発生するコードは以下の様なものとしましょう。
var mediaPlayer = new MediaPlayer(); mediaPlayer.MediaFailed += (sender, e) => { // HRESULT からの例外:0xC00D11BA // というエラーメッセージが出力される。 Console.WriteLine(e.ErrorException); }; mediaPlayer.Open(new Uri(@"Resources\sample.wav")); mediaPlayer.Play();
これをこう変えます。
var mediaPlayer = new MediaPlayer(); mediaPlayer.MediaFailed += (sender, e) => { // HRESULT からの例外:0xC00D11BA // というエラーメッセージが出力される。 Console.WriteLine(e.ErrorException); mediaPlayer.Close(); mediaPlayer = null; mediaPlayer = new MediaPlayer(); mediaPlayer.Open(new Uri(@"Resources\sample.wav")); }; mediaPlayer.Open(new Uri(@"Resources\sample.wav")); mediaPlayer.Play();
イマイチ発生原因がつかめていないのでモヤモヤは残るのですが、今のところはこれで対応できているので良しとします。
MediaPlayer でファイル再生時のノイズ発生回避方法について
前回同様、WPF のMediaPlayer のお話です。
iyemon018.hatenablog.com
今回は楽曲ファイルの読み込み時ではなく、再生時に発生するノイズについてです。
このノイズも必ず発生するものではなく、特定の条件の楽曲ファイルと環境が揃わなければ発生しません。
かなり局所的な問題だと思われますが、とりあえずノイズの発生した環境は以下の通りです。
動作環境
- OS : Windows 8.1 with Being (x86)*1
- CPU : Intel Atom CPU Z3735F 1.33GHz
- メモリ : 2GB
- 楽曲ファイル : 再生時間300ミリ秒程度。1音目に振幅の大きい(例えばクリック音のような)楽曲に発生しやすい。
開発環境
- Visual Studio : 2015 Enterprise
- 言語 : C#
- GUIアーキテクチャ : WPF
現象
WPF のMediaPlayer の再生時に”1音目に振幅の大きい楽曲”を再生した場合にノイズが入る。
同じ楽曲を他のメディアプレイヤーで再生してもこの現象は発生しない。
また、動作環境によっては発生しない。
タブレットなどの低スペックPC上で発生するケースが多い。
原因
今のところわかっていません。
MediaPlayer は内部でWindows Media Player を使用しているのでWMPが怪しい気もするのですが、根本的な原因については今もわかっていません。
対策
楽曲ファイルの調整が可能であれば、楽曲ファイルの先頭に無音時間を10ミリ秒程度追加すると解消されます。
この方法であればコードの修正が必要ないため簡単に対応できるのですが、楽曲ファイルを編集できない場合は使えません。
他には、
- 楽曲再生までに徐々に音量を上げる
- 楽曲再生前にインターバルを持たせる
なども考えましたが、いずれも確実に修正できるという確証がなかったため試していません。
MediaPlayer でファイルオープン時のノイズ発生回避方法について
WPF でWAVE ファイルなどのメディアファイルを再生するとき、System.Windows.Media.MediaPlayer を使用していたのですが、複数ファイルを纏めてオープンしたときに何故か楽曲が少しだけ再生される現象が発生しました。
ここではその回避方法についてまとめています。
動作環境
- OS : Windows 10 64bit
- .NET Framework : 4.6
- 開発環境 : Visual Studio 2015 Enterprise
- 言語 : C#
- GUIアーキテクチャ : WPF
実現したいこと
単純に複数の楽曲ファイルを予めロードすることで再生時のオーバーヘッドを軽減したい。
SoundPlayer クラス (System.Media) も試したのですが、「楽曲再生中に停止できない」「音量の調節機能が無い」ため、手っ取り早くMediaPlayer で実現することとなりました。