Soru iPhone: AVAudioPlayer desteklenmeyen dosya türü


Uygulamam, sunucumuzdan bir mp3 indiriyor ve kullanıcıyı tekrar oynatıyor. Dosya 64 kbps'dir (eğer doğru anlarsam iPhone için kabul edilebilir aralıktadır). Bunu düzinelerce sitede nasıl yapacağımı araştırdım ve hepsi de şunu yapmamı önerdi:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];
NSError *e = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e];
[player setDelegate:self];

Kodu çalıştırdığımda, oyuncu geri döner ve bu hatayı alıyorum:

2011-02-04 10:44:46.176 MyApp[6052:207] Error loading audio: Error Domain=NSOSStatusErrorDomain Code=1954115647 "The operation couldn’t be completed. (OSStatus error 1954115647.)"
2011-02-04 10:44:49.647 MyApp[6052:207] unsupported file type

Dosyayı kontrol ettim ve çalıştığını biliyorum. Windows Media Player'da ve Mac'te Quicktime'da sorunsuz olarak çalışacaktır. Ayrıca dosyayı iPhone emülatörüne yükledim ve hiçbir sorun olmadan çalmaya başladım. Dosya iyi, ancak bazı nedenlerden dolayı AVAudioPlayer bunu sevmiyor.

Değiştirmem gereken bir şey var mı? Ne tür bir dosya olduğunu belirlemek için NSData için bir çeşit ayar var mı? Herhangi bir fikri olan var mı?


25
2018-02-04 18:41


Menşei




Cevaplar:


Sonunda bu soruna bir çözüm buldum! Ses oynatıcısını NSData nesnesiyle başlatmak yerine, dosyayı Belgeler klasörüne kaydettim ve daha sonra oynatıcıyı dosya URL'siyle başlattım.

//download file and play from disk
NSData *audioData = [NSData dataWithContentsOfURL:someURL];
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , fileName];
[audioData writeToFile:filePath atomically:YES];

NSError *error;
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
if (player == nil) {
    NSLog(@"AudioPlayer did not load properly: %@", [error description]);
} else {
    [player play];
}

Uygulama dosya ile bittiğinde, silinebilir. Umarım sadece bana yardımcı olur.


30
2018-03-09 21:59





Aynı sorunla uğraşıyorduk - önce dosyayı diske yazmamız gerekiyordu. Sonunda bulduğum şey, indirdiğimiz verilerin başlangıçta fazladan boş baytlar olmasıdır. Kullanarak diskten okurken initWithContentsOfURL, AVAudioPlayer bununla nasıl başa çıkılacağını biliyordu, ancak NSData'dan yükleme yaparken initWithData, yapmadım. Bu baytları kırpmak düzeltildi.


12
2018-03-18 22:36



Ah bu çok ilginç. Belki de Apple'a bir hata olarak mı gönderilmeli? Sonunda, kaydedilmiş dosyayı zaten tercih ettim çünkü yapmaya çalıştığımız şeyle daha iyi uyum sağladı. Bahşiş için teşekkürler! - mtmurdock
Hangi byte'ları kırptığınızı tam olarak nasıl biliyorsunuz ve bunu nasıl yaptınız? - typeoneerror
@typeoneerror: Belirli bir dosya aldım, bir hex editörü ile baktım ve başlığın nasıl tanımlandığını görmek için mp3 özelliklerini okudum. Bu arada tutarsızlığı fark ettim. Çok genel değil, biliyorum ... Programsal olarak, NSData'nın ilk baytlarına bakabilir ve 0 olanı atlayabilirsiniz. - Don
@Don teşekkür ederim, efendim. - typeoneerror
Bu çok harika! Sen en iyisisin! - iWheelBuy


İOS 7'den AVAudioPlayer'ın yeni başlatıcısı var

NSError *error;
[[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]

Desteklenen UTI'ler

NSString *const AVFileType3GPP;
NSString *const AVFileType3GPP2;
NSString *const AVFileTypeAIFC;
NSString *const AVFileTypeAIFF;
NSString *const AVFileTypeAMR;
NSString *const AVFileTypeAC3;
NSString *const AVFileTypeMPEGLayer3;
NSString *const AVFileTypeSunAU;
NSString *const AVFileTypeCoreAudioFormat;
NSString *const AVFileTypeAppleM4V;
NSString *const AVFileTypeMPEG4;
NSString *const AVFileTypeAppleM4A;
NSString *const AVFileTypeQuickTimeMovie;
NSString *const AVFileTypeWAVE;

11
2017-07-06 11:12



Teşekkürler. İşe yaradı. - DHEERAJ
Teşekkür ederim. Bana cevabınıza çok yardımcı oldunuz! - Alexander
Mükemmel cevap, teşekkürler! İOS 9 ile çözümü bir şekilde kurtarıyor gibi görünüyor ... - Resty


Ürün adınız boşluk içeriyorsa, hatayı alırsınız.
 Projemin ürün adı: Panorama 1453 TR. initWithContentsOfURL yöntem dosya yolunu alamaz. bu yüzden çalışmıyordu. bir breakPoint koyabilirsiniz NSURL *fileURL = . Bir adımdan sonra, hangi verilerin sahip olduğunu fileURL görebilirsiniz.  
 Panorama1453TR olarak değiştirdim, işe yaradı.


1
2018-05-23 08:46