Delphi tmediaplayer不播放嵌入了“奇怪”封面图片的mp3文件

时间:2017-11-18 18:15:12

标签: image delphi mp3 tmediaplayer

我使用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可以播放该文件。

如何获取此类“错误”以获取受影响文件的列表?

1 个答案:

答案 0 :(得分:0)

我现在管理好了。 只有在调试模式下,才会退出应用程序/播放器而不会抛出任何错误,我发现自己回到了IDE中。

在运行时,try ... except块工作,当我选择一个"受影响的文件"手动。对于播放一个文件的情况("好的")而下一个文件是"坏的",我不得不改变我的" MediaNext"程序。在这个过程中,当文件名与TMediaPlayer关联时,我也尝试了...除了块,但我刚刚设置了bool变量以供进一步使用,并且没有跳过"跳过#34;到下一个文件。

代码就是:

try
  mplMain.FileName := CurrentSong;

except
  on E:Exception do
    SongNotPlayable := true;

end;

在这里,我可以实现一个例程,将受影响的mp3文件记录到日志文件中,然后跳转到下一个文件(如果存在)。 : - )

再次感谢所有人!