2011-03-17 28 views
7

Tôi có bộ điều khiển chế độ xem sử dụng AVPlayer. bộ điều khiển chế độ xem này có thể tải trình kiểm soát chế độ xem ở chế độ mà người dùng có thể ghi lại âm thanh bằng cách sử dụng AVAudioRecorder.iPhone SDK: AVAudioRecorder sẽ không ghi lại sau khi gọi [AVPlayer play]

đây là những gì sẽ xảy ra:

nếu người dùng đóng các thành phần trong bộ điều khiển nắm tay với [AVPLayer chơi] các AVAudioRecorder sẽ không ghi trong bộ điều khiển xem phương thức. không có lỗi nhưng thời gian hiện tại được trả về bởi AVAudioRecorder là 0.0;

nếu người dùng loại bỏ hộp thoại phương thức và tải lại. AVAudioRecorder hoạt động tốt.

này có thể được lặp đi lặp lại AVAudioRecorder không hoạt động lần đầu tiên nó được gọi sau một [AVPlayer chơi] gọi

tôi đã chiến đấu với điều này trong nhiều ngày và chỉ cần đã tổ chức lại mã của tôi liên quan đến cả hai AVPlayer và AVAudioRecorder và nó vẫn hoạt động kỳ quặc.

Bất kỳ sự giúp đỡ hay con trỏ được nhiều đánh giá

Cảm ơn trước

Jean-Pierre

+0

hi thử nó cho giải pháp nó làm việc cho tôi http://stackoverflow.com/questions/4148123/avaudiorecorder-wont-record-if-movie-was-previously-recorded-played –

Trả lời

0

không nên nó được [AVAudioRecorder record]; thay vì play?

3

Bạn đặt danh mục của AVAudioSession, tức là, phát hoặc ghi? Hãy thử một cái gì đó như

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
+1

Xin chào Don. Có tôi làm điều này. Đây là trong tay của Apple bây giờ. Có vẻ như nó có thể là một lỗi trong mã của họ. Cảm ơn vi đa trả lơi. Tôi sẽ cập nhật bài đăng này khi tôi nhận thêm thông tin. –

+0

Điều đó làm việc tốt cho tôi – yogs

1

Tôi đã gặp vấn đề tương tự. Tôi sử dụng AVPlayer để phát các tác phẩm (các bản ghi trước đó mà tôi đã sử dụng AVAudioRecord). Tuy nhiên, tôi thấy rằng một khi tôi đã sử dụng AVPlayer, tôi không còn có thể sử dụng AVAudioRecorder nữa. Sau khi tìm kiếm một số, tôi phát hiện ra rằng miễn là AVPlayer được khởi tạo trong bộ nhớ và đã được chơi ít nhất một lần (thường là những gì bạn làm ngay lập tức sau khi instantiating nó) AVAudioRecorder sẽ không ghi lại. Tuy nhiên, sau khi AVPlayer được dealloc'd, AVAudioRecorder sau đó được tự do ghi lại. Dường như AVPlayer giữ một số loại kết nối mà AVAudioRecorder cần, và nó tham lam ... nó sẽ không để cho nó đi cho đến khi bạn chích nó từ bàn tay chết lạnh của nó.

Đây là giải pháp tôi đã tìm thấy. Một số người cho rằng việc khởi tạo AVPlayer mất quá nhiều thời gian để tiếp tục phá vỡ và thiết lập sao lưu. Tuy nhiên, điều này là không đúng sự thật. InstantPlating AVPlayer thực sự khá tầm thường. Vì vậy, cũng là instantiating AVPlayerItem. Điều gì không phải là tầm thường đang tải lên AVAsset (hoặc bất kỳ lớp con nào của nó). Bạn thực sự chỉ muốn làm điều đó một lần. Điều quan trọng là sử dụng trình tự này:

  1. Tải lên AVAsset (ví dụ: nếu bạn đang tải từ một tệp, hãy sử dụng AVURLSắp đặt trực tiếp hoặc thêm vào AVMutableComposition và sử dụng) và giữ tham chiếu đến nó. Đừng để nó đi cho đến khi bạn hoàn thành nó. Tải nó là những gì mất tất cả thời gian.
  2. Khi bạn đã sẵn sàng chơi: hãy khởi tạo AVPlayerItem bằng nội dung của bạn, sau đó là AVPlayer với AVPlayerItem và phát nó. Đừng giữ một tham chiếu đến AVPlayerItem, AVPlayer sẽ giữ một tham chiếu đến nó và bạn không thể sử dụng lại nó với người chơi khác anyway.
  3. Sau khi phát xong, ngay lập tức hủy AVPlayer ... giải phóng, đặt var thành nil, bất cứ điều gì bạn cần làm.**
  4. Bây giờ bạn có thể ghi lại. AVPlayer không tồn tại, vì vậy AVAudioRecorder là miễn phí để làm điều đó.
  5. Khi bạn đã sẵn sàng phát lại, hãy khởi tạo lại AVPlayerItem bằng nội dung bạn đã tải & Trình phát AVPlayer. Một lần nữa, điều này là tầm thường. Nội dung đã được tải để không bị chậm trễ.

