2017-11-18 1 views
0

BASS 라이브러리를 사용하여 Delphi (XE)가있는 mp3 플레이어를 개발했습니다.Delphi tmediaplayer가 "이상한"표지 이미지가 포함 된 mp3 파일을 재생하지 않습니다.

특정 이유로 인해 BASS 라이브러리를 제거하고 Delphi에서 TMediaPlayer 구성 요소를 사용하고자합니다 (또한 프로젝트를 Delphi 10 Seattle로 이동하려는 경우).

이제 mp3 파일 중 일부에 "이상한"jpg 이미지가 포함되어 있다는 것을 알았습니다.

이미지 때문에 Delphi 구성 요소에 오류가 발생 함을 의미합니다.

try 
    mplMain.FileName := CurrentSong; 

    progbSong.Max := mplMain.Duration; 
    lblDuration.Text := DurationToString(mplMain.Duration); 
    PlayClick(Self); 

except 
    on E: Exception do 
    begin 
    FMX.Dialogs.MessageDlg('Cannot play song: ' + CurrentSong + #10 + #13 + 
          'Reason: ' + E.Message, 
          TMsgDlgType.mtWarning, [TMsgDlgBtn.mbOK], 0, 
     procedure(const AResult: TModalResult) 
     begin 
     MediaNext; 
     end 
    ); 
    end; 
end; 

이 행 :

mplMain.FileName := CurrentSong; 

이 문제를 일으키는 나는 다음과 같은 말을 할 수 오랜 시간 디버깅

. 깊이를 디버깅

다이빙 여기에 온다 :

FMX.Media 라이브러리 :

끝에
procedure TMediaPlayer.SetFilename(const Value: String); 
    ... 
    FMedia := TMediaCodecManager.CreateFromFile(FFileName); 
    ... 

FMX.Media.Win에 끝 :

constructor TWindowsMedia.Create(const AFileName: string); 
    ... 
    HR := FGraphBuilder.RenderFile(PChar(AFileName), nil); 
    ... 

라인

HR := FGraphBuilder.RenderFile(PChar(AFileName), nil); 

이 호출되면 디버그 모드에서 프로그램이 IDE로 돌아갑니다.

런타임 모드에서는 아무 일도 발생하지 않습니다. 오류 메시지가 없습니다. 단지 "아무것도"아닙니다.

알다시피 관련 줄을 try...except 블록으로 감쌌지만 오류는 발생하지 않았습니다. 프로그램/플레이어가 계속되지 않습니다.

나는이 "특별한 경우"를 포착하고 영향을받는 mp3 파일을 로그 파일에 기록하여 삽입 된 이미지를 변경할 수 있기 때문에 나에게 좋지 않습니다.

일부 이미지에서만 발생한다는 것을 알게되었습니다. 어쩌면 그들은 "어떻게 든 부패한다", 그러나 다른 모든 선수들에게 보여진다.

이미지를 제거하고 "새"파일을 포함하고 저장하면 모든 것이 정상이며 파일 번호 TMediaPlayer이 파일을 재생할 수 있습니다.

이 특정 종류의 "오류"를 어떻게 잡아 영향을받는 파일 목록을 얻을 수 있습니까?

+0

Windows 7에서 JPG 아트웍으로 MP3 파일로 재생할 수 없습니다. 특정 파일을 공유 할 수 있습니까? – Victoria

+0

나는 Windows 7에도 있습니다. :-) http://mschlereth.de/stuff/dl/05%20-%20Fan%20Tong%20Zhou%20-%20Wo%20Shuo%20Wo%20Ai%20Ni.mp3 –

+0

여기에서 파일을 다운로드 할 수 있습니다. 업로드 된 DirectShow에서도 문제가 없습니다. 하지만 K-Lite 코덱 팩 (코덱이 재생에 사용되었을 수도 있음)이 설치되어 있습니다. 내 시스템이 최신 상태입니다 (모든 Windows 업데이트가 적용됨). – Victoria

답변

0

지금 관리하고 있습니다. 디버그 모드에서만 응용 프로그램/플레이어가 던져진 오류없이 종료되고 IDE에서 다시 자신을 찾습니다.

try ... except 블록은 수동으로 "영향을받는 파일"을 선택했을 때 작동합니다. 하나의 파일이 재생되고 ("good one") 다음 파일이 "bad one"인 경우, "MediaNext"절차를 변경해야합니다. 이 과정에서 파일 이름이 TMediaPlayer와 연결되었을 때 try ... except 블록을 사용 했었지만 다음 사용을 위해 bool 변수를 설정하고 다음 파일로 "이동"하지 않았습니다.

코드는 단지였다

try 
    mplMain.FileName := CurrentSong; 

except 
    on E:Exception do 
    SongNotPlayable := true; 

end; 

은 여기가 로그 파일에 영향을받는 MP3 파일을 기록하는 루틴을 구현할 수 (있는 경우) 다음 다음 파일로 이동합니다. :-)

다시 한번 감사드립니다!

관련 문제