首页 > 解决方案 > 将 TMediaPlayer->Duration 转换为 min:sec (FMX)

问题描述

我正在使用 C++ Builder 10.2 版本 25.0.29899.2631 的 FMX 应用程序中使用 TMediaPlayer1 控件。下面的代码在 Win32 中运行良好,并在加载 35 分 16 秒长的 mp3 文件后给出了预期的结果。
在此处输入图像描述

当我针对 iOS 运行相同的代码时,出现以下错误:

[bcciosarm64 错误] Unit1.cpp(337):重载运算符“/”的使用不明确(操作数类型为“Fmx::Media::TMediaTime”和“int”)

这是我的代码,它采用 TMediaPlayer1->Duration 并将其转换为 min:sec,

UnicodeString S = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(),"43506.mp3");
if (FileExists(S)) {
    MediaPlayer1->FileName = S;
    int sec = MediaPlayer1->Duration / 10000000;    // <-- this is problem line
    int min = sec / 60;
    sec = sec - (60 * min);
    lblEndTime->Text = IntToStr(min) + ":" + IntToStr(sec);       
}

应该怎么做那个部门?

更新 1: 我摸索了一下,想出了如何使用下面的代码查看值。当我在 Win32 上运行时,我得到 21169987500 的持续时间(35 分钟,16 秒),我得到 10000000 的 MediaTimeScale - 两者都是正确的。当我在 iOS 上运行时,Duration为 0,MediaTimeScale 为 10000000。但是,如果我首先开始播放音频(例如MediaPlayer1->Play();),然后运行这 2 个显示消息,我会得到 Duration 的正确结果。

    MediaPlayer1->FileName = S;  // load the mp3
    ShowMessage(IntToStr((__int64) Form1->MediaPlayer1->Media->Duration));
    ShowMessage(IntToStr((__int64) MediaTimeScale));

在音频真正开始播放之前,似乎没有在 iOS 上设置持续时间。我在设置后尝试了 5 秒的延迟,MediaPlayer1->Filename但这不起作用。我尝试了一个MediaPlayer1->Play();MediaPlayer->Stop();但也没有用。

为什么在分配 FileName 时没有设置 Duration?我想在用户开始播放音频之前显示持续时间。

标签: firemonkeyc++builder

解决方案


推荐阅读