Php iOS,WAV音频未播放
我正在尝试在应用程序中使用选择wav文件ID的功能,该功能使用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如下所示
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);
}];
}