7

我有一个使用 AVPlayer 的视图控制器。这个视图控制器可以加载一个模态视图控制器,用户可以在其中使用 AVAudioRecorder 录制音频。

这就是发生的事情:

如果用户使用 [AVPLayer play] 在第一个控制器中播放合成,则 AVAudioRecorder 将不会在模态视图控制器中记录。没有错误,但 AVAudioRecorder 返回的当前时间为 0.0;

如果用户关闭模式对话框并重新加载它。AVAudioRecorder 工作正常。

这可以一遍又一遍地重复 AVAudioRecorder 在 [AVPlayer play] 调用后第一次调用时不起作用

我已经为此奋斗了好几天,只是重新组织了与 AVPlayer 和 AVAudioRecorder 相关的代码,但它仍然表现得很奇怪。

非常感谢任何帮助或指针

提前致谢

让-皮埃尔

4

7 回答 7

9

我也遇到了同样的问题,这是我找到的解决方案。

AVAudioRecord录制时,在初始化后写下这行代码:

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

然后调用record方法。

于 2012-05-09T07:48:29.003 回答
3

How are you setting the AVAudioSession's category, i.e., play or record? Try something like

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
于 2011-04-22T17:55:13.970 回答
1

我一直有同样的问题。我使用 AVPlayer 来播放作品(我之前使用 AVAudioRecord 的录音)。但是,我发现一旦我使用了 AVPlayer,我就不能再使用 AVAudioRecorder。经过一番搜索,我发现只要在内存中实例化 AVPlayer 并且至少播放过一次(通常是实例化后立即执行的操作),AVAudioRecorder 就不会录制。但是,一旦 AVPlayer 被解除分配,AVAudioRecorder 就可以再次自由录制。似乎 AVPlayer 持有 AVAudioRecorder 需要的某种连接,而且它很贪婪……除非你从它冰冷的死手上撬开它,否则它不会放手。

这是我找到的解决方案。一些人声称实例化 AVPlayer 需要花费太多时间来继续分解和设置备份。然而,事实并非如此。实例化 AVPlayer 实际上非常简单。实例化 AVPlayerItem 也是如此。重要的是加载 AVAsset (或它的任何子类)。你真的只想这样做一次。他们的关键是使用这个序列:

  1. 加载 AVAsset(例如,如果您从文件加载,则直接使用 AVURLAsset 或将其添加到 AVMutableComposition 并使用它)并保留对它的引用。在你完成之前不要放手。加载它是需要所有时间的。
  2. 一旦你准备好播放:用你的资产实例化 AVPlayerItem,然后用 AVPlayerItem 实例化 AVPlayer 并播放它。不要保留对 AVPlayerItem 的引用,AVPlayer 将保留对它的引用,并且无论如何您都不能与其他播放器重用它。
  3. 播放完毕后,立即销毁AVPlayer...释放它,将其 var 设置为 nil,无论您需要做什么。**
  4. 现在可以录制了。AVPlayer 不存在,所以 AVAudioRecorder 可以自由地做它的事情。
  5. 当您准备好再次播放时,使用您已经加载的资产和 AVPlayer 重新实例化 AVPlayerItem。同样,这是微不足道的。资产已经加载,所以不应该有延迟。

** 请注意,销毁 AVPlayer 可能需要的不仅仅是释放它并将其 var 设置为 nil。最有可能的是,您还添加了一个定期时间观察器来跟踪播放进度。当你这样做时,你会收到一个你应该抓住的不透明物体。如果您不从播放器中删除此项目并释放它/将其设置为 nil,AVPlayer 将不会解除分配。Apple 似乎故意创建了一个您必须手动中断的保留周期。因此,在销毁 AVPlayer 之前,您需要(示例):

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

作为旁注,您可能还设置了 NSNotifications(我使用一个来确定播放器何时完成播放)...不要忘记删除它们。

于 2012-05-03T14:37:47.493 回答
1

如果您需要同时使用 AVPlayer 和 AVAudioRecorder,请执行以下操作:

  1. 将音频类别设置为“播放和录制”(如上所述或使用基于 C 的音频会话功能)
  2. “记录”方法必须在调用“播放”方法后延迟一些时间。(我设置为 0.5 秒)

如果您不提供此项,将开始播放,但不会开始录制。

于 2012-07-11T13:34:01.917 回答
0

我遇到了同样的问题: AVAudioRecorder 没有开始录制。我的例子有点不同:我有一个基于标签栏的应用程序,在不同的视图中有几个 AVAudioPlayers。举例来说,假设第一个加载的视图有 3 个 AVAudioPlayer,而第二个视图有一个 AVAudioPlayer 和一个 AVAudioRecorder。它们都是在 viewDidLoad 方法中启动的。

记录器在第二个视图中没有工作。当我按下录制按钮时,视图轻微晃动,录制没有开始。奇怪的是,模拟器运行良好并且没有表现出相同的症状......(有人知道为什么吗?)

经过一些研究并阅读了这个帖子,我意识到我没有将第一个视图中的播放器设置为零,所以我猜他们仍然在内存中阻止记录器启动。一旦我在 viewDidDisappear 方法中将它们设置为 nil,它就会再次正常工作。

这对我有帮助:

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

ViewDidUnload 没有帮助,因为视图,因此类本身的变量在切换视图时没有被卸载。

希望这对其他人也有用。

于 2012-05-28T20:45:18.140 回答
0

不应该[AVAudioRecorder record];代替play吗?

于 2011-04-08T16:22:53.740 回答
0

@Aaron Hayman 的解释是准确的,但对我来说解决方案非常简单。只需实现播放器委托的 didFinishPlaying 方法并在那里释放播放器。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    self.playerWord = nil;
}
于 2014-08-27T20:18:40.487 回答