2

ボタンからのアクションとして ViewController で直接 AVAudioPlayer フレームワークを使用して mp3 ファイルを再生できますが、NSObject クラスのセレクターを呼び出して同じ mp3 を再生したい場合、失敗しました。アドバイスありがとうございます。

ViewController (audioPlayerDemo.xcodeproj) から mp3 を再生すると、次のように動作します。

Frameworks フォルダーに含まれる AVFoundation.framework

APDViewController.h

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

    @interface APDViewController : UIViewController <AVAudioPlayerDelegate>
    {
    }
    @property (strong,nonatomic) AVAudioPlayer *audioPlay;

    - (IBAction)play:(id)sender;

APDViewController.m

    @implementation APDViewController

    @synthesize audioPlay;

    - (IBAction)play:(id)sender
    {
        NSError *error = nil;
        NSData *dataAudio = [[NSData alloc] initWithContentsOfFile:
           @"/Users/User/Documents/AudioPlayerDemo/AudioPlayerDemo/hello world.mp3"options:0 error:&error];
        if(error){
            NSLog(@" error loading data: %@ ", [error localizedDescription]);
        }
        else{
            audioPlay = [[AVAudioPlayer alloc] initWithData:dataAudio error:&error];
            if(error){
                NSLog(@" error loading audio: %@ ", [error localizedDescription]);
            }
            else{
                audioPlay.delegate = self;
                [audioPlay prepareToPlay];
                [audioPlay play];
            }
        } 
    }

    -(void)audioPlayerDidFinishPlaying:
    (AVAudioPlayer *)player successfully:(BOOL)flag
    {
        if (player == audioPlay){
            audioPlay = nil;
            NSLog(@"audioplay = nil");
        }
    }

しかし、NSObject クラス (AudioPlayClass.xcodeproj) を呼び出して同じ .mp3 を再生したい場合、エラーも音もありません。動作しないコードは次のとおりです。

Frameworks フォルダーに含まれる AVFoundation.framework

APCplayObject.h

    #import <Foundation/Foundation.h>
    #import <AVFoundation/AVFoundation.h>

    @interface APCplayObject : NSObject <AVAudioPlayerDelegate>
    {
    }
    @property (strong,nonatomic) AVAudioPlayer *audioPlay;

    - (void)playAudio;

    @end

APCplayObject.m

    #import "APCplayObject.h"
    @implementation APCplayObject

    @synthesize audioPlay;

    -(void)playAudio{

        NSError *error = nil;
        NSData *dataAudio = [[NSData alloc] initWithContentsOfFile:
           @"/Users/User/Documents/AudioPlayerClass/AudioPlayerClass/hello world.mp3"options:0 error:&error];
        if(error){
            NSLog(@" error loading data: %@ ", [error localizedDescription]);
        }
        else{
            audioPlay = [[AVAudioPlayer alloc] initWithData:dataAudio error:&error];
            if(error){
                NSLog(@" error loading audio: %@ ", [error localizedDescription]);
            }
            else{
                audioPlay.delegate = self;
                [audioPlay prepareToPlay];
                [audioPlay play];
            }
        }
    }

    -(void)audioPlayerDidFinishPlaying:
    (AVAudioPlayer *)player successfully:(BOOL)flag  
    {
        if (player == audioPlay){
            audioPlay = nil;
            NSLog(@"audioplay = nil");
        }
    }

APCviewController.m、ボタンからのアクションとしての呼び出し元:

    - (IBAction)callPlay:(id)sender {
        APCplayObject *a = [[APCplayObject alloc] init];
        [a playAudio];

    }

前もって感謝します。

4

1 に答える 1

4

問題は、オーディオの再生を開始した後、変数aがスコープ外になり、破棄されることです。

APCplayObjectメソッドが終了したときに保持するために、宣言されたプロパティを作成する必要があります。

したがって、次のAPCviewController.hようなことができます。

@property (strong,nonatomic) APCplayObject *playObject;

次に、callPlay を次のように変更します。

- (IBAction)callPlay:(id)sender {
    if (!self.playObject)  // Use this line if you only want to create one playObject, take it out to create a new one every time.
        self.playObject = [[APCplayObject alloc] init];
    [self.playObject playAudio];

}
于 2013-07-11T03:55:28.497 に答える