2017-10-26 9 views
0

C#Win Formsアプリケーションでtaglib-sharpライブラリを使用して、MP3ファイルの長さとビットレートを取得します。コードスニペットは次のとおりです。taglib-sharp:MP3ファイルのChannelModeを取得する

TagLib.File tagFile = TagLib.File.Create(myMp3FileName); 

int bitrate = tagFile.Properties.AudioBitrate; 
string duration = tagFile.Properties.Duration.Hours.ToString("D2") + ":" + 
        tagFile.Properties.Duration.Minutes.ToString("D2") + ":" + 
        tagFile.Properties.Duration.Seconds.ToString("D2"); 

ファイルがモノラルかステレオかどうかを確認したいと思います。これを行うには、ChannelMode(0 = Stereo、1 = JointStereo、2 = DualChannel、3 = SingleChannel)を読み込む必要があると思います。唯一の問題は、私がアクセスする方法を知らないことです。コードをデバッグすると、ChannelMode in the watch windowが表示されます。

ただし、アクセスは困難です。私はこれを実行すると、私はcodec in the debugger's watch windowを見ることができます

var codec = (((TagLib.ICodec[])tagFile.Properties.Codecs).GetValue(0)); 

、それはChannelModeです下:私はこれだけ遠くなりました。

この時点でcodec.ChannelModeを読むことができるはずですが、それは明らかに正しい構文ではありません。このコンパイラエラーが発生します:

Error CS1061 'object' does not contain a definition for 'ChannelMode' and no extension method 'ChannelMode' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

私は間違っていますか?

ありがとうございます。

マイク

答えて

1

GetValue(0)は、タイプobjectを返します。戻り値を適切な型にキャストする必要があります。この場合、おそらくChannelModeの特性を持つAudioHeader(実装はICodec)です。そう

var codec = (AudioHeader)(((TagLib.ICodec[])tagFile.Properties.Codecs).GetValue(0)); 

それとも、より安全な

var codec = (((TagLib.ICodec[])tagFile.Properties.Codecs).GetValue(0)) as AudioHeader?; 
if (codec != null) 
    ... 
+0

などのおかげで、ベン!あなたの最初の解決策は素晴らしいです!ただし、それが価値がある場合、2番目のソリューションはコンパイラエラーを生成します。*エラー\t CS0077 \t as演算子は、参照型またはnull可能型( 'AudioHeader'はnull値のない値型)で使用する必要があります。私はここで少しnewbですが、何とか安全ではない解決策ですか? –

+0

ああ、私は 'AudioHeader'が構造体であることに気付かなかった。最初の方法は問題ありません。正しいタイプにキャストしていることを確認したいだけです。 –

+0

'Nullable'(' ... as AudioHeader? ')にすると、2番目のメソッド(答えを更新)を使用することができます。 –

関連する問題