【问题标题】:Playing video with AVPlayer and recording sound with AVAudioRecorder simultaneously使用 AVPlayer 播放视频和使用 AVAudioRecorder 同时录制声音
【发布时间】:2012-01-14 07:06:22
【问题描述】:

我在谷歌上搜索了这个问题很多天,但我没有为我的简单问题找到解决方案。

我正在尝试在录制声音的同时播放视频。在没有视频的情况下录制声音也能正常工作。并且视频在没有录制的情况下也能正常工作。

只要我将两者放在一起,录制就会抛出对声音没有反应的值,并且视频不再播放。 顺便说一句,这只发生在我的设备(iPhone 4 / iOS5)上。在模拟器中一切正常。

这是我在 ViewController 中的代码的简化版本。

// Audio Recorder

NSURL *nullUrl = [NSURL fileURLWithPath:@"/dev/null"];

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat:44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt:kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt:1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt:AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];

NSError *recorderError;
_recorder = [[AVAudioRecorder alloc] initWithURL:nullUrl settings:settings error:&recorderError];

if (_recorder)
{
    [_recorder prepareToRecord];
    _recorder.meteringEnabled = YES;
    [_recorder record];

    _levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
}


// Video Player

NSURL *url = [[NSBundle mainBundle] URLForResource:@"Video"
                                      withExtension:@"mp4"
                                       subdirectory:nil];

_avPlayer = [[AVPlayer playerWithURL:url] retain];
_avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:_avPlayer] retain];

_avPlayerLayer.frame = self.view.layer.bounds;
[self.view.layer addSublayer:_avPlayerLayer];

[_avPlayer play];

记录器只是输出一个在 levelTimerCallback 方法中读取的值。 该视频只是播放一个短视频。

我发现我必须为 AVAudioSession 设置一个类别。 如果我在应用程序启动后实现此代码,则视频正在播放,但录音机仍然输出相同的值而对声音没有反应。

NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[audioSession setActive:YES error:&error];

我可以想象我可能需要对 AudioSessionSetProperty 做一些事情

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

但这不会改变任何事情。 您知道我缺少什么或如何正确设置 AudioSession?

感谢您对此的每一个提示!

干杯, 拉斐尔 ;)

【问题讨论】:

    标签: iphone avaudioplayer avplayer recording simultaneous


    【解决方案1】:

    我遇到了同样的问题(不过我使用 AVPlayer 播放音频而不是视频)。我建议你开始监听音频路由变化,当 AVPlayer 和 AVAudioRecorder 同时启动时,你会看到路由多次变化。

    AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
                                    audioRouteChangeListenerCallback,
                                    self);
    

    在回调中打印出类别和路由(kAudioSessionProperty_AudioRoute)。我可以让音频播放和录制同时工作的唯一方法是:

    1. 音频会话为 AVAudioSessionCategoryPlayAndRecord,并且 kAudioSessionProperty_OverrideCategoryMixWithOthers 属性为 true。

    2. 我在录制之前启动了播放。调用 AVAudioRecorder prepareToRecord 后,在获得音频路由更改之前不要开始录制。即使提前开始录制也不会失败,但音频路径的更改似乎会导致录制失败。

    我尝试了其他组合,但这是唯一每次都有效的组合。

    【讨论】:

    • 嘿,这正是我的问题!实际上,我在播放第一个视频后开始录制时就开始工作了。但我想你的回调方法似乎更好!以下问题是我有几个视频要播放。每次我实例化一个新的 AVPlayer 时,记录都会停止。我的解决方法是只使用一个 AVPlayer 实例并为其提供不同的 AVPlayerItems。我想这就是我应该这样做的方式。谢谢你,拉斐尔;)
    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多