iOS,WAV音频未播放


iOS, WAV audio not playing

我正在尝试让一个应用内功能来选择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/Connect0下的@property