gpt4 book ai didi

ios - 如何在 iOS 上播放 mp3 从特定时间到特定时间(以毫秒为单位)?

转载 作者:行者123 更新时间:2023-11-29 01:14:04 25 4
gpt4 key购买 nike

我需要在特定时间播放 mp3 [以毫秒为单位]。经过一些研究,我选择了 AVPlayer,这似乎是每个有类似需求的人的选择。对我来说不幸的是它不起作用[最后包含代码]。我想知道是否还有其他任何东西可以用来播放任何 iOS 支持的文件格式,并使用毫秒时间刻度指定开始和停止?

这是我使用 AVPlayer 的代码。我创建了一个 mp3,它在 4.3 秒时有大约 600 毫秒的静音,然后有大约一秒钟的噪音。我有 3 个创建用于 seekToTime 的 CMTime 的选项:

  • 4300 个值,1000 个时间刻度
  • 4.3 * 60000 60000 时间刻度
  • 4.3 * timescale of the mp3 file with the timescale of the mp3 file.

不幸的是,没有一个选项对我有用,它总是设置在噪音中的某个地方。

我尝试使用较低的值,只是为了它。我达到了 3.7 秒,设置后,在沉默之前开始了一点。有趣的是:如果我使用 3.75,它将在噪音中间开始播放。

代码的关键部分:

CMTime声明:

mediaAudioStart = CMTimeMake((int64_t) (floatValue * 60000), 60000);

int32_t timeScale = _mediaAudioPlayer.currentItem.asset.duration.timescale;
mediaAudioStart = CMTimeMake((int64_t) (floatValue * timeScale), timeScale);

mediaAudioStart = CMTimeMake(4300, 1000);

完整代码

seekToTime 的用法:

[_mediaAudioPlayer seekToTime:mediaAudioStart toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
if (finished) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaAudioPlaybackFinished) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
NSLog(@"CURRENT TIME: %lld", _mediaAudioPlayer.currentTime.value);
[_mediaAudioPlayer play];

} else {
NSLog(@"Could not seek media overlay file.");
}
}];

ViewController.m

- (void)prepareMediaAudio {
NSLog(@"prepareMediaAudio");
NSString *mediaAudioPath = [[NSBundle mainBundle] pathForResource:@"boostmiddle" ofType:@"mp3"];
NSURL *mediaAudioURL = [[NSURL alloc] initFileURLWithPath:mediaAudioPath];
if (!_mediaAudioPlayer) {
AVPlayer *player = [AVPlayer playerWithURL:mediaAudioURL];
[self setMediaAudioPlayer:player];
[_mediaAudioPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
} else {
[self mediaAudioSeek];
}
}

- (void)stopMediaAudio {
NSLog(@"stopMediaAudio");
if (_mediaAudioPlayer) {
[_mediaAudioPlayer removeObserver:self forKeyPath:@"status"];
[_mediaAudioPlayer pause];
_mediaAudioPlayer = nil;
}
}

- (void)mediaAudioSeek {
NSLog(@"mediaAudioSeek %lld %d", mediaAudioStart.value, mediaAudioStart.timescale);

[_mediaAudioPlayer seekToTime:mediaAudioStart toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
if (finished) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaAudioPlaybackFinished) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
NSLog(@"CURRENT TIME: %lld", _mediaAudioPlayer.currentTime.value);
[_mediaAudioPlayer play];

} else {
NSLog(@"Could not seek media overlay file.");
}
}];
}

- (void)mediaAudioPlaybackFinished {
NSLog(@"mediaAudioPlaybackFinished");
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
[self stopMediaAudio];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
NSLog(@"observeValueForKeyPath");
if (object == _mediaAudioPlayer && [keyPath isEqualToString:@"status"]) {
if (_mediaAudioPlayer.status == AVPlayerStatusReadyToPlay) {
NSLog(@"READY TO PLAY");
} else if (_mediaAudioPlayer.status == AVPlayerStatusFailed) {
NSLog(@"Could not load Media Overlay audio");
}
}
}

- (IBAction)button1Action:(id)sender {
NSString *value = valueText.text;
float floatValue = [value floatValue];
NSLog(@"button1Action %f", floatValue);
mediaAudioStart = CMTimeMake((int64_t) (floatValue * 60000), 60000);
[self mediaAudioSeek];
}

- (IBAction)button2Action:(id)sender {
NSString *value = valueText.text;
float floatValue = [value floatValue];
NSLog(@"button2Action %f", floatValue);
int32_t timeScale = _mediaAudioPlayer.currentItem.asset.duration.timescale;
mediaAudioStart = CMTimeMake((int64_t) (floatValue * timeScale), timeScale);
[self prepareMediaAudio];
}

- (IBAction)button3Action:(id)sender {
NSLog(@"button3Action [4300, 1000]");
mediaAudioStart = CMTimeMake(4300, 1000);
[self prepareMediaAudio];
}

- (IBAction)stopAction:(id)sender {
[self stopMediaAudio];
}

- (IBAction)prepareAction:(id)sender {
[self prepareMediaAudio];
}

示例项目

您可以从这里获取我的项目,包括我用于测试的 mp3 文件。只需在文本字段中输入 4.3。

https://www.dropbox.com/s/7q2xmuhdu1xih75/iosAudioTest.zip?dl=0

编辑:

更新 mp3 文件后 - 使其更短 - 用于到达同一位置的值发生了变化。现在 4.3 指向其他地方:/现在我对 seekToTime 方法的操作一无所知。

最佳答案

https://warrenmoore.net/understanding-cmtime

以上帖子对 CMTime 的描述最为清晰。恐怕你解释错了。如果你想跳 4.3 秒,你需要一个 (4.3, 60000) 的 CMTime,其中 4.3 是秒数,60000 是你需要的每秒精度。

[av_player seekToTime:CMTimeMakeWithSeconds(4.3, 60000) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

将为您提供一个设置为 4.3 秒的 CMTime,其精度为 60000 - 这意味着您可以在每一秒之间跳转到 60000 个不同位置中的任何一个。

关于ios - 如何在 iOS 上播放 mp3 从特定时间到特定时间(以毫秒为单位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35428784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com