簡體   English   中英

iOS,WAV音頻無法播放

[英]iOS, WAV audio not playing

我正在嘗試選擇wav文件ID的應用程序內功能,該功能使用NSURLRequest/ConnectAVAudioPlayer下載並播放。

我一直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模擬器上似乎不起作用

您會注意到CFURLRefSystemSoundID行已被注釋掉。 最初這是我設法播放音頻文件的方式,但是系統聲音功能受到限制(少於30秒,僅PCM類型的音頻)。

如果您的音頻在這些限制之內,這很好,但是我需要大約一分鍾的音頻。 AVAudioPlayer解決了這個問題。 請參閱代碼以實現簡單的實現,但是請注意,對函數本地的AVAudioPlayer不會起作用。 玩家需要是全球性的,以實現文件(見@property@interface

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM