【问题标题】:iOS 5 - AVAPlayer not working anymoreiOS 5 - AVAPlayer 不再工作
【发布时间】:2011-11-25 12:19:22
【问题描述】:

我有一些在 iOS 4.3 上运行良好的代码。我在互联网上看了看,我发现其他人有同样的问题没有答案,这对我有用。我认为我可以录制一些东西,但我不能播放它。这是我的代码:

DetailViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
#import <AudioToolbox/AudioServices.h>

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate, AVAudioRecorderDelegate> {

id detailItem;
UILabel *detailDescriptionLabel;

IBOutlet UIButton *btnStart;
IBOutlet UIButton *btnPlay;

//Variables setup for access in the class:
NSURL * recordedTmpFile;
AVAudioRecorder * recorder;
BOOL toggle;
}

// Needed properties
@property (nonatomic, retain) IBOutlet UIButton *btnStart;
@property (nonatomic, retain) IBOutlet UIButton *btnPlay;
@property (strong, nonatomic) id detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;

-(IBAction) start_button_pressed;
-(IBAction) play_button_pressed;
@end

DetailViewController.m

- (void)viewDidLoad {
[super viewDidLoad];
toggle = YES;
btnPlay.hidden = YES;
NSError *error;

// Create the Audio Session
AVAudioSession *audioSession = [AVAudioSession sharedInstance];

// Set up the type of session
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];

// Activate the session.
[audioSession setActive:YES error:&error];

[self configureView];    
}

-(IBAction) start_button_pressed{
if (toggle) {
    toggle = NO;
    [btnStart setTitle:@"Press to stop recording" forState:UIControlStateNormal];
    btnPlay.enabled = toggle;
    btnPlay.hidden = !toggle;
            NSError *error;

    NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] init];

    [recordSettings setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];

    [recordSettings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];

    [recordSettings setValue:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];

    // Create a temporary files to save the recording. 
    recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"caf"]]];

    NSLog(@"The temporary file used is: %@", recordedTmpFile);

    recorder = [[AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSettings error:&error];

    [recorder setDelegate:self];

    [recorder prepareToRecord];
    [recorder record];
}
else {
    toggle = YES;
    [btnStart setTitle:@"Start recording" forState:UIControlStateNormal];
    btnPlay.hidden = !toggle;
    btnPlay.enabled = toggle;

    NSLog(@"Recording stopped and saved in file: %@", recordedTmpFile);
    [recorder stop];
}
}

-(IBAction) play_button_pressed{

NSError *error;
AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordedTmpFile error:&error];

   if (!error)
   {
       [avPlayer prepareToPlay];
       [avPlayer play];

       NSLog(@"File is playing");
   }

}

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player
                    successfully: (BOOL) flag {
     NSLog (@"audioPlayerDidFinishPlaying:successfully:");
}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully: (BOOL)flag
{
    NSLog (@"audioRecorderDidFinishRecording:successfully:");
}

这是我正在运行的程序:

2011-11-25 11:58:02.005 Bluetooth1[897:707] 使用的临时文件是:file://localhost/private/var/mobile/Applications/D81023F8-C53D-4AC4-B1F7-14D66EB4844A/tmp /343915082005.caf 2011-11-25 11:58:05.956 Bluetooth1[897:707] 录制停止并保存在文件中:file://localhost/private/var/mobile/Applications/D81023F8-C53D-4AC4-B1F7-14D66EB4844A/tmp/343915082005 .caf 2011-11-25 11:58:05.998 Bluetooth1[897:707] audioRecorderDidFinishRecording:成功: 2011-11-25 11:58:11.785 Bluetooth1[897:707] 文件正在播放

由于某种原因,函数 audioPlayerDidFinishPlaying 永远不会被调用。但是,似乎已经记录了一些东西。现在我不知道哪个部分不起作用,但我想这与 AVAudioPlayer 有关。

[编辑] 越来越奇怪了。我想确保记录了一些东西,所以我寻找记录的持续时间。这是新的播放功能:

-(IBAction) play_button_pressed{

    NSError *error;
AVAudioPlayer * avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: recordedTmpFile error:&error];

    if (!error)
    {
        AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:recordedTmpFile options:nil];
        CMTime audioDuration = audioAsset.duration;
        float audioDurationSeconds = CMTimeGetSeconds(audioDuration);

        [avPlayer prepareToPlay];
        [avPlayer play];

        NSString *something = [NSString stringWithFormat:@"%f",audioDurationSeconds]; 
        NSLog(@"File is playing: %@", something);
    }
    else
    {
         NSLog(@"Error playing.");
    }   
}

现在,记录的长度被记录下来并且有意义(如果我记录 10 秒,它会显示大约 10 秒)。但是,当我第一次放置这些代码行时,我忘记了将 float 转换为 NSString。所以它崩溃了……应用程序播放声音……经过不同的测试,我可以得出结论,我的应用程序可以录制和播放声音,但播放录制的声音时崩溃了。我不知道可能是什么问题。我发现 AVPlayer 是异步的,它们与此有关吗?我完全迷路了......

【问题讨论】:

    标签: ios ios5 avaudioplayer avaudiorecorder avaudiosession


    【解决方案1】:

    将urlpath替换为以下代码:

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(
             NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *filepath = [documentsDirectory stringByAppendingPathComponent:@"urfile.xxx"];
    
    NSURL *url = [NSURL fileURLWithPath:filepath];
    

    【讨论】:

    • 谢谢,但是我无法测试你的代码我的项目已经完成,而且我没有 iPhone/Mac,所以我无法测试它。非常感谢!
    【解决方案2】:

    在这里尝试解决方案:

    Recording and playback

    【讨论】:

    • 我会尝试,但它看起来很奇怪。会话类别未在任何需要的地方设置(如果我理解正确的话)link
    • 我今天试过了,但它不起作用。作为教程,这并不奇怪,因此不显示任何有关 AudioSession 的内容。我虽然这可能不是 iOS 5 所必需的,但似乎确实如此。我找到了某种解决方案,我将在今天晚些时候发布。
    【解决方案3】:

    好的,回答您自己的问题并不是很酷。此外,当答案不干净但它正在工作时......为了播放我录制的内容,我使用了以下代码块:

        AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:recordedTmpFile options:nil];
        CMTime audioDuration = audioAsset.duration;
        float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
    
        [avPlayer prepareToPlay];
        [avPlayer play];
    
        // Block for audioDurationSeconds seconds
        [NSThread sleepForTimeInterval:audioDurationSeconds];
    

    我正在计算录制文件的长度,我正在等待这段时间......它很脏,但它正在解决问题。另外,如果它在另一个线程中启动,它不会阻塞应用程序。

    我很乐意接受任何人的东西!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多