2012-05-11 43 views
5

Tôi phát một MP3 trong ứng dụng iPhone bằng AVAudioPlayer; tôi cần thực hiện một số thao tác vào những thời điểm nhất định (nói 30 giây, 1 phút); Có cách nào để gọi các chức năng gọi lại dựa trên thời gian chơi mp3 không?Làm cách nào để thực hiện các thao tác khi phát âm thanh trong iPhone?

+0

Bạn sẽ phải tạo logic như vậy cho mình. Sử dụng bộ hẹn giờ, khởi động/dừng/khởi động lại bộ đếm thời gian đó tùy thuộc vào trạng thái phát lại (KVO trên thuộc tính AVAudioPlayer). – Till

Trả lời

1

Tôi đã tìm thấy this link mô tả thuộc tính sản phẩm có vẻ như cho biết bạn có thể nhận thời gian phát lại hiện tại.

Nếu âm thanh đang phát, currentTime là độ lệch của vị trí phát lại hiện tại, được tính bằng giây từ khi bắt đầu âm thanh. Nếu âm thanh không phát, currentTime là độ lệch của nơi phát bắt đầu khi gọi phương thức phát, được tính bằng giây từ khi bắt đầu phát âm thanh .

Bằng cách đặt thuộc tính này, bạn có thể tìm đến một điểm cụ thể trong tệp âm thanh hoặc triển khai các chức năng tua đi và tua lại âm thanh nhanh.

Để kiểm tra thời gian và thực hiện các hành động của bạn, bạn chỉ đơn giản là có thể truy vấn nó:

if (avAudioPlayerObject.currentTime == 30.0) //You may need a more broad check. Double may not be able to exactly represent 30.0s 
{ 
    //Do Something 
} 
8

Tôi tin rằng giải pháp tốt nhất là để bắt đầu một NSTimer khi bạn bắt đầu AVAudioPlayer chơi. Bạn có thể đặt hẹn giờ để kích hoạt sau mỗi nửa giây. Sau đó, mỗi lần bộ hẹn giờ của bạn kích hoạt, hãy xem thuộc tính currentTime trên trình phát âm thanh của bạn.

Để thực hiện điều gì đó trong một khoảng thời gian nhất định, tôi khuyên bạn nên giữ một biến mẫu cho thời gian phát lại từ lần cuối gọi lại bộ hẹn giờ của bạn. Sau đó, nếu bạn đã vượt qua điểm quan trọng giữa lần gọi lại cuối cùng và điều này, hãy thực hiện hành động của bạn.

Vì vậy, trong giả, bộ đếm thời gian gọi lại:

  1. Lấy currentTime của AVAudioPlayer bạn
  2. Kiểm tra để xem nếu currentTime lớn hơn criticalPoint
  3. Nếu có, hãy kiểm tra xem nếu lastCurrentTime ít hơn criticalPoint
  4. Nếu có, hãy thực hiện hành động của bạn.
  5. Đặt lastCurrentTime để currentTime
+1

Đáng buồn thay, 'currentTime' không tuân thủ KVO, do đó, đặt cược tốt nhất của bộ định thời. –

+0

Thêm KVO vào trạng thái phát lại để tạm dừng/dừng vào tài khoản bằng cách dừng/khởi động lại bộ hẹn giờ và giải pháp này phải hoàn hảo. – Till

1

Có chắc bạn có thể ... đó là khó khăn tôi hy vọng nó làm việc cho bạn, nhưng nó hoạt động cho tôi ..

1- you play your mp3 file. 

2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30]; thì hàm

-(void)Operation:(id)sender; 

được gọi; vì vậy bạn đã kích hoạt chức năng sau 30 giây của tệp mp3 .. bạn có thể tạo nhiều chức năng dựa trên thời gian bạn muốn ..

3 có giải pháp sử dụng khác giờ

[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES]; 

nó sẽ cháy chức năng gọi là Kiểm tra Thời gian

-(void)CheckTime:(id)sender{ 
    if (avAudioPlayerObject.currentTime == 30.0) 
    { 
     //Do Something 
     //Fire and function call such 
     [self performSelector:@selector(Operation:) withObject:Object] 
    } 
} 

sau đó bạn có thể thay đổi khoảng thời gian bạn muốn và lặp đi lặp lại là dành cho bạn để kiểm soát lặp lại điều này hành động mỗi 5 giây hoặc không .. Hy vọng rằng hữu ích ..

Cảm ơn

+0

Tôi không nghĩ giải pháp đầu tiên của bạn sẽ hoạt động: Nếu tôi tạm dừng phát lại tệp âm thanh trong 1 giây sau 10 giây phát lại và sau đó tiếp tục. Bộ hẹn giờ sẽ cháy 1 giây quá sớm. –

+0

thứ hai sau đó nên làm việc nhưng tôi mặc dù người dùng đã không kiểm soát âm thanh để tạm dừng hoặc tiếp tục .. nhưng nếu như vậy bạn có thể sử dụng giải pháp thứ hai .. –

1

với đa luồng mục tiêu của bạn là đơn giản, chỉ cần làm như thế này:

1 : in your main thread create a variable for storing time passed 
2 : create new thread like "checkthread" that check each 30-20 sec(as you need) 
3 : if the time passed is what you want do the callback 
1

tôi nghĩ rằng, bạn muốn chơi âm thanh-file khác nhau sau 30 giây sau đó sử dụng mã này:

1) tất cả các âm thanh-files đặt trong mảng và sau đó lấy từ thư mục tài liệu

2) sau đó thử này:

-(IBAction)play_sound 
{ 

    BackgroundPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:[Arr_tone_selected objectAtIndex:j]ofType:@"mp3"]]error:NULL]; 
    BackgroundPlayer.delegate=self; 

    [BackgroundPlayer play]; 


} 


- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    [BackgroundPlayer stop]; 
    j++; 
    [self performSelector:@selector(play_sound) withObject:Object afterDelay:30]; 
} 
+0

Điều gì xảy ra nếu tôi tạm dừng phát lại tệp âm thanh cho 1 giây sau 10 giây phát lại và sau đó tiếp tục. Bộ hẹn giờ sẽ cháy 1 giây quá sớm. –

+0

tệp âm thanh của bạn hoàn tất sau đó tự động dừng âm thanh và sau 30 giây phát một tệp âm thanh khác, trong mã ở trên của tôi ... những gì bạn nói tôi không hiểu rõ? – Dev

+0

Tôi nghĩ rằng tôi đã nhận xét về câu trả lời sai, nhưng tôi không nghĩ rằng bạn đã hiểu câu hỏi. Các "hoạt động" các đề cập OP có thể là bất kỳ hành động, không chỉ bắt đầu một âm thanh. Và điều gì sẽ xảy ra nếu OP muốn phát một bản nhạc dài 45 giây nhưng vẫn thực hiện hành động sau 30 giây phát lại. Họ không đề cập đến độ dài của bản nhạc họ muốn chơi –

5

Nếu bạn có thể sử dụng AVPlayer thay vì AVAudio Player, bạn có thể thiết lập các quan sát viên thời gian ranh giới hoặc định kỳ:

// File URL or URL of a media library item 
AVPlayer *player = [[AVPlayer alloc] initWithURL:url];   

CMTime time = CMTimeMakeWithSeconds(30.0, 600); 
NSArray *times = [NSArray arrayWithObject:[NSValue valueWithCMTime:time]]; 

id playerObserver = [player addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{ 
    NSLog(@"Playback time is 30 seconds");    
}]; 

[player play]; 

// remove the observer when you're done with the player: 
[player removeTimeObserver:playerObserver]; 

AVPlayer tài liệu: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html

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