我正在尝试使用应用内功能来选择wav文件ID,其中包含下载和播放功能。使用NSURLRequest/Connect
& AVAudioPlayer
。
我一直遇到OSStatus error 1954115647
(操作无法完成。(显然不支持文件类型))。
文件详细信息为PCM S16 LE - Mono - 8000Hz - 16 bit/sample
为了进一步调查,我试图直接从使用iPhone的Safari游戏托管的流中读取音频。不幸的是,浏览器似乎也无法播放该文件(在MAC safari以及其他浏览器中都能正常工作)。
用于托管流的PHP如下:
$filename = "audio.wav";
header('Content-type: audio/x-wav');
header('Content-length: ' . strlen($file));
header('Content-disposition: inline; filename="' . $filename);
header('X-Pad: avoid browser bug');
header('Cache-Control: no-cache');
echo $file;
我很惊讶这是关于WAV文件的常见用法的问题。我是否寻找替代格式&转换/取消转换使这项工作还是更有可能在其他地方出错?
我读过here iPhone并不支持某些编码,但这是在2007年发布的。
答案 0 :(得分:0)
整体解决方案(对托管文件的请求):
@interface audioPlayer()<AVAudioPlayerDelegate, AVAudioPlayerDataSource>{
@property AVAudioPlayer *player;
}
...
-(void) playFile{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager setCredential:[NSURLCredential credentialWithUser:@"USER" password:@"PASSWORD" persistence:NSURLCredentialPersistenceNone]];
[manager GET:@"http://example.com/audio.wav" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Download Complete!");
NSData *data = responseObject;
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"audio.wav"];
NSError *error;
[data writeToFile:filePath options:NSDataWritingAtomic error:&error];
NSLog(@"file error - %@", error); //should be (null)
NSURL *path = [NSURL fileURLWithPath:filePath];
/*
CFURLRef sysSound;
SystemSoundID soundID;
sysSound = (__bridge CFURLRef)path;
AudioServicesCreateSystemSoundID(sysSound, &soundID);
AudioServicesPlaySystemSound(soundID);
*/
NSError *playError;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:path fileTypeHint:@"wav" error:&playError];
NSLog(@"play error - %@", playError);
[player setDelegate:self];
[player setVolume:1.0];
BOOL prepareCheck = [player prepareToPlay];
NSLog(@"prepare - %hhd", prepareCheck);
BOOL playCheck = [player play];
NSLog(@"play - %hhd", playCheck);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
}
警告:这似乎不适用于iOS模拟器
你会注意到CFURLRef
&amp; SystemSoundID
行注释掉了。这最初是我设法播放音频文件的方式,但系统声音功能有限(不到30秒,仅限PCM类音频)。
如果您的音频属于这些限制范围内,这很好,但我需要大约一分钟的音频。 AVAudioPlayer
解决了这个问题。请参阅代码以便于实现,但请注意,函数本地AVAudioPlayer
的初始化将不起作用。播放器需要对实现文件是全局的(请参阅@property
下的@interface
)