2017-04-27 2 views
1

shoutcast 스트림에서 노래 제목을 가져 오려고합니다. 그러나 MENewStream, MEEndOfStream, MESourceMetadataChanged 이벤트는 실행되지 않으며 아무것도 업데이트되지 않습니다. Media Foundation .NET : shoutcast에서 노래 제목을 얻는 방법

내가 미디어 소스 만드는 방법은 다음과 같습니다

hr = sourceResolver.CreateObjectFromURL(
    mediaURL, MFResolution.ByteStream, properties, out mediaStream 
); 
hr = sourceResolver.CreateObjectFromByteStream(
    mediaStream, mediaURL, MFResolution.MediaSource, properties, out objectType, out mediaSource 
); 

그리고 이것은 내가 메타 데이터를 얻는 방법은 다음과 같습니다

hr = MFExtern.MFGetService(
mediaSource, MFServices.MF_METADATA_PROVIDER_SERVICE, typeof(IMFMetadataProvider).GUID, out obj 
); 
IMFMetadataProvider metadataProvider = obj as IMFMetadataProvider; 
hr = mediaSource.CreatePresentationDescriptor(out descriptor); 
hr = metadataProvider.GetMFMetadata(descriptor, 0, 0, out metadata); 

어딘가에 응용 프로그램에서 I 전화 :

Display(stream.Metadata); 

을하는 다음을 반환합니다.

"Bitrate"  : 128 
"Title"   : ...(station name) 
"WM/Genre"  : ... 
"WM/PromotionURL": ... 

질문 : 위의 이벤트를 실행하기 위해 구현해야하는 Media Foundation .NET의 shoutcast에서 어떻게 업데이트를 얻을 수 있습니까?

시간과 자선을 위해 미리 감사드립니다.

+2

이것이 다중 계층 문제인 것으로 생각됩니다. MF는 ID3 만 이해하고 파일에만 적용됩니다. 또한 스트림에 메타 데이터가 포함되도록하려면 서버에 메타 데이터를 삽입하도록 지시 한 다음 제거하여 디코더로 전달해야합니다. MF에 익숙하지 않아서이 모드가 있는지 모릅니다. 아이스 캐스트 (Icecast)의 경우 선호하는 스트림 컨테이너는 오그 (Ogg)입니다. – TBR

+2

shoutcast를 MF [여기] (https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/220b166e-b8f2-4a5a-b2bc-c3f9b6674a87)와 함께 사용하는 방법에 대한 자세한 설명이 있습니다. MS의 응답은 icecast가 다른 shoutcast 서버가하는 것처럼 예상 된 'ICY 200 OK'를 전송하지 않기 때문에 MF가 올바르게 처리하지 못하는 것으로 보입니다. 이 게시물은 다소 일자가 (2010), 그래서 아마도 더 최근의 해결책이 있습니다. –

+1

@Mario 스트림에서 인 밴드 메타 데이터를 디 먹스 (demux)하기 위해 자신 만의 코드를 생성 한 다음 디코딩을 수행하는 모든 곳으로 일반 스트림을 보내야합니다. – Brad

답변

1

상황에 따라이 질문에 대한 답변이 여러 개 있습니다. 연결중인 서버가 ICY 서버로 자신을 식별 ICY 200 OK를 사용하는 경우 예를 들어,

윈도우 7

  • , 당신은 shoutcast.zip 코드 here 같은 C# 코드를 사용할 수 있습니다. 노래 제목에 대한 지원을 추가하는 것은 기존 샘플에 대한 사소한 변경입니다.
  • Icy-Metadata: 1을 전송하여 ICY 200 OK으로 응답하도록 연결하려는 서버를 감추면 SourceResolver가 URL을 확인하도록 허용하는 대신 명시 적으로 UrlMonSchemePlugin을 사용하면 도움이됩니다.

주 : 서버가 ICY 200 OK에 응답 확신 할 수없는 경우 (단지 200 OK를 사용하는 경우, 예를 들어)가 할 수있을 수 있지만 (자동으로 제목을 구문 분석 MF를 설득 할 수있는 방법은 없습니다 자신을 파싱하는 것일까? 아마도 MFT 일까?).

실제로 서버가 200 OK으로 응답 한 후 노래 제목을 보내는 경우 MF는 제목을 '재생'하려고 시도합니다. 이 삐 소리는 매우 짜증 스럽습니다 (디스코 음악을 제외하고는 어떻게 말할 수 있 었는가?).

나는 그런 MFT를 만들려고 생각하지만 그때 나는 깨달았다 : 노래 제목을 제공하기 위해 icy-metaint를 지정 어떤 스트림 수 있도록

윈도우 대신에 '고정'MF 8

(겉으로는 사소한 수정), MS는 다른 길로 갔다.

그들은 완전히 MF 사용하여 MPEG 오디오를 스트리밍 할 수있는 기능 깨진있다.

W7에서 잘 작동하는 동일한 프로그램 (위)이 이제 W8에서 MF_E_BYTESTREAM_NOT_SEEKABLE 오류를 제공합니다.이 스트림은 W7에서도 찾을 수 없기 때문에 이상하게 보입니다. 그러나 이제는 치명적인 오류입니다.

MS가 사람들이 사용하기를 기대하는 몇 가지 새로운 접근법이있을 수 있지만 그것이 무엇인지 모릅니다.


업데이트 : 그것은 그래서 (또한 C#으로 작성) 내 자신의 계획 핸들러를 생성은 Windows 8에서 작동하지 않았다 저를 성가 시게

. ICY 200 OK을 사용하는 스트림을 처리하는 것 외에도이 장치는 단지 200 OK (및 기타 몇 가지 기능)도 처리합니다. 그리고, W8의 SourceResolver를 사용할 수있을만큼 충분히 지원합니다. 그래서 (거의) 같은 플레이어 앱이 W7 & W8 모두에서 작동합니다. 샘플은 여전히 ​​윈도우 7, 200 OK는 Windows 8에서 작동하며 (아마도) 나중에 지원하는 새로운 계획 핸들러에서 작동하는 동안

  1. :

    은 몇 가지주의 사항이 있습니다.

  2. MediaFoundation .Net의 베타 버전이 필요합니다.

ShoutCast-2015 sample에 포함 된 .Net 4.5.2를 사용하여 미리 빌드 된 버전의 라이브러리가 있습니다. 라이브러리 소스가 cvs으로 확인됩니다.

"상용 가능"코드는 아니지만 기본 개념을 보여줍니다. 그리고 누군가가 그것을 더 좋게 만들고 싶다면 (설명 된) 출처가 포함됩니다. 특히 non-ascii 곡 제목을 처리하지 못합니다. 스트림 처리가 오디오 갭을 피하는 데 더 효율적일 수 있다는 확신이 있습니다 (또는 실패하면 MF와의 갭을 통신하고 '버퍼링' 다음 간격을 피하십시오.

0

스트림 URL에 이미 아티스트 및 노래 이름에 대한 메타 데이터가 포함되어 있습니다 (적어도). 실제 소스는 URL 자체입니다.

관련 문제