gpt4 book ai didi

iPhone:让录音应用程序在后台运行

转载 作者:行者123 更新时间:2023-12-03 20:06:05 24 4
gpt4 key购买 nike

我已经为我的问题搜索了合适的答案,但到目前为止我没有找到任何有帮助的答案。我想记录环境中的分贝。如果超过特定阈值,应用程序将播放声音或歌曲文件。到目前为止一切正常,但我很难让应用程序在后台运行。我已经添加了属性“应用程序不在后台运行”并将其值设置为“NO”。我读到应该将“外部配件”元素添加到“所需的背景模式”中。我也添加了,但仍然不起作用。我使用 AVAudioRecorder 来录制声音,并使用 AVPlayer 来播放声音/音乐文件。首先,我使用了 MPMediaController iPodMusicPlayer 但它抛出异常以及属性“所需的背景模式”。

编辑:我正在使用 xCode 4.5 和 iOS 6

编辑2:当我将字符串 viop 添加到“所需的后台模式”时,它似乎在后台继续录制。但在后台时仍然不播放音乐文件。我也尝试添加“音频”值,但没有帮助。

编辑3:我查阅了苹果开发者引用资料。看来你必须配置你的 AVAudioSession 。这样它似乎可以工作( link to reference )。但现在我在播放多个文件时遇到麻烦,因为一旦第一首轨道播放完毕,应用程序将再次进入暂停模式。据我所知,不可能用多个文件来初始化 AVPlayer 或 AVAudioPlayer。我使用委托(delegate)方法audioPlayerDidFinishPlaying:成功:设置下一个轨道,但它不起作用。

编辑4:好的,一种可能是避免停止录音机,即删除[录音停止],以便它甚至在播放音乐时记录声音。这是一种可行的解决方案,但我仍然很欣赏任何其他(更好)的解决方案。一种不需要让记录器始终运行的解决方案。

相关代码:我在 viewDidLoad 方法中初始化所有内容:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

//[MPMusicPlayerController applicationMusicPlayer];

NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];

NSError *error;

recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
lowPassResults = -120.0;
thresholdExceeded = NO;

if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];

} else {
NSString* errorDescription = [error description];
NSLog(errorDescription);
}
}

每 0.03 秒调用一次 levelTimer 回调:

- (void)levelTimerCallback:(NSTimer *)timer {
//refreshes the average and peak power meters (the meter uses a logarithmic scale, with -160 being complete quiet and zero being maximum input
[recorder updateMeters];

const double ALPHA = 0.05;

float averagePowerForChannel = [recorder averagePowerForChannel:0];

//adjust the referential
averagePowerForChannel = averagePowerForChannel / 0.6;

//converts the values
lowPassResults = ALPHA * averagePowerForChannel + (1.0 - ALPHA) * lowPassResults;

float db = lowPassResults + 120;
db = db < 0? 0: db;

if(db >= THRESHOLD)
{
[self playFile];
}
}

最后是播放音乐文件的 playFile 方法:

- (void) playFile {

NSString* title = @"(You came down) For a day";
NSString* artist = @"Forge";
NSMutableArray *songItemsArray = [[NSMutableArray alloc] init];


MPMediaQuery *loadSongsQuery = [[MPMediaQuery alloc] init];

MPMediaPropertyPredicate *artistPredicate = [MPMediaPropertyPredicate predicateWithValue:artist forProperty:MPMediaItemPropertyArtist];
MPMediaPropertyPredicate *titlePredicate = [MPMediaPropertyPredicate predicateWithValue:title forProperty:MPMediaItemPropertyTitle];
[loadSongsQuery addFilterPredicate:artistPredicate];
[loadSongsQuery addFilterPredicate:titlePredicate];

NSArray *itemsFromGenericQuery = [loadSongsQuery items];

if([itemsFromGenericQuery count])
[songItemsArray addObject: [itemsFromGenericQuery objectAtIndex:0]];


if([songItemsArray count])
{
MPMediaItemCollection *collection = [[MPMediaItemCollection alloc] initWithItems:songItemsArray];


if ([collection count]) {

MPMediaItem* mpItem = [[collection items]objectAtIndex:0];
NSURL* mediaUrl = [mpItem valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem* item = [AVPlayerItem playerItemWithURL:mediaUrl];
musicPlayer = [[AVPlayer alloc] initWithPlayerItem:item];

[musicPlayer play];
}
}
}

有人可以帮我解决我的问题吗?我还错过了什么吗?

最佳答案

试试这个,

AppDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier task = 0;
task=[application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
[application endBackgroundTask:task];
task=UIBackgroundTaskInvalid;
}];
}

关于iPhone:让录音应用程序在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007709/

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