【问题标题】:how to play audio file depending on the position of UIimageview which is moving by accelerometer如何根据加速度计移动的 UIimageview 的位置播放音频文件
【发布时间】:2011-05-24 21:41:34
【问题描述】:

我写了以下代码 但是音频部分仍然没有响应

#import "AccelerometerViewController.h"

@implementation AccelerometerViewController

@synthesize imageView;
@synthesize player;
- (void)viewDidLoad {


 UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
    accel.delegate = self;
    accel.updateInterval = 1.0f/60.0f;   

 carRadius = imageView.frame.size.width / 2;
    delta = CGPointMake(12.0,4.0);
    translation = CGPointMake(0.0,0.0);       

    [super viewDidLoad];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer
        didAccelerate:(UIAcceleration *)acceleration {


    if (acceleration.x>0) delta.x = 2; else delta.x = -2;
    if (acceleration.y>0) delta.y = -2; else delta.y = 2;

    [UIView beginAnimations:@"translate" context:nil];

 imageView.transform =
 CGAffineTransformMakeTranslation(translation.x, translation.y);   
 translation.x = translation.x + delta.x;
 translation.y = translation.y + delta.y;   

    [UIView commitAnimations];   

    if (imageView.center.x + translation.x > 320 - carRadius ||
        imageView.center.x + translation.x < carRadius) {
        translation.x -= delta.x;
    }


    if (imageView.center.y + translation.y > 460 - carRadius ||
        imageView.center.y + translation.y < carRadius) {
        translation.y -= delta.y;
    }  

 //playing Audio file to show warning if my car moved on to another lane 


 if (imageView.center.x + translation.x > 160) 


 {

  NSString *path = [[NSBundle mainBundle] pathForResource:@"tone" ofType:@"m4r"];
  NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

  AVAudioPlayer *p =[[AVAudioPlayer alloc]
         initWithContentsOfURL:file error:nil];
  [file release];

  self.player = p;
  [p release];

  [player prepareToPlay];
  [player setDelegate:self];
  [self.player play];


 }
 } 

谁能帮帮我

【问题讨论】:

  • if 语句 if (imageView.center.x + translation.x > 160) 是否被正确调用?添加 NSLog(@"播放警告音频");或要测试的东西。您遇到什么错误(如果有)?另外,你为什么要测试中心+翻译?据我了解,您将要移动汽车,那么为什么不在移动汽车后测试中心位置呢?
  • 是的,当我使用 NSLog 消息进行测试时,它可以正常工作,但是当我尝试播放音频时,它会被击中。
  • 通过“struck”我假设您的意思是输入“stuck”。您的意思是音频在播放过程中停止,它根本不播放任何东西,您的应用程序崩溃,或者您收到错误?请提供任何错误消息。
  • 哦,是的,我的意思是卡住了。我的应用程序没有崩溃。但是当我尝试使用调试器时,我意识到代码从这一行停止工作“NSURL *file = [[NSURL alloc] initFileURLWithPath:path];”我不知道发生了什么事..

标签: iphone iphone-sdk-3.0 ios-simulator


【解决方案1】:

这里有几件事要检查:确保您已将 AVFoundation 框架导入到您的项目中,并且您的头文件中有 #import &lt;AVFoundation/AVAudioPlayer.h&gt;

将所有 [object release] 方法移动到块的底部。它不应该有所作为,但值得一试。

您使用的是最新版本的 iOS 吗? 4.2.1是最新的。

确保您的音频文件被准确命名为tone.m4r - 它区分大小写。

在左侧边栏中,展开“Targets”,然后是您的应用名称,然后是“Copy Bundle Resources”。文件tone.m4r在那里吗?如果没有,就拖进去。

最后,您为什么要创建 AVAudioPlayer *p 然后将其设置为等于 self.player(我假设您已在头文件中定义)?相反,如果您还没有在@interface 的头文件中声明AVAudioPlayer *player;。在@interface 块之后但在@end 之前添加@property (nonatomic, retain) AVAudioPlayer *player;(如果您还没有的话)。

替换

AVAudioPlayer *p =[[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil]; 
[file release];

self.player = p;
[p release];

self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil];
[file release];

编辑:

•你不需要[player setDelegate:self]; •确保你有self.player,而不仅仅是player(应该没有区别,但它更具描述性)。 •我创建了一个全新的空白项目来测试你/我的代码。见下文。

AudioTesterViewController.h:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface AudioTesterViewController : UIViewController {
    AVAudioPlayer *player;

}

@property (nonatomic, retain) AVAudioPlayer *player;

- (IBAction)playAudio;

@end

AudioTesterViewController.m:

#import "AudioTesterViewController.h"

@implementation AudioTesterViewController

@synthesize player;


- (void)viewDidLoad {
    [super viewDidLoad];

}

- (IBAction)playAudio {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"tone" ofType:@"m4r"];

    NSURL *file = [[NSURL alloc] initFileURLWithPath:path];

    [path release];

    self.player =[[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil];

    [file release];

    [self.player prepareToPlay];
    [self.player play];

}


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

注意事项: -(IBAction)playAudio 由我在 Interface Builder 中制作的按钮调用,但您当然可以将其设为 void 函数或将代码复制到另一个函数中。 如果此代码不起作用,请尝试单击菜单栏中的 Build->Clean,然后运行项目。

这是我的文件结构:

【讨论】:

  • 我已经导入了框架并添加了它。我已经声明 *player,我在两台不同的计算机上同时使用 3.2.1 和 4.2.1,还尝试重新编写代码......仍然音频 thig 没有响应......
  • 即使我已经测试过正常的音频测试器代码。但是当使用 Accelerometer 定位 UI Image 时,它​​没有响应。缺少一些我们无法找到的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多