iOS,WAV 音频未播放

iOS, WAV audio not playing

我正在尝试使用应用内功能来选择 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 文件的普遍使用的问题。我是在寻找替代格式 & convert/deconvert 来完成这项工作,还是在其他地方更有可能出错?

我读到 here 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 模拟器

您会注意到 CFURLRefSystemSoundID 行被注释掉了。原来我是这样播放音频文件的,但是系统声音功能有限(不到30秒,仅限PCM类型音频)。

如果您的音频在这些限制范围内,这很好,但我需要大约一分钟的音频。 AVAudioPlayer 解决了这个问题。请参阅代码以轻松实现,但请注意函数局部 AVAudioPlayer 的提示将不起作用。播放器需要全局到实现文件(见@interface下的@property