델파이
TWindowsMediaPlayer - 002
선여
2012. 2. 9. 12:42
꺼낼 수 있는 내용은 다방면에 걸치고 있습니다만 , 폭·높이 이외는 , 적당하게 표시하는 정도일까. 본가WindowsMediaPlayer가 재생중때에 좌하에 표시하고 있는 것도 , 몇개인가 눈에 띕니다. 설명이라든지 , bit rate라든지. // --------------------------------------------------------------------------- // 미디어에 관한 정보 procedure TForm1.Button12Click(Sender: TObject); var i, w, h: integer; s: string; begin // 재생중의 놈 있어? if (player.currentMedia <> nil) then begin // 단락선 ShowMsg(StringOfChar('-', 20)); // 높이 w := player.currentMedia.imageSourceWidth; h := player.currentMedia.imageSourceHeight; ShowMsg(Format('가로폭 = %d; 높이 = %d', [w, h])); // 미디어의 이름 ShowMsg(Format('이름 = %s', [player.currentMedia.name])); // URL ShowMsg(Format('URL = %s', [player.currentMedia.sourceURL])); // 열거할 수 있는 속성 for i := 0 to player.currentMedia.attributeCount - 1 do begin s := player.currentMedia.getAttributeName(i); ShowMsg(Format('%-20s = %s', [s, player.currentMedia.getItemInfo(s)])); end; // 단락선 ShowMsg(StringOfChar('-', 20)); end; end; 어떤 조작이 가능한가 TOP 코드를 보일 수 있다고 압니다만 , 대응하고 있는 메소드나 프롭퍼티를 이용할 수 있는 상태에 있는지 어떤지를 조사할 수가 있습니다. 꽉 차는 곳(중) , 조작 버튼의Enable제어에 사용한다고 생각합니다. // --------------------------------------------------------------------------- // 지정한 정보의 종류가 이용 가능한가 , 또는 지정한 동작이 실행 가능한지 어떤지를 판단 procedure TForm1.Button5Click(Sender: TObject); var b: Boolean; s: string; begin // 단락선 ShowMsg(StringOfChar('-', 20)); // 재생할 수 있을까 b := player.controls.isAvailable['Play']; s := Format('%s = %s', [OK_NG[b], 'player.controls.play();']); ShowMsg(s); // 일시정지할 수 있을까 b := player.controls.isAvailable['Pause']; s := Format('%s = %s', [OK_NG[b], 'player.controls.pause();']); ShowMsg(s); // 정지할 수 있을까 b := player.controls.isAvailable['Stop']; s := Format('%s = %s', [OK_NG[b], 'player.controls.stop();']); ShowMsg(s); // 빨리 감기(rate = 5)재생할 수 있을까 b := player.controls.isAvailable['FastForward']; s := Format('%s = %s', [OK_NG[b], 'player.controls.fastForward();']); ShowMsg(s); // 조 되감아(rate = 5)재생할 수 있을까 b := player.controls.isAvailable['FastReverse']; s := Format('%s = %s', [OK_NG[b], 'player.controls.fastReverse();']); ShowMsg(s); // 플레이 리스트의 다음의 미디어에 갈 수 있을까 b := player.controls.isAvailable['Next']; s := Format('%s = %s', [OK_NG[b], 'player.controls.next();']); ShowMsg(s); // 플레이 리스트의 전의 미디어에 갈 수 있을까 b := player.controls.isAvailable['Previous']; s := Format('%s = %s', [OK_NG[b], 'player.controls.previous();']); ShowMsg(s); // 현재 위치를 변경할 수 있을까 b := player.controls.isAvailable['CurrentPosition']; s := Format('%s = %s', [OK_NG[b], 'player.controls.currentPosition();']); ShowMsg(s); // 단락선 ShowMsg(StringOfChar('-', 20)); end; 에러 발생시 TOP 에러가 발생했을 때의 이벤트(OnError)를 이용해 , 에러의 내용을 취득하려고 하고 있는 것입니다만 , 예를 들면 이상한 파일을 건네주거나 하면(자) , 예외가 송출되어 버리므로 , 이 이벤트는 몇시 달릴 것이라고 의문으로 생각하고 있습니다. 그래서 , 어떤 실행 결과가 되는지 불명합니다. // --------------------------------------------------------------------------- // 에러 발생시 procedure TForm1.playerError(Sender: TObject); var i: integer; e: integer; s: string; begin // 발생하고 있는 에러를 표시 for i := 0 to player.Error.errorCount - 1 do begin e := player.Error.Item[i].errorCode; s := player.Error.Item[i].errorDescription; s := Format('%d = %s', [e, s]); ShowMsg(s); end; // 에러 큐 클리어 player.Error.clearErrorQueue(); end; 플레이어나 미디어 상태에 대해(2004/06/22) TOP 우선 최후는 , 재생중 등에 표시하면(자) 플레이어 같게 보이는 정보의 취득에 대해입니다. 모두 같은 것입니다만 , 모처럼 조사했으므로 태워 둡니다. 우선은 재생중의 미디어가 변경되었을 때의 이벤트(OnMediaChange)입니다. 지금라고 하는 미디어를 재생하고 있는지 , 예를 들면 이름이라든지 , 를 조사할 수가 있습니다. // --------------------------------------------------------------------------- // 미디어가 변경되었다 procedure TForm1.playerMediaChange(Sender: TObject; const Item: IDispatch); begin // Item 를 IWMPMedia 로 체크 첨부의 형태 캐스트 하는 Label4.Caption := (Item as IWMPMedia).name; end; 다음이 , 플레이어 상태 변경 이벤트(OnStatusChange)입니다. 본가 미디어 플레이어가 좌하에 표시하고 있는 캐릭터 라인 그대로가 옵니다. 다만 , 본가는 재생 개시 후 잠시 후에 , 타이틀이라든지 작성자라든지를 표시하고 있는 것 같습니다만. // --------------------------------------------------------------------------- // Windows Media Player 상태 변경시 procedure TForm1.playerStatusChange(Sender: TObject); begin // 「준비 완료」 「재생중」등의 캐릭터 라인 ShowMsg(player.status); end; 나머지는 , 플레이어 상태 변경 이벤트(OnPlayStateChange)와 미디어 상태 변경 이벤트(OnOpenStateChange)...라고 생각합니다. 일본어로 고칠 수 없습니다만 우선 설명문자를 배열로 해 있기 때문에 , 그러한 것을 취득할 수 있다고 하는 것입니다. 버젼 7 용의 것 SDK 을 참고로 하고 있으므로 , 새로운 상태가 건너 올지도 모르다고 생각했으므로 , 상태를 나타내는 변수의 값이 배열의 상하한으로 들어가고 있는 것을 , 조사하고 있습니다. // --------------------------------------------------------------------------- // Windows Media Player 상태 변경시 procedure TForm1.playerPlayStateChange(Sender: TObject; NewState: Integer); const // SDK 그대로의 설명문 PLAY_STATE_STR: array[0..10] of string = ('Undefined Windows Media Player 상태가 정의되지 않습니다. ', 'Stopped 현재의 미디어 클립의 재생이 정지되고 있습니다. ', 'Paused 현재의 미디어 클립의 재생이 일시정지되고 있습니다. ' + '미디어를 일시정지했을 경우는 , 재생이 같은 위치로부터 재개됩니다. ', 'Playing 현재의 미디어 클립은 재생중입니다. ', 'ScanForward 현재의 미디어 클립은 빨리 감기중입니다. ', 'ScanReverse 현재의 미디어 클립은 되감아 안입니다. ', 'Buffering 현재의 미디어 클립은 서버로부터의 추가 정보를 취득중입니다. ', 'Waiting 접속은 확립되었습니다만 , 서버가 비트를 송신하고 있지 않습니다. ' + '세션의 개시를 대기중입니다. ', 'MediaEnded 미디어의 재생이 완료해 , 마지막 위치에 있습니다. ', 'Transitioning 새로운 미디어를 준비중입니다. ', 'Ready 재생을 개시할 준비가 되어 있습니다. '); var s: string; begin if (Low(PLAY_STATE_STR) <= NewState) and (NewState <= High(PLAY_STATE_STR)) then s := PLAY_STATE_STR[NewState] //s := OPEN_STATE_STR[player.playState]; else s := '바와 같은 것:' + IntToStr(NewState); ShowMsg(s); end; // --------------------------------------------------------------------------- // 컨텐츠 소스 상태를 나타내는 값을 취득 procedure TForm1.playerOpenStateChange(Sender: TObject; NewState: Integer); const OPEN_STATE_STR: array[0..21] of string = ('Undefined Windows Media Player 상태가 정의되지 않습니다. ', 'PlaylistChanging 새로운 재생 리스트가 읽히려 하고 있습니다. ', 'PlaylistLocating Windows Media Player 하지만 재생 리스트를 찾고 있습니다. ' + '재생 리스트는 , 로컬(데이타베이스 또는 텍스트' + '파일)에서도 , 리모트에서도 괜찮습니다. ', 'PlaylistConnecting 재생 리스트에 접속중입니다. ', 'PlaylistLoading 재생 리스트가 검출되어 현재 수중에 넣고 있습니다. ', 'PlaylistOpening 재생 리스트는 취득이 끝난 상태로 , 현재 해석되어 읽기중입니다. ', 'PlaylistOpenNoMedia 재생 리스트는 열려 있습니다. ', 'PlaylistChanged 새로운 재생 리스트가 currentPlaylist 에 할당할 수 있었습니다. ', 'MediaChanging 새로운 미디어가 읽히려 하고 있습니다. ', 'MediaLocating Windows Media Player 하지만 미디어 파일을 검색중입니다. ' + '파일은 , 로컬에서도 리모트에서도 괜찮습니다. ', 'MediaConnecting 미디어를 보관 유지하고 있는 서버에 접속중입니다. ', 'MediaLoading 미디어가 검출되어 현재 취득중입니다. ', 'MediaOpening 미디어는 취득이 끝난 상태로 , 현재 열려 있는 곳(중)입니다. ', 'MediaOpen 미디어는 현재 열려 있습니다. ', 'BeginCodecAcquisition 코덱의 취득을 개시하고 있습니다. ', 'EndCodecAcquisition 코덱의 취득이 완료했습니다. ', 'BeginLicenseAcquisition DRM보호 첨부의 컨텐츠를 재생하는 라이센스를 취득중입니다. ', 'EndLicenseAcquisition DRM보호 첨부의 컨텐츠를 재생하는 라이센스를 취득했습니다. ', 'BeginIndividualization DRM개별화를 개시했습니다. ', 'EndIndividualization DRM개별화는 완료했습니다. ', 'MediaWaiting 미디어를 대기중입니다. ', 'OpeningUnknownURL 불명한 종류의 것URL을 열고 있습니다. '); var s: string; begin if (Low(OPEN_STATE_STR) <= NewState) and (NewState <= High(OPEN_STATE_STR)) then s := OPEN_STATE_STR[NewState] //s := OPEN_STATE_STR[player.openState]; else s := '바와 같은 것:' + IntToStr(NewState); ShowMsg(s); end; |