我正在尝试让一个应用内功能来选择wav文件ID,它下载&使用CCD_ 1&CCD_ 2。
我一直在运行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文件的常见用法的问题。我是否要寻找替代格式&转换/取消转换以使此项工作正常进行,还是在其他地方更可能出现错误?
我在这里读到iPhone不支持某些编码,但这是在2007年发布的。
整体解决方案(对托管文件的请求):
@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
&SystemSoundID
行注释掉。这是我最初播放音频文件的方式,但系统声音功能有限(小于30秒,仅限PCM类型的音频)。
如果你的音频在这些限制范围内,这很好,但我需要大约一分钟的音频。AVAudioPlayer
解决了这个问题。请参阅代码以获得简单的实现,但请注意,函数的AVAudioPlayer
本地提示将不起作用。播放器需要对实现文件是全局的(请参阅NSURLRequest/Connect
0下的@property
)