2013-04-11 36 views
10

Tôi đã tạo các điều khiển tùy chỉnh của riêng mình để sử dụng với MPMoviePlayerController. Cho đến nay mọi thứ hoạt động ngoại trừ điều khiển nút tắt tiếng.Làm thế nào để tắt/bật âm thanh khi phát video bằng MPMoviePlayerController?

Tôi đã định cấu hình AVAudioSession bằng cách sử dụng mã sau đây trước khi tôi tạo bản sao của mình là MPMoviePlayerController.

NSError *modeError = nil; 
    [self.audioSession setMode:AVAudioSessionModeMoviePlayback error:&modeError]; 
    if (modeError != nil) { 
     NSLog(@"Error setting mode for AVAudioSession: %@", modeError); 
    } 

    NSError *categoryError = nil; 
    [self.audioSession setCategory:AVAudioSessionCategoryPlayback error:&categoryError]; 
    if (categoryError != nil) { 
     NSLog(@"Error setting category for AVAudioSession: %@", categoryError); 
    } 

Sau đó, trong phương pháp nút gọi lại câm của tôi, tôi có đoạn mã sau:

NSError *activeError = nil; 
    [self.audioSession setActive:NO error:&activeError]; 
    if (activeError != nil) { 
     NSLog(@"Error setting inactive state for AVAudioSession: %@", activeError); 
    } 

Khi nhấp vào nút Mute tôi nhận được lỗi unuseful sau:

Error Domain=NSOSStatusErrorDomain Code=560030580 "The operation couldn’t be completed. (OSStatus error 560030580.)" 

tôi đang liên kết để khung AVFoundation.

Điều này thực sự bắt đầu gây lỗi cho tôi vì tôi không thể cho cuộc sống của tôi làm việc ra một cách để giảm hoặc tắt âm thanh phát lại của ứng dụng của tôi.

Tôi không muốn thay đổi âm lượng toàn cục của hệ thống chỉ là mức âm lượng ứng dụng như được xác định theo loại AVAudioSessionAVAudioSessionCategoryPlayback.

