[英]iOS, WAV audio not playing
我正在嘗試選擇wav文件ID的應用程序內功能,該功能使用NSURLRequest/Connect
和AVAudioPlayer
下載並播放。
我一直OSStatus error 1954115647
(無法完成該操作。(顯然不支持文件類型))。
文件的詳細信息為PCM S16 LE - Mono - 8000Hz - 16 bit/sample
為了進一步調查,我嘗試使用iPhone的野生動物園直接從托管音頻流中讀取音頻。 不幸的是,似乎瀏覽器也無法播放該文件(在MAC野生動物園和其他瀏覽器中都可以正常工作)。
用於托管流的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
不會起作用。 玩家需要是全球性的,以實現文件(見@property
下@interface
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.