我正在使用SoundPool 在我的应用程序中播放音频剪辑.一切都很好,但我需要知道剪辑播放何时结束.
目前,我通过使用MediaPlayer实例获取每个剪辑的持续时间来在我的应用中跟踪它.这工作正常,但加载每个文件两次看起来很浪费,只是为了得到持续时间.我可以自己知道文件的长度(可从AssetFileDescriptor获得)粗略计算持续时间,但我仍然需要知道采样率和通道数.
我看到了这个问题的两种可能解决方案:
有什么建议?
谢谢,马克斯
我目前正在使用的代码(工作正常,但为此目的而言相当沉重):
String[] fileNames = ...
MediaPlayer mp = new MediaPlayer();
for (String fileName : fileNames) {
AssetFileDescriptor d = context.getAssets().openFd(fileName);
mp.reset();
mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
mp.prepare();
int duration = mp.getDuration();
// ...
}
Run Code Online (Sandbox Code Playgroud)
在旁注中,这个问题已被提出但没有得到答案.
有很多问题要求如何以另一种方式执行此操作(从此格式转换),但我无法找到有关如何在PHP中以ISO 8601持续时间格式输出的任何内容.
所以我有一堆人类可读格式的持续时间字符串 - 我想在运行时将它们转换为ISO 8601格式,以打印HTML5微数据的持续时间.下面是一些字符串的示例,以及它们应如何格式化
"1 hour 30 minutes" --> PT1H30M
"5 minutes" --> PT5M
"2 hours" --> PT2H
Run Code Online (Sandbox Code Playgroud)
你明白了.
我可以将字符串推送到PHP中的间隔对象:
date_interval_create_from_date_string("1 hour 30 minutes");
Run Code Online (Sandbox Code Playgroud)
但似乎没有ISO 8601输出选项 - 我该如何处理?
谢谢大家.
我正在尝试使用Duration该类而不是long.它具有优越的文字语法.我喜欢它的灵活性,虽然它看起来很奇怪.
"PT10S"意味着10秒,接受"10秒"的问题是什么?!好的没关系.
我只是好奇为什么选择了PT前缀(不是"DU"例如)以及为什么任何前缀在这里更好而不是什么?
我试图获取音频文件的持续时间来修剪它们,我使用下面的代码,
audioAsset = [AVURLAsset assetWithURL:itemURL];
CMTime assetTime = [audioAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);
Run Code Online (Sandbox Code Playgroud)
当我提供媒体库的任何音频文件的itemURL时,我得到适当的持续时间,然后我能够修剪音频文件.然后我将修剪过的音频文件保存在文档目录中.但是当我尝试修剪已经修剪过的文件时,相同的代码会将0作为持续时间返回0.但是我可以播放修剪过的文件并使用AVAudioPlayer获取持续时间,但AVURLAsset的问题是什么我无法弄清楚.
有人可以帮忙吗?我已经在stackoverflow中尝试了几乎所有这些问题的答案.
如何使用ISO 8601表达500毫秒的持续时间?对我来说,文档并非100%明确.它只是"PT0.5S"吗?
如std :: chrono :: duration :: operator + =中所述,签名是
duration& operator*=(const rep& rhs);
Run Code Online (Sandbox Code Playgroud)
这让我很好奇.我会假设持续时间文字可以像任何其他内置文件一样使用,但事实并非如此.
#include <chrono>
#include <iostream>
int main()
{
using namespace std::chrono_literals;
auto m = 10min;
m *= 1.5f;
std::cout << " 150% of 10min: " << m.count() << "min" << std::endl;
int i = 10;
i *= 1.5f;
std::cout << " 150% of 10: " << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是
150% of 10min: 10min
150% of 10: 15
Run Code Online (Sandbox Code Playgroud)
为什么界面选择那种方式?在我看来,一个界面就像
template<typename T>
duration& operator*=(const T& …Run Code Online (Sandbox Code Playgroud) 我试图在Spotify播放器中添加(向前移动)10秒的歌曲持续时间或减去(向后移动)10秒,但是我真的很困惑如何添加或减去。
当我尝试使用此代码时,歌曲的持续时间不会改变
// forward button action
@IBAction func moveFrdBtnAction(_ sender: Any) {
SpotifyManager.shared.audioStreaming(SpotifyManager.shared.player, didSeekToPosition: TimeInterval(10))
}
// spotify delegate method seekToPosition
func audioStreaming(_ audioStreaming: SPTAudioStreamingController!, didSeekToPosition position: TimeInterval) {
player?.seek(to: position, callback: { (error) in
let songDuration = audioStreaming.metadata.currentTrack?.duration as Any as! Double
self.delegate?.getSongTime(timeCount: Int(songDuration)+1)
})
}
Run Code Online (Sandbox Code Playgroud)
我们正在两个平台(Android和iOS)上使用相同的SDK制作音乐应用程序,Spotify SDK的seekToPosition方法在Android版本中正常运行,但是在iOS版本中不起作用。委托方法调用本身,但音乐停止了。
您能否告诉我们为什么会发生这种情况,以及我们应该怎么做才能在iOS设备上运行它。
有人可以向我解释如何解决这个问题,我已经尝试解决这个问题,但没有结果。
任何帮助将不胜感激。
提前致谢。
我正在使用 dayjs 库的持续时间对象作为持续时间格式。
dayjs.duration(1500, 'minutes').format('H[h] m[m]') // returns 1h 0m
Run Code Online (Sandbox Code Playgroud)
图书馆似乎将 24 小时转换为 1 天,并将剩余的 1 小时转换为小时。实际上,我希望输出为25h 0m。
有什么方法可以使用 days.js 或任何最小的自定义逻辑以及使用持续时间对象来实现此目的?或者任何其他库本身提供此功能?
我正在开发 API 级别 19 (KitKat) 的应用程序。
我有一个LocalDateTime对象和一个Duration对象。我需要将此添加Duration到LocalDateTime.
Android Studio 显示该类的plus(TemporalAmount)方法LocalDateTime自 API 级别 26 即 Oreo 以来可用,并且目前支持不到 1% 的设备。
我怎样才能用 API 级别 19 做到这一点?
我意识到 JSON 没有真正的日期格式,考虑到 JavaScript 使用的是 ISO 8601,因此使用 ISO 8601 是一个不错的选择。持续时间呢?JavaScript 没有内置格式。
P3Y6M4DT12H30M5S我在野外没有看到太多使用。它看起来也非常冗长且难以阅读。据我所知,如果您需要,它也不支持毫秒。TimeSpan类型输出1.02:03:04.0050000为 1 天、2 小时、3 分钟、4 秒和 5 毫秒。我几乎从未见过野外的第一种格式。第二个对我来说似乎更直观,但我担心它在 .NET 之外并不为人所知。第三种格式可能是最跨平台友好的,但完全不是人类可读的。