Dường như bạn có thể đặt âm lượng của AVAudioPlayer nhưng không phải là MPMoviePlayerController. Tôi đã nhìn thấy các bài viết khác ở đây trên SO nói rằng chỉ cần tạo một thể hiện của AVAudioPlayer và đặt âm lượng nhưng điều này chỉ khiến ứng dụng của tôi gặp sự cố và tôi hy vọng nó có liên quan đến thực tế tôi không sử dụng initWithContentsOfURL:error: hoặc initWithData:error: và thay vì sử dụng `init '.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

10

Sau khi nói chuyện với một kỹ thuật viên của Apple, hóa ra là không thể điều khiển hoặc tắt âm thanh bằng cách sử dụng MPMoviePlayerController.

Thay vào đó bạn phải tạo bộ điều khiển của riêng mình bằng cách sử dụng lớp AVFoundations AVPlayer.

Khi bạn đang sử dụng, đó là vấn đề tạo hỗn hợp âm thanh tùy chỉnh và đặt mức âm lượng. Nó thực sự hoạt động rất tốt.

Mẫu mã:

AVURLAsset * asset = [AVURLAsset URLAssetWithURL:[self localMovieURL] options:nil]; 
    NSArray *audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; 

    // Mute all the audio tracks 
    NSMutableArray * allAudioParams = [NSMutableArray array]; 
    for (AVAssetTrack *track in audioTracks) { 
      AVMutableAudioMixInputParameters *audioInputParams =[AVMutableAudioMixInputParameters audioMixInputParameters]; 
      [audioInputParams setVolume:0.0 atTime:kCMTimeZero ]; 
      [audioInputParams setTrackID:[track trackID]]; 
      [allAudioParams addObject:audioInputParams]; 
    } 
    AVMutableAudioMix * audioZeroMix = [AVMutableAudioMix audioMix]; 
    [audioZeroMix setInputParameters:allAudioParams]; 

    // Create a player item 
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
    [playerItem setAudioMix:audioZeroMix]; // Mute the player item 

    // Create a new Player, and set the player to use the player item 
    // with the muted audio mix 
    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 

    self.mPlayer = player; 

    [mPlayer play]; 

Tôi đã viết một lớp MPMoviePlayerController thay thế bổ sung hỗ trợ cho mức âm lượng. Tôi sẽ tải lên github ngay và thêm liên kết trong bài đăng này.

+1

Muốn xem lớp học đó, bạn đã bao giờ đặt nó trên GH chưa? –

+0

Sợ không, tôi không chắc chắn 100% mức độ triển khai của tôi ổn định như thế nào nên tôi không bao giờ có xung quanh để đưa nó lên. Có lẽ tôi sẽ đưa nó lên như một tài liệu tham khảo. Một lỗ hổng lớn mà tôi cũng phát hiện với kỹ thuật này là nếu bạn sử dụng điều này để kiểm soát mức giá trị (thay vì chỉ tắt tiếng) nó sẽ chỉ cho phép bạn điều khiển 0-100% mức âm lượng thiết bị đã đặt. Ví dụ: khối lượng thiết bị được đặt thành 50% và sau đó bạn sử dụng phương pháp này để giảm khối lượng ứng dụng xuống 50% những gì bạn thực sự nghe là khối lượng 25%. – Camsoft

+0

ok, thú vị. Cảm ơn vi đa trả lơi. có lẽ tôi sẽ chuyển sang AVPlayer để nhận được .mute –

3

Tôi biết đây là một bài đăng cũ, nhưng tôi đã tìm cách kiểm soát thành công khối lượng của điều khiển MPMoviePlayerController trong iOS6 & iOS7, sử dụng MPVolumeView. Một lưu ý là nó KHÔNG hoạt động trong trình mô phỏng, chỉ trên thiết bị vật lý. Để chỉ kiểm soát âm lượng, thêm MPVolumeView ẩn sẽ hoạt động tốt. Tuy nhiên, nếu bạn sử dụng ẩn, hiển thị âm lượng hệ điều hành gốc xuất hiện khi bạn thay đổi âm lượng bằng các nút âm lượng thiết bị vật lý sẽ vẫn xuất hiện trên màn hình trung tâm. Nếu bạn muốn ngăn chặn điều này, hãy đảm bảo MPVolumeView của bạn không bị ẩn. Thay vào đó, bạn có thể cung cấp cho nó độ trong suốt alpha rất thấp và đặt nó ở phía sau các chế độ xem khác, vì vậy người dùng không thể nhìn thấy nó.

Dưới đây là đoạn code tôi đã sử dụng:

MPVolumeView *volumeView = [[MPVolumeView alloc]initWithFrame:CGRectZero]; 
[volumeView setShowsVolumeSlider:YES]; 
[volumeView setShowsRouteButton:NO]; 

// control must be VISIBLE if you want to prevent default OS volume display 
// from appearing when you change the volume level 
[volumeView setHidden:NO]; 
volumeView.alpha = 0.1f; 
volumeView.userInteractionEnabled = NO; 

// to hide from view just insert behind all other views 
[self.view insertSubview:volumeView atIndex:0]; 

này cho phép bạn điều khiển âm lượng bằng cách gọi: [[MPMusicPlayerController applicationMusicPlayer] setVolume: 0,0];

Nhưng tôi vẫn nhận được hiển thị âm lượng hệ điều hành gốc lần đầu tiên tôi sẽ cố gắng thay đổi âm lượng - khi tải tiếp theo, nó không hiển thị màn hình này, vì vậy việc xác định đó là điều gì đó liên quan đến giai đoạn trong cuộc sống của bộ điều khiển chế độ xem chu kỳ, tôi đã chuyển nó từ phương thức viewDidLoad của mình sang phương thức viewDidAppear - nó hoạt động - âm lượng bị tắt và hiển thị âm lượng gốc không xuất hiện, nhưng Bây giờ tôi có thể nghe thấy một giây âm thanh trước khi video bắt đầu phát. Vì vậy, tôi nối vào trạng thái phát lại đã thay đổi ủy nhiệm của MPMoviePlayerController. Trong viewDidLoad Tôi nói thêm:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(videoPlaybackStateDidChange:) 
    name:MPMoviePlayerPlaybackStateDidChangeNotification object:nil]; 

Và phương pháp đại biểu gọi lại:

-(void)videoPlaybackStateDidChange:(NSNotification *)aNotification 
{ 
    // Note, this doesn't work in simulator (even in iOS7), only on actual device! 
    if ([moviePlayerController playbackState] == MPMoviePlaybackStatePlaying) 
    { 
     [[MPMusicPlayerController applicationMusicPlayer] setVolume:0.0]; 
    } 
} 

này tắt tiếng âm thanh của video trước khi nó bắt đầu chơi, nhưng sau khi viewDidLoad trong vòng đời, vì vậy không hệ điều hành bản địa hiển thị âm lượng bị tắt tiếng.

Trong ứng dụng, tôi đã truy xuất và lưu trữ mức âm lượng hiện tại trước khi tắt tiếng (sử dụng [ứng dụng MPMusicPlayerControllerMusicPlayer] .volume property), sau đó khôi phục âm lượng đến mức này khi bộ điều khiển chế độ xem bị đóng, nghĩa là người dùng sẽ không biết mức âm lượng thiết bị của họ đã được sửa đổi và hoàn nguyên.

Ngoài ra, nếu MPMoviePlayerController của bạn đang sử dụng tuyến âm thanh không chuẩn trong iOS7, gọi [[MPMusicPlayerController applicationMusicPlayer] setVolume: 0.0] có thể không hoạt động cho bạn - trong trường hợp này bạn có thể lặp qua các phần phụ của điều khiển MPVolumeView cho đến bạn tìm thấy một khung nhìn phân lớp UISlider. Sau đó bạn có thể gọi [sliderView setValue: 0 animated: NO] sẽ hoạt động cho bạn. Phương pháp này không sử dụng bất kỳ API Apple riêng tư nào để không cho ứng dụng của bạn bị từ chối - sau khi tất cả có nhiều lý do chính đáng khiến bạn cung cấp chức năng này và có thể trong iOS6 mà không phải đi đến độ dài này! Trong thực tế, tôi đã được trezled để khám phá ra rằng Apple đã loại bỏ các chức năng để thiết lập âm lượng trên MPMoviePlayerController trong iOS7 ở nơi đầu tiên .. thực thi di chuyển đến AVPlayer?

Cập nhật: Ứng dụng iPad của tôi hiện đã được phê duyệt bằng phương pháp này và được phát hành trực tiếp trên cửa hàng ứng dụng.

+0

Đó là một cách thú vị để xử lý nó, nhưng nếu người dùng có nhạc chơi trong nền họ chắc chắn sẽ nhận thấy nó. Chỉ là FYI. –

Các vấn đề liên quan