Program Tip

AVAudioPlayer가 소리를 재생하지 않음

programtip 2020. 12. 9. 21:38
반응형

AVAudioPlayer가 소리를 재생하지 않음


AVFoundation프레임 워크를 사용하여 일부 사운드를 재생해야하는 iOS 애플리케이션을 개발 중 입니다. Xcode 4의 작업 공간 구조에는 두 개의 프로젝트가 있습니다.

  • 작업 공간
    • 응용 프로그램 자체 (주 프로젝트)
    • 유틸리티 라이브러리

유틸리티 라이브러리를 빌드 한 후 기본 애플리케이션에서 프레임 워크로 사용되는 정적 라이브러리가 생성됩니다.

따라서 아래 코드를 사용하여 메인 애플리케이션 내에서 사운드를 재생하려고하면 예상대로 작동합니다.

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *path = [NSString stringWithFormat:@"%@/sound.mp3", resourcePath];

NSURL *url = [NSURL fileURLWithPath:path];
NSError *error = nil;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                                    error:&error];
[audioPlayer play];

반대로 위와 동일한 코드를 사용하여 유틸리티 라이브러리 내에서 정확히 동일한 사운드 (또는 기타)를 재생하려고하면 오류가 nil 이고 audioPlayer 속성 값이 올바른 값 (숫자) 인 경우에도 사운드가 전혀 재생되지 않습니다. 채널 수, 기간).

AVFoundation프레임 워크가 두 프로젝트 모두에 있는지 확인 했습니다.

또한 내 클래스는 AVAudioPlayerDelegate프로토콜을 사용하고 다음 두 가지 방법을 구현합니다.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

이러한 메서드는 사운드 재생을 시도한 후에 호출되지 않습니다.

AudioToolbox대신 프레임 워크를 사용 하면 사운드가 재생됩니다. 하지만 AVFoundation몇 가지 이유로 사용 하는 데 관심이 있습니다.

무슨 일이 일어나고 있는지 아십니까? 내가 뭔가를 놓치고 AVFoundation있습니까? AVAudioPlayer정적 라이브러리 내부 에서 사용 하는 것과 관련이 있습니까?

미리 감사드립니다.


나는 해결책을 찾았고 그것은 내가 언급하지 않았고 생각하지도 않았던 것과 관련이 있습니다. 나는 자동 참조 계수 (ARC)로 컴파일하고 있습니다.

ARC는 오디오 플레이어에 릴리스 호출을 삽입하므로 생성 된 메서드를 떠난 직후 할당 해제됩니다. AVAudioPlayerARC 와는 관련이 없습니다 .

이 문제를 해결하기 위해 AVAudioPlayerARC에서 더 이상 릴리스하지 않도록 사운드를 다루는 클래스에 속성을 만들었습니다 . 음, 적어도이 클래스의 인스턴스가 해제 될 때까지 해제되지 않습니다.

ARC에 대한 자세한 내용 은이 문제가 발생한 이유에 대한 자세한 내용과 함께 Automatic Reference Counting : Zeroing Weak References 를 참조하십시오.


네 그럼요; ARC도 내 코드의 이유였습니다.

속성을 소개했습니다.

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

그리고 그것은 모든 것이 잘 작동하도록 만들었습니다.


이것을 사용하면 확실히 작동합니다 ....

AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];

NSURL *url = [NSURL fileURLWithPath:@"path of the sound file :)"];
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[_player setDelegate:self];
[_player prepareToPlay];
[_player play];

AVAudioSession을 구성 했습니까?

비슷한 문제가 발생하여 다음과 같이 수정했습니다.

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];

또는

[audioSession setCategory:AVAudioSessionCategoryPlayback error:NULL];

도움이 되었기를 바랍니다.


클래스 범위에 audioPlayer var가 선언되어 있어도 재생되지 않습니다. 적어도 iOS 10 iPhone 5c 물리적 장치에서.

play()결과는 true오류가 발생하지 않는 것입니다.

이것을 추가해야 ( Swift 3, 4 ) 이제 사운드가 올바르게 재생됩니다.

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayback)

간단한 오디오 플레이어 용 오픈 소스 프로젝트를 만들었습니다. iOS (백그라운드에서도)에서 오디오를 재생하는 데 문제가있는 경우 살펴보십시오 : https://github.com/wzbozon/DKAudioPlayer


잠시 동안 페이지에 머물러주세요. 같은 문제에 직면했습니다. 그것을 해결하기 위해 수면을 사용합니다.


NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                             pathForResource:@"sounds-1027-are-you-kidding"
                                             ofType:@"mp3"]];
        AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]
                                      initWithContentsOfURL:url
                                      error:nil];
        [audioPlayer play];
        sleep(2);


나는 같은 문제가 있었다. .h 파일에 아래 줄을 추가하여 해결했습니다.

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

그리고 .m 파일에서 :

NSError *error;
NSString *soundFilePath = [NSString stringWithFormat:@"%@/dancepechance.mp3",
                               [[NSBundle mainBundle] resourcePath]];
    NSURL *url = [NSURL fileURLWithPath:soundFilePath];
    self.audioPlayer = [[AVAudioPlayer alloc]
                                  initWithContentsOfURL:url
                                  error:&error];
    NSLog(@"Error %@",error);
    [self.audioPlayer prepareToPlay];
    [self.audioPlayer play];

You can use AVPlayerViewController from AVKit instead for both audio and video. Code is available for both swift and objective c here.


Swift Solution:

  import AVFoundation

  // define your player in class
  var player = AVAudioPlayer()

  override func viewDidLoad() {
    super.viewDidLoad() 
  }

참고URL : https://stackoverflow.com/questions/8016765/avaudioplayer-not-playing-any-sound

반응형