将TMediaPlayer-> Duration转换为min:sec(FMX)

时间:2019-02-21 03:27:25

标签: firemonkey c++builder

我正在使用C ++ Builder 10.2版本25.0.29899.2631在FMX应用程序中使用TMediaPlayer1控件。下面的代码在Win32中运行良好,并在加载35分钟,16秒长的mp3文件后提供了预期的结果。
enter image description here

当我针对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上运行时,我得到 0(持续时间)和10000000(MediaTimeScale)。但是,如果我先开始播放音频(例如MediaPlayer1->Play();),然后运行这两个showmessages,则我会得到持续时间正确的结果。

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

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

为什么在分配文件名时未设置工期?我想在用户开始播放音频之前显示持续时间。

0 个答案:

没有答案