[英]AVAudioPlayer doesn't play mp3?
我希望我的AVAudioPlayer
播放一些mp3文件。 它播放其中一些,但我有一個無法播放的文件!
要播放該文件,我將其在我的設備上下載到應用程序文件夾中並以這種方式初始化:
[[AVAudioPlayer alloc] initWithContentsOfURL:soundPath error:nil];
怎么播放文件? 為什么不玩?
鏈接到文件: abc.mp3
編輯:
(這是顯示錯誤的代碼。代碼中有一個自述文件。嘗試使用該設備。)
***.pch
#import <Availability.h>
#ifndef __IPHONE_4_0
#warning "This project uses features only available in iOS SDK 4.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
#endif
ViewController.h
#import <UIKit/UIKit.h>
#import "AFNetworking.h"
@interface SCRViewController : UIViewController <AVAudioPlayerDelegate>
{
UIButton *button;
__block UIProgressView *view;
NSOperationQueue *queue;
__block BOOL isFile;
UIButton *play;
NSString *path;
AVAudioPlayer *_player;
}
@end
ViewController.m
#import "ViewController.h"
@implementation SCRViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundColor:[UIColor yellowColor]];
[button setFrame:CGRectMake(50, 50, 220, 50)];
[button addTarget:self action:@selector(download) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Download" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[self.view addSubview:button];
play = [UIButton buttonWithType:UIButtonTypeCustom];
[play setBackgroundColor:[UIColor yellowColor]];
[play setFrame:CGRectMake(50, 150, 220, 50)];
[play addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside];
[play setTitle:@"Play" forState:UIControlStateNormal];
[play setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[play setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[self.view addSubview:play];
self->view = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
self->view.frame = CGRectMake(10, 120, 300, 20);
[self->view setProgress:0];
[self.view addSubview:self->view];
queue = [[NSOperationQueue alloc] init];
isFile = NO;
}
- (void) download
{
[button setBackgroundColor:[UIColor brownColor]];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateDisabled];
[button setEnabled:NO];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://iwheelbuy.com/abc.mp3"]];
//-------------------------------------------------------
//-------------------------------------------------------
// READ ME
//-------------------------------------------------------
//-------------------------------------------------------
// Test in on device
// I have uploaded another song for you. You can change link to http://iwheelbuy.com/def.mp3 and check the result
// def.mp3 works fine on the device
//-------------------------------------------------------
//-------------------------------------------------------
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"song"];
if ( [[NSFileManager defaultManager] fileExistsAtPath:path])
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
isFile = YES;
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
//
}];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
{
CGFloat done = (CGFloat)((int)totalBytesRead);
CGFloat expected = (CGFloat)((int)totalBytesExpectedToRead);
CGFloat progress = done / expected;
self->view.progress = progress;
}];
[queue addOperation:operation];
}
- (void) play
{
if (isFile)
{
NSError *error = nil;
NSURL *url = [NSURL fileURLWithPath:path];
_player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if(error || !_player)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:[error description] delegate:nil cancelButtonTitle:@"Try def.mp3" otherButtonTitles:nil];
[alert show];
}
else
{
[_player play]; // plays fine
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
}
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Download the file plz" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alert show];
}
}
@end
非ARC
您必須在播放期間保留它,因為它不會保留自己。 一旦解除分配,它將立即停止播放。
弧
您需要在類中保存AVAudioPlayer
實例。 並在它停止播放后釋放它。 例如,
#import <AVFoundation/AVFoundation.h>
@interface TAViewController () <AVAudioPlayerDelegate> {
AVAudioPlayer *_somePlayer; // strong reference
}
@end
@implementation TAViewController
- (IBAction)playAudio:(id)sender
{
NSURL *url = [[NSBundle mainBundle] URLForResource:@"kogmawjoke" withExtension:@"mp3"];
_somePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
_somePlayer.delegate = self;
[_somePlayer play];
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player == _somePlayer) {
_somePlayer = nil;
}
}
@end
http://bugreport.apple.com
Engineering已根據以下信息確定此問題的行為符合預期:
可以使用附加的示例應用程序進行重新編譯,但這是AudioFile的預期行為。
問題是AVAudioPlayer
正在使用沒有文件擴展名的url進行初始化,並且相應的文件沒有有效的ID3
標記。沒有文件擴展名或有效數據,我們無法確定正確的文件格式,因此這些文件將無法打開這是一種預期的行為。
在附帶的示例代碼中:
path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingPathComponent:@"song"];
- >路徑將是這樣的:
在/ var /移動/應用/ 2FFD0147-E56B-47D4-B143-A9F19BE92818 /文件/歌曲
- >注意:最后沒有文件擴展名。
與具有有效標記大小(0x927)的def.mp3不同,abc.mp3具有無效的ID3
標記大小(0x2EE)。 因此,當這些被指定為“...。/ song”而沒有任何擴展時,AudioFile只查看數據並找到def.mp3的有效同步字,但不能找到abc.mp3。
但是,用stringByAppendingPathComponent:@"song"
替換stringByAppendingPathComponent:@"song"
stringByAppendingPathComponent:@"song.mp3"
成功為abc.mp3,並且可以幫助其他一般的mp3文件。
我們認為這個問題已經結束 如果您對此問題有任何疑問或疑慮,請直接更新您的報告( http://bugreport.apple.com )。
感謝您抽出寶貴時間通知我們此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.