** Lưu ý rằng việc hủy bỏ AVPlayer có thể mất nhiều hơn là chỉ phát hành và thiết lập var thành 0. Nhiều khả năng, bạn cũng đã thêm một người quan sát theo thời gian định kỳ để theo dõi tiến trình chơi. Khi bạn làm điều này, bạn nhận được một đối tượng mờ đục mà bạn phải giữ. Nếu bạn không xóa mục này khỏi trình phát VÀ phát hành nó/đặt nó thành không, AVPlayer sẽ không dealloc. Có vẻ như Apple tạo ra một chu trình giữ cố ý, bạn phải phá vỡ thủ công. Vì vậy, trước khi bạn phá hủy AVPlayer bạn cần (ví dụ):

[_player removeTimeObserver:_playerObserver]; 
[_playerObserver release]; //Only if you're not using ARC 
_playerObserver = nil; 

Là một mặt lưu ý, bạn cũng có thể đã thiết lập NSNotifications (tôi sử dụng một để xác định khi người chơi đã hoàn chơi) ... không quên loại bỏ những người là tốt.

+0

Cảm ơn bạn đã gợi ý để tiêu diệt AVPlayer. Sẽ mất nhiều thời gian hơn nếu tôi không đọc. – chritaso

8

Tôi cũng gặp vấn đề tương tự và đây là giải pháp mà tôi đã tìm thấy.

Khi ghi, viết mã dòng này sau khi AVAudioRecord được khởi tạo:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:NULL];

Sau đó gọi record phương pháp.

+0

Điều này thực sự giúp! Bạn thiết lập AVAudioSessionCategoryRecord khi ghi và AVAudioSessionCategoryPlayback khi phát lại. Ngoài ra còn có AVAudioSessionCategoryPlayAndRecord mà có thể làm việc tốt hơn cho các trường hợp bạn cần cả bản ghi và phát lại cùng một lúc. –

0

Tôi đã gặp sự cố tương tự: AVAudioRecorder không bắt đầu quay. Ví dụ của tôi hơi khác một chút: Tôi có một ứng dụng dựa trên tabbar với một số AVAudioPlayers ở các chế độ xem khác nhau. Vì lợi ích của ví dụ, hãy nói rằng chế độ xem được tải đầu tiên có 3 AVAudioPlayers, trong khi chế độ xem thứ hai có một AVAudioPlayer và một AVAudioRecorder. Tất cả chúng đều được khởi tạo trong phương thức viewDidLoad.

Máy ghi không hoạt động ở chế độ xem thứ hai. Khi tôi nhấn nút ghi âm, chế độ xem hơi bị rung và quá trình ghi không bắt đầu. Kỳ lạ, trình mô phỏng hoạt động tốt và không hiển thị cùng các triệu chứng ... (ai đó có ý tưởng tại sao?)

Sau khi nghiên cứu và đọc chủ đề này tôi đã nhận ra rằng tôi chưa đặt trình phát ở chế độ xem đầu tiên đến nil, vì vậy tôi đoán họ vẫn còn trong bộ nhớ ngăn máy ghi bắt đầu. Khi tôi đã đặt chúng thành nil trong phương thức viewDidDisappear, nó đã hoạt động trở lại.

đây là những gì giúp tôi:

-(void)viewDidDisappear:(BOOL)animated { 
    firstPlayer = nil; 
    secondPlayer = nil; 
    thirdPlayer = nil; 
} 

ViewDidUnload không giúp vì View, và do đó variablbes trong lớp mình không được bốc dỡ khi chuyển đổi quan điểm.

Hy vọng điều này cũng hữu ích cho người khác.

1

Nếu bạn cần sử dụng AVPlayer và AVAudioRecorder đồng thời làm như sau:

  1. thiết lập loại âm thanh để "chơi và ghi lại" (như mô tả ở trên hoặc với chức năng phiên âm C-based)
  2. " bản ghi "phương thức phải được gọi sau khi gọi phương thức" play "với một số độ trễ. (Tôi đặt 0.5 giây)

Nếu bạn không cung cấp, quá trình phát sẽ bắt đầu nhưng quá trình ghi sẽ không bắt đầu.

0

giải thích @Aaron Hayman là chính xác nhưng giải pháp cho tôi rất đơn giản. Chỉ cần thực hiện phương thức didFinishPlaying của người chơi ủy nhiệm và giải phóng người chơi ở đó.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 
    self.playerWord = nil; 
} 
Các vấn đề liên quan