2017-10-26 17 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 = 스테레오, 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

감사 벤! 첫 번째 솔루션은 훌륭하게 작동합니다! 그러나 그게 무슨 가치가있어, 두 번째 솔루션은 컴파일러 오류를 생성합니다 * 오류 \t CS0077 \t as 연산자는 참조 형식 또는 Nullable 형식 ('AudioHeader'는 nullable 값 형식이 아닌)과 함께 사용해야합니다 *. 저는 여기 뉴비 (newb)가 조금 있지만, 어떻게 든 안전하지 못한 솔루션입니까? –

+0

오, 나는'AudioHeader'가 구조체라는 것을 알지 못했습니다. 첫 번째 방법은 좋습니다. 원하는 유형으로 전송하고 있는지 확인하기 만하면됩니다. –

+0

'Nullable' ('... as AudioHeader? ')로 바꾸면 두번째 방법을 사용할 수 있습니다. –