Php iOS,WAV音频未播放

Php iOS,WAV音频未播放,php,ios,audio,wav,pcm,Php,Ios,Audio,Wav,Pcm,我正在尝试在应用程序中使用选择wav文件ID的功能,该功能使用NSURLRequest/Connect和AVAudioPlayer下载和播放 我一直遇到OSStatus错误1954115647(操作无法完成。(显然不支持文件类型)) 文件详细信息是PCM S16 LE-Mono-8000Hz-16位/样本 为了进一步调查,我尝试直接从使用iPhone的safari托管的流中读取音频。不幸的是,浏览器似乎也无法播放该文件(在MAC safari和其他浏览器中都可以正常工作) 托管流的PHP如下所示

我正在尝试在应用程序中使用选择wav文件ID的功能,该功能使用
NSURLRequest/Connect
AVAudioPlayer
下载和播放

我一直遇到
OSStatus错误1954115647
(操作无法完成。(显然不支持文件类型))

文件详细信息是PCM S16 LE-Mono-8000Hz-16位/样本 为了进一步调查,我尝试直接从使用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(){
@属性AVAudioPlayer*玩家;
}
...
-(作废)播放文件{
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
manager.responseSerializer=[AFHTTPResponseSerializer序列化程序];
[manager setCredential:[NSURLcredentialCredentialWithUser:@“用户”密码:@“密码”持久性:NSURLcredentialPersistenceOne];
[经理获取:@”http://example.com/audio.wav参数:无成功:^(AFHTTPRequestOperation*操作,id响应对象){
NSLog(@“下载完成!”);
NSData*数据=响应对象;
NSString*filePath=[NSTemporaryDirectory()stringByAppendingPathComponent:@“audio.wav”];
n错误*错误;
[数据写入文件:文件路径选项:NSDataWritingAtomic错误:&错误];
NSLog(@“文件错误-%@”,错误);//应为(null)
NSURL*path=[NSURL fileURLWithPath:filePath];
/*
CFURLRef系统声音;
系统声音ID;
sysSound=(uu桥CFURLRef)路径;
AudioServicesCreateSystemSoundID(系统声音和声音ID);
AudioServicesPlaySystemSound(soundID);
*/
N错误*播放错误;
player=[[AVAudioPlayer alloc]initWithContentsOfURL:path fileTypeHint:@“wav”错误:&playError];
NSLog(@“播放错误-%@”,播放错误);
[玩家设置代表:自我];
[播放器设置音量:1.0];
BOOL prepareCheck=[player prepareToPlay];
NSLog(@“准备-%hhd”,准备检查);
布尔播放检查=[玩家播放];
NSLog(@“播放-%hhd”,播放检查);
}失败:^(AFHTTPRequestOperation*操作,NSError*错误){
NSLog(@“错误:%@”,错误);
}];
}
警告:这在iOS模拟器上似乎不起作用

您将注意到注释掉的
CFURLRef
SystemSoundID
行。这是我最初设法播放音频文件的方式,但是系统声音功能有限(小于30秒,仅PCM类型音频)


这是好的,如果你的音频是在这些限制,但我需要大约一分钟的音频
AVAudioPlayer
解决了这个问题。请参阅代码以了解简单的实现,但请注意,函数的
AVAudioPlayer
本地提示将不起作用。播放器需要是实现文件的全局文件(请参见
@接口
下的
@属性

是否使用标准44100赫兹采样率的音频文件工作?音频通过电信语音网络使用,因此需要8000采样率
@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);
}];
}