0

クラスの本文内でmp3ファイルを正常に再生しました。ただし、機能を別のクラスに移動すると、失敗します。

動作するコードは次のとおりです。

ヘッダ:

#import <AVFoundation/AVFoundation.h>

@interface QuestionController : UIViewController 
<UITableViewDataSource, UITableViewDelegate, UISplitViewControllerDelegate>
{
    AVAudioPlayer *audioPlayer;

}

作業コード:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/A.mp3", [[NSBundle mainBundle] resourcePath]]];

    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = 0;

    if (audioPlayer == nil)
        NSLog(@"audio errror: %@",[error description]);             
    else 
        [audioPlayer play];

新しいクラスは次のとおりです。

ヘッダ:

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


    @interface AudioPlayer : NSObject {

    }

    - (void *) playAudioFile:(NSString *) mp3File;

    @end

実装:

  #import "AudioPlayer.h"

    @implementation AudioPlayer

    - (void *) playAudioFile:(NSString *) mp3File {

        NSLog(@"mp3file to play: %@", mp3File ); 

        NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", mp3File, [[NSBundle mainBundle] resourcePath]]];

        NSError *error;

        AVAudioPlayer *audioPlayer;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops = 0;

        if (audioPlayer == nil) {
            NSLog(@"audio errror: %@",[error description]);
        }
        else {
            [audioPlayer play];
        }
        [audioPlayer release];

        return 0; 
    }   

    @end

呼び出しコードは次のとおりです。

   AudioPlayer *audioPlayer = [[AudioPlayer alloc] init];

   [audioPlayer playAudioFile:@"/A.mp3"];

ただし、別のクラスで実行すると、プレーヤーが正常に作成されず、「audio player==nil」ブランチに移動します。

出力は次のとおりです。

012-07-21 07:14:54.480 MyQuiz[6655:207] mp3file to play: /A.mp3
2012-07-21 07:15:40.827 MyQuiz[6655:207] audio errror: Error Domain=NSOSStatusErrorDomain Code=-43 "The operation couldn’t be completed. (OSStatus error -43.)"

URLは「file://localhost/A.mp3」です。

私が間違っていることについて何か考えはありますか?別のメソッドにリファクタリングしていると、どういうわけかいつも問題が発生します。イライラします。

4

2 に答える 2

1

最初に飛び出すのは、playを呼び出した直後にオーディオプレーヤーを解放していることですが、「working」クラスではこれは発生しません。

この問題に取り組むための良い設計は、シングルトンクラス内でオーディオプレーヤーを一度インスタンス化することです。このクラスは、アプリケーション全体でオーディオの再生を担当し、すべてのクラスからの要求を管理する必要があります。このようにして、メモリを正しく管理していること、およびAVFoundationフレームワークが1か所でのみ使用されていることがわかります。

また、必要なパスを取得するには、次を使用します。

NSURL *url = [NSURL fileURLWithPath:[[NSString stringWithFormat:@"%@", mp3File] stringByAppendingPathComponent:[[NSBundle mainBundle] resourcePath]]];
于 2012-07-21T11:57:26.387 に答える
1

URL にエラーがある場合は、この行を変更してください

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", mp3File, [[NSBundle mainBundle] resourcePath]]];

これに:

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], mp3File]];
于 2012-07-21T12:03:53.747 に答える