firemonkey - 将 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?我想在用户开始播放音频之前显示持续时间。
解决方案
推荐阅读
- .net-core - 如何在 F# 中向下转换而忽略泛型类型?
- python - 仅返回 numpy 数组的几个元素
- python - 如何在图片中找到突出显示的元素。我用硒
- git - git fetch 在两个提交哈希之间获取
- c# - 无法在 Abp 控制器中注入 UserManager 依赖项
- batch-file - 通过使用批处理脚本替换几个字符来重命名文件
- android - 如何像 GridView 一样使用 RecyclerView?
- reactjs - 反应添加逗号一个字符串
- java - LocalTime 转换为 Json - 无法更改时间格式
- azure-web-app-service - 如何使用 FTP 在 Azure Web 应用程序上部署战争