2013-07-08 23 views
9

Diğer iOS cihazlarına ses dosyaları (güvenli/şifreli) gönderebilen bir iOS uygulamasını değiştirmeye çalışıyorum. Ses dosyalarını kaydetmek için AVAudioRecorder'ı kullanır ve alınan ses dosyalarını çalmak için AVAudioPlayer kullanır.AVAudioRecorder, açılabilir ve oynatılabilir .m4a dosyaları oluşturmuyor

Artık Android ile uyumlu dosyalar oluşturmak ve göndermek için uygulamayı değiştirmeye çalışıyorum. ancak bir Android cihazda, iOS cihazda, bu yarattığı

[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey]; 
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitRateKey]; 
[settings setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; 
[settings setValue:[NSNumber numberWithFloat:48000.0] forKey:AVSampleRateKey]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *dirPath = [paths objectAtIndex:0]; 

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"yyyy-MM-dd HH-mm"]; 

NSString *filename = [NSString stringWithFormat:@"%@.aac", [format stringFromDate:NSDate.date]]; 

dosyaları Mac'te çalınabilir: Ben bu mevcut AVAudioRecorder kodunu güncellenmiştir. Dosya uzantısı ".m4a" ile bitecek şekilde manuel olarak değiştirildiyse, dosya Android'de oynatılır.

(".aac" formatı ile avantaj uygulamanın eski sürümleri bu dosyaları almak ve onları geri oynayabileceği - ı geriye uyumluluk muhafaza ettik.)

Yani bu değişikliği yapan:

Ancak, sonuçta ortaya çıkan dosya (AVAudioRecorder'dan hiçbir hata olmadan oluşturulur) Mac'lerde ve iOS aygıtlarında oynatılamaz. Ve Android üzerinde çalışıp çalışmadığını duymak için bekliyorum.

AVAudioPlayer bu dosyayı açmaya çalıştığında, çıkarır:

Hata Alan = NSOSStatusErrorDomain Kodu = 1685348671 "operasyonu tamamlanamadı (OSStatus hata 1685348671.)" Kod 1685348671 -> "dta?": Dosya bozuk, türünde bir ses dosyasının geçerli bir örneği değil veya bir ses dosyası olarak tanınmıyor.

Sadece bir ".aac" olması için dosyayı yeniden adlandırmak, Mac veya iOS'ta bir öğeye yüklenememesi gerçeğini değiştirmez.

Şimdilik, en iyi çözüm, bir ".aac" dosyası oluşturmak ve daha sonra Android sonuna ".aac" ile ".m4a" ile değiştirmek ve oynatmaya çalışmak gibi görünüyor.

Soru 1: Dosya adı uzantısını AVAudioPLayer başarısız olmasına neden olabilir değişen neden bilen var mı? BTW, yukarıda oluşturulan ".m4a" dosyasını, ben bu yüzden sorun dosyası biçiminde veya bu dosya türünü okumak için iOS veya Mac yetersizlik ile olup olmadığını söyleyemem Mac üzerindeki herhangi bir şeyle açılamaz .

https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2013-24.m4a https://dl.dropboxusercontent.com/u/14939586/2013-07-08%2010-11.aac

Soru 2:

meraklı herkes için, ben burada bir ".aac" bir kopyasını ve AVAudioRecorder bir ".m4a" dosyasını koymak ben birine AVAudioRecorder set ederken Kanal, sonuçta elde edilen dosya stereodur. Niye ya? kayıpsız kodlama için AAC-LC belirtmek için yine de var mı:

Soru 3 (En azından VLC meta verileri hakkında söylediği budur)? Ben alt düzey API AVAudioRecorder hareket Ya ben sadece bunu yapabilirsiniz?

+1

bu yararlıdır: http://stackoverflow.com/questions/4279311/how-to-record-voice-in-m4a-format –

+0

Bu soruya verilen cevap tamamen yanlıştır. Dosya gerçek bir AAC dosyası değil. Sadece bir m4a ile sarılmıştır. Diğer cevaplardan biri doğrudur. Ayrıca daha fazla yardım bu cevap oldu: http://stackoverflow.com/a/12698691/86020 – mahboudz

cevap

8

1. soruya cevap, doğru ses oturumu ayarlamak zorunda aksi m4a dosyası doğru biçimlendirilmiş almaz olduğunu.Şimdi ben Kaydı başlatmak hemen önce, set ses oturumu kodudur: ses dosyaları çalınabilir, böylece kayıt bittikten sonra

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryRecord error:nil]; 
[session setActive:YES error:nil]; 

Ben oynatma için geri oturumu ayarlayın.

Soru 2, VLC'de yanlış sayıda kanalı görüntüleyen bir sorundur. MacOS Finder'ın Bilgi Al penceresinde ses dosyası tek kanal olarak görünür.

Soru 3 yanıtlanmadı.

+0

mahboubz Büyük çağrı noktası 1 konu tamamen çözüldü! –

3

için Tutanak ses android yanı sıra iOS oynamak ".m4a" dosyasında, ben kod aşağıdaki kullanın oluşturun ve:

NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; 

[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; 
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; 
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; 


AudioRecorder = [[AVAudioRecorder alloc] initWithURL:fileOutPutUrl settings:recordSetting error:nil]; 
[AudioRecorder setDelegate:self]; 
[AudioRecorder recordForDuration:RecordLimitTime]; // Record Limit if require 
if ([AudioRecorder prepareToRecord]) { 
    [AudioRecorder record]; 
} 

Android tarafında i değiştirmek gerekmez Sadece ".mp3" dosyası oynatmak için kod, sadece "fileName.m4a" dan "fileName.mp3" e kadar olan uzantıyı değiştirir ve şaşırtıcı bir şekilde çalışır ve iOS dosyasında çalışır. "fileName.m4a" düzgün bir şekilde çalınır.

İlgili konular