我使用BASS库开发了一个带Delphi(XE)的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 :(得分:0)
我现在管理好了。 只有在调试模式下,才会退出应用程序/播放器而不会抛出任何错误,我发现自己回到了IDE中。
在运行时,try ... except块工作,当我选择一个"受影响的文件"手动。对于播放一个文件的情况("好的")而下一个文件是"坏的",我不得不改变我的" MediaNext"程序。在这个过程中,当文件名与TMediaPlayer关联时,我也尝试了...除了块,但我刚刚设置了bool变量以供进一步使用,并且没有跳过"跳过#34;到下一个文件。
代码就是:
try
mplMain.FileName := CurrentSong;
except
on E:Exception do
SongNotPlayable := true;
end;
在这里,我可以实现一个例程,将受影响的mp3文件记录到日志文件中,然后跳转到下一个文件(如果存在)。 : - )
再次感谢所有人!