2012-08-28 34 views
10

Tôi đang cố gắng ghi lại âm thanh trên Thiết bị bằng cách sử dụng AVAudioRecorder. Tệp đó được truyền tới máy chủ web và tôi muốn phát tệp kết quả đó trong trình duyệt web ..Bản ghi AVAudioRecorder AAC/m4a

Tôi đã thử kết hợp các cài đặt khác nhau trên thiết bị ... dường như không mã hóa tệp thành định dạng AAC chính xác .

QuickTime nói rằng nó không biết cách phát tệp này.

Mẫu mã

private void InitializeRecordingSession() { 
     string fileName = string.Format("{0}.m4a", Guid.NewGuid()); 
     string tmpdir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/audio"; 
      if (!Directory.Exists(tmpdir)) 
       Directory.CreateDirectory(tmpdir); 
      audioFilePath = Path.Combine(tmpdir, fileName); 

      Console.WriteLine("Audio File Path: " + audioFilePath); 

      var url = NSUrl.FromFilename(audioFilePath); 
      var settings = new AVAudioRecorderSettings() { 
       AudioFormat = AudioFormatType.MPEG4AAC, 
       SampleRate = 44100, 
       NumberChannels = 1, 
       AudioQuality = AVAudioQuality.High,  
      }; 

      recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

      //Set Recorder to Prepare To Record 
      recorder.PrepareToRecord(); 
    } 

Sửa -By đặt mã này ở trước dòng

recorder = AVAudioRecorder.ToUrl(url, settings, out error); 

Tất cả mọi thứ đã làm việc.

NSError error;  
AVAudioSession audioSession = AVAudioSession.SharedInstance(); 
audioSession.SetCategory(AVAudioSession.CategoryRecord, out error); 
audioSession.SetActive(true, out error); 
+0

Tôi tự hỏi nếu bạn đã tìm thấy giải pháp cho điều này như tôi phải đối mặt với cùng một vấn đề. – justinkoh

Trả lời

6

SDK iOS dường như là ngu ngốc. Đặt khóa ID định dạng thành kAudioFormatMPEG4AAC là không đủ để mã hóa tệp thực sự; trong QuickTime nó sẽ phát nhưng trong các thuộc tính của nó, bạn sẽ chỉ thấy AAC và không có thêm chi tiết nào. Thay đổi phần mở rộng tập tin đầu ra thành m4a sẽ giúp thực hiện thủ thuật và làm cho nó áp dụng đúng mã hóa.

+0

Tôi khá chắc chắn rằng tôi đã thử điều đó và nó không hoạt động. Nhưng tôi sẽ thử lại lần nữa. –

+0

điều này vẫn không hoạt động "Đây không phải là một tập tin mà quicktime hiểu" –

+0

Tôi sợ phương pháp này đã không làm việc cho tôi hoặc. – justinkoh

30

Đối với bộ mã hóa tăng tốc phần cứng, chỉ một phiên có thể hoạt động tại bất kỳ thời điểm đã định nào. Điều này có nghĩa là, đối với AAC, nó sẽ hoạt động trong trình mô phỏng (nơi bộ mã hóa phần mềm được sử dụng) nhưng có thể bị lỗi trên thiết bị (khi sử dụng bộ mã hóa phần cứng) trừ khi ứng dụng của bạn kích hoạt AVAudioSession.

Tôi cũng đang cố gắng sử dụng AVAudioRecorder để ghi lại âm thanh ở định dạng được mã hóa AAC tốt hơn trong tệp .m4a. Tôi đã có một con quái vật của một thời gian làm điều này. Tôi đã nhanh chóng có thể lấy mã để ghi vào AAC bên trong một tệp âm thanh lõi (.caf), nhưng tôi không thể nhận được AVAudioRecorder để định dạng đúng .m4a. Tôi vừa viết lại mã ghi trong ứng dụng của mình bằng cách sử dụng API đơn vị âm thanh cấp thấp hơn nhưng thay vào đó tôi đặt nó trên đầu ghi ngược và được thêm vào trong mã để xử lý phiên âm thanh được chia sẻ. Một khi đã được thiết lập, tôi đã quay lại và cố gắng tiết kiệm như một .m4a và nó chỉ hoạt động.

Dưới đây là một số mã ví dụ:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSURL *tmpFileUrl = [NSURL fileURLWithPath:[docsDir stringByAppendingPathComponent:@"tmp.m4a"]]; 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, 
         [NSNumber numberWithFloat:16000.0], AVSampleRateKey, 
         [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, 
         nil]; 
NSError *error = nil; 
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:tmpFileUrl settings:recordSettings error:&error]; 
[recorder prepareToRecord]; 

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

[recorder record]; 

Sau đó, để kết thúc buổi ghi hình tôi đã sử dụng:

[recorder stop]; 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation; 
[session setActive:NO withFlags:flags error:nil]; 

Sau đó, hồ sơ tại 'tmpFileUrl' có thể được sử dụng như bạn vui lòng.

+1

Điều này nên được upvoted vô số lần! – mahboudz

+0

Câu trả lời tuyệt vời. Cảm ơn điều này đã cứu tôi rất nhiều thời gian! –

3

Các gợi ý về AVAudioSession rất hữu ích!

Kể từ setActive:withFlags:error: đã trở nên lỗi thời trong iOS 6.0 mã cho dừng phiên âm thanh nên được điều chỉnh để:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
int flags = AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation; 
[session setActive:NO withOptions:flags error:nil]; 
Các vấn đề liên quan