iOS,WAV音频无法播放

时间:2015-03-23 11:06:12

标签: php ios audio wav pcm

我正在尝试使用应用内功能来选择wav文件ID,其中包含下载和播放功能。使用NSURLRequest/Connect& AVAudioPlayer

我一直遇到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文件的常见用法的问题。我是否寻找替代格式&转换/取消转换使这项工作还是更有可能在其他地方出错?

我读过here iPhone并不支持某些编码,但这是在2007年发布的。

1 个答案:

答案 0 :(得分:0)

整体解决方案(对托管文件的请求):

@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&amp; SystemSoundID行注释掉了。这最初是我设法播放音频文件的方式,但系统声音功能有限(不到30秒,仅限PCM类音频)。

如果您的音频属于这些限制范围内,这很好,但我需要大约一分钟的音频。 AVAudioPlayer解决了这个问题。请参阅代码以便于实现,但请注意,函数本地AVAudioPlayer的初始化将不起作用。播放器需要对实现文件是全局的(请参阅@property下的@interface