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?
Trả lời
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
}
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:
- Lấy
currentTime
của AVAudioPlayer bạn - Kiểm tra để xem nếu
currentTime
lớn hơncriticalPoint
- Nếu có, hãy kiểm tra xem nếu
lastCurrentTime
ít hơncriticalPoint
- Nếu có, hãy thực hiện hành động của bạn.
- Đặt
lastCurrentTime
đểcurrentTime
Đá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. –
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
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
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. –
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 .. –
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
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];
}
Đ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. –
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
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 –
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
- 1. Làm cách nào để phát âm thanh của iPhone?
- 2. Tôi làm cách nào để ghi lại âm thanh hiện đang phát trên iPhone?
- 3. Các cách khác để thực hiện thao tác modulo
- 4. Cách thực hiện các thao tác ngày trong hibernate
- 5. Làm cách nào để thực hiện thao tác 'hoàn tác' trong ứng dụng cửa sổ .net?
- 6. Làm thế nào để phát hiện tần số âm thanh/quảng cáo chiêu hàng trên iPhone?
- 7. Làm thế nào để bạn phát hiện khi âm thanh HTML5 đã phát xong (nhiều lần)?
- 8. Cách phát âm thanh bằng Python KHÔNG làm gián đoạn âm nhạc/các âm thanh khác phát khi đang chơi
- 9. Làm cách nào để đặt tiêu đề của âm thanh hiện đang phát trong màn hình khóa iPhone?
- 10. iphone: đang phát danh sách phát âm thanh trong nền?
- 11. Làm cách nào để phát âm thanh trong WinForms?
- 12. Làm cách nào để phát âm thanh cửa sổ chuẩn?
- 13. Âm thanh âm thanh định tuyến iPhone
- 14. Làm cách nào để thực hiện thao tác bit trong glsl
- 15. Phát lại âm thanh qua iPhone: buộc qua loa trong?
- 16. Tôi làm cách nào để hiển thị MediaController trong khi phát âm thanh trong Android?
- 17. Phát hiện các đặc điểm trong dòng âm thanh
- 18. Làm cách nào để phát tệp âm thanh với jQuery?
- 19. Cách phát âm thanh bằng AVAudioPlayer khi ở Chế độ im lặng trong iPhone
- 20. Cách phát hiện âm thanh từ micrô trong .net
- 21. Thực hiện hành động khi một âm thanh phát xong trong AVAudioPlayer?
- 22. Tôi làm cách nào để phát âm thanh ngược lại với API âm thanh trên web?
- 23. android: Phát hiện mức âm thanh
- 24. Làm thế nào để phát âm thanh trong JavaScript
- 25. Cách thực hiện thao tác hợp nhất data.table
- 26. Làm cách nào để thực hiện các thao tác khác nhau trong bản cập nhật của Observer() trong Java?
- 27. Làm cách nào để thực hiện các thao tác trên các đối sánh Regre Backreference trong Javascript?
- 28. Âm thanh trên iPhone
- 29. Nhận luồng âm thanh từ URI và phát trên iPhone
- 30. Làm cách nào để thực hiện các thao tác lịch trong Java GWT? Cách thêm ngày vào một ngày?